From 8bbdf787316402705370dbd9f1541e9b2f43d0fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?liming=20=E8=94=A1?= Date: Tue, 14 Jul 2026 13:55:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A1=B9=E7=9B=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 50 + HC.md | 5 + JY.Control/Base/ButtonRenderer.cs | 260 + JY.Control/Base/ColorMng.cs | 60 + JY.Control/Base/ControlHelper.cs | 82 + .../Base/LBIndustrialCtrlBase.Designer.cs | 37 + JY.Control/Base/LBIndustrialCtrlBase.cs | 249 + JY.Control/Base/LedRenderer.cs | 271 + JY.Control/Base/NativeMethods.cs | 310 + JY.Control/Base/Renderer.cs | 24 + JY.Control/Blower.cs | 402 + JY.Control/Blower.resx | 123 + JY.Control/CircleCountValue.Designer.cs | 37 + JY.Control/CircleCountValue.cs | 144 + JY.Control/CircleProgramBar.cs | 141 + JY.Control/IO_Instructions.Designer.cs | 83 + JY.Control/IO_Instructions.cs | 136 + JY.Control/IO_Instructions.resx | 120 + JY.Control/Image/list_add.png | Bin 0 -> 321 bytes JY.Control/Image/list_subtract.png | Bin 0 -> 333 bytes JY.Control/Image/tips.png | Bin 0 -> 362 bytes JY.Control/Image/下载.png | Bin 0 -> 1009 bytes JY.Control/Image/增加.png | Bin 0 -> 1209 bytes JY.Control/Image/查询.png | Bin 0 -> 878 bytes JY.Control/Image/设置.png | Bin 0 -> 494 bytes JY.Control/Image/运行中.png | Bin 0 -> 1958 bytes JY.Control/JY.Control.csproj | 167 + JY.Control/JY.Control.csproj.user | 6 + JY.Control/LBButton.Designer.cs | 37 + JY.Control/LBButton.cs | 294 + JY.Control/LBLed.Designer.cs | 53 + JY.Control/LBLed.cs | 214 + JY.Control/LBLed.resx | 123 + JY.Control/LedControl.Designer.cs | 44 + JY.Control/LedControl.cs | 426 + JY.Control/LedControl.resx | 120 + JY.Control/LogManagerControl.Designer.cs | 78 + JY.Control/LogManagerControl.cs | 182 + JY.Control/LogManagerControl.resx | 120 + JY.Control/Properties/AssemblyInfo.cs | 36 + JY.Control/Properties/Resources.Designer.cs | 143 + JY.Control/Properties/Resources.resx | 145 + JY.Control/PulseButton.Designer.cs | 36 + JY.Control/PulseButton.cs | 554 + JY.Control/RingProgramBar.cs | 141 + JY.Control/RoundButton.Designer.cs | 36 + JY.Control/RoundButton.cs | 383 + JY.Control/TextBoxWatermark.cs | 98 + JY.Control/TreeViewEx.Designer.cs | 43 + JY.Control/TreeViewEx.cs | 649 + JY.Control/TreeViewEx.resx | 123 + JY.DAL/IDbHelper.cs | 213 + JY.DAL/IocConfig.cs | 32 + JY.DAL/JY.DAL.csproj | 192 + JY.DAL/JY.DAL.csproj.user | 6 + JY.DAL/Mapper/AlarmDataMapping.cs | 22 + JY.DAL/Mapper/ProductModelMapping.cs | 22 + JY.DAL/MySQLHelper.cs | 271 + JY.DAL/OpMysqlDataBase.cs | 525 + JY.DAL/OpSqlDataBase.cs | 712 + JY.DAL/Properties/AssemblyInfo.cs | 36 + JY.DAL/Repository/DataContext.cs | 31 + JY.DAL/Repository/IRepository.cs | 42 + JY.DAL/Repository/Repository.cs | 102 + JY.DAL/Service/AlarmDataService.cs | 39 + JY.DAL/Service/BlankingDataService.cs | 26 + JY.DAL/Service/FeedingDataService.cs | 30 + JY.DAL/Service/IService.cs | 39 + JY.DAL/Service/Service.cs | 92 + JY.DAL/ServiceLocator.cs | 109 + JY.DAL/SqlHelper.cs | 345 + JY.DAL/app.config | 35 + JY.DAL/packages.config | 35 + JY.Inspection/App.config | 50 + JY.Inspection/Common/AlarmForm.cs | 31 + JY.Inspection/Common/ByteUtil.cs | 17 + JY.Inspection/Common/CSVHelper.cs | 100 + JY.Inspection/Common/CollectionUtil.cs | 26 + JY.Inspection/Common/ConnectionClient.cs | 131 + JY.Inspection/Common/DGShowMsg.cs | 10 + .../Common/DateTimeSynchronization.cs | 127 + JY.Inspection/Common/DeleteLog.cs | 120 + JY.Inspection/Common/ExcelToSQL.cs | 157 + JY.Inspection/Common/ExportXls.cs | 58 + JY.Inspection/Common/Global.cs | 40 + JY.Inspection/Common/Log4Helper.cs | 32 + JY.Inspection/Common/MessageBoxTimeOut.cs | 56 + JY.Inspection/Common/MessageTip.cs | 443 + JY.Inspection/Common/PLCAlarmParse.cs | 193 + JY.Inspection/Common/StrUtil.cs | 65 + JY.Inspection/Common/TxtHelper.cs | 68 + JY.Inspection/Common/UserHelper.cs | 296 + JY.Inspection/Config/ComConfig.ini | 66 + JY.Inspection/Config/Configure.ini | 58 + JY.Inspection/Config/PlcConfig.ini | 59 + JY.Inspection/Config/采集项参照表.xlsx | Bin 0 -> 10278 bytes JY.Inspection/EmailTemplate/Model.xls | Bin 0 -> 27136 bytes JY.Inspection/Entity/AlarmStatus.cs | 21 + JY.Inspection/Frm/FormMesDataSet.cs | 107 + JY.Inspection/Frm/FormMesDataSet.designer.cs | 713 + JY.Inspection/Frm/FormMesDataSet.resx | 200 + .../Frm/FormMesGradingSet.Designer.cs | 488 + JY.Inspection/Frm/FormMesGradingSet.cs | 402 + JY.Inspection/Frm/FormMesGradingSet.resx | 120 + .../Frm/FrmAbnormalVoice.Designer.cs | 225 + JY.Inspection/Frm/FrmAbnormalVoice.cs | 214 + JY.Inspection/Frm/FrmAbnormalVoice.resx | 120 + JY.Inspection/Frm/FrmAlamQuery.cs | 110 + JY.Inspection/Frm/FrmAlamQuery.designer.cs | 319 + JY.Inspection/Frm/FrmAlamQuery.resx | 227 + JY.Inspection/Frm/FrmAlert.Designer.cs | 101 + JY.Inspection/Frm/FrmAlert.cs | 108 + JY.Inspection/Frm/FrmAlert.resx | 123 + JY.Inspection/Frm/FrmCCDQuery.cs | 153 + JY.Inspection/Frm/FrmCCDQuery.designer.cs | 272 + JY.Inspection/Frm/FrmCCDQuery.resx | 197 + JY.Inspection/Frm/FrmChangeModel.cs | 309 + JY.Inspection/Frm/FrmChangeModel.designer.cs | 298 + JY.Inspection/Frm/FrmChangeModel.resx | 218 + JY.Inspection/Frm/FrmConfigBaseSet.cs | 173 + .../Frm/FrmConfigBaseSet.designer.cs | 226 + JY.Inspection/Frm/FrmConfigBaseSet.resx | 209 + JY.Inspection/Frm/FrmDBbaseSet.cs | 47 + JY.Inspection/Frm/FrmDBbaseSet.designer.cs | 276 + JY.Inspection/Frm/FrmDBbaseSet.resx | 197 + JY.Inspection/Frm/FrmHelper.cs | 21 + JY.Inspection/Frm/FrmHelper.designer.cs | 82 + JY.Inspection/Frm/FrmHelper.resx | 197 + JY.Inspection/Frm/FrmHistoricalDataQuery.cs | 349 + .../Frm/FrmHistoricalDataQuery.designer.cs | 386 + JY.Inspection/Frm/FrmHistoricalDataQuery.resx | 197 + JY.Inspection/Frm/FrmParaConfig.cs | 182 + JY.Inspection/Frm/FrmParaConfig.designer.cs | 263 + JY.Inspection/Frm/FrmParaConfig.resx | 203 + JY.Inspection/Frm/FrmPwd.Designer.cs | 103 + JY.Inspection/Frm/FrmPwd.cs | 42 + JY.Inspection/Frm/FrmPwd.resx | 120 + JY.Inspection/Frm/FrmStatistics.cs | 551 + JY.Inspection/Frm/FrmStatistics.designer.cs | 319 + JY.Inspection/Frm/FrmStatistics.resx | 209 + JY.Inspection/Frm/FrmTest.Designer.cs | 86 + JY.Inspection/Frm/FrmTest.cs | 54 + JY.Inspection/Frm/FrmTest.resx | 120 + JY.Inspection/Frm/ListViewBuff.cs | 36 + JY.Inspection/Frm/LoginForm.cs | 131 + JY.Inspection/Frm/LoginForm.designer.cs | 294 + JY.Inspection/Frm/LoginForm.resx | 197 + JY.Inspection/Frm/SetForm.cs | 207 + JY.Inspection/Frm/SetForm.designer.cs | 270 + JY.Inspection/Frm/SetForm.resx | 197 + JY.Inspection/HomeForm.cs | 3794 ++ JY.Inspection/HomeForm.designer.cs | 2453 ++ JY.Inspection/HomeForm.resx | 2960 ++ JY.Inspection/JY.Inspection.csproj | 492 + JY.Inspection/JY.Inspection.csproj.user | 6 + JY.Inspection/Lib/HslCommunication.dll | Bin 0 -> 2676224 bytes JY.Inspection/Lib/MetroFramework.Design.dll | Bin 0 -> 16896 bytes JY.Inspection/Lib/MetroFramework.Fonts.dll | Bin 0 -> 672256 bytes JY.Inspection/Lib/MetroFramework.dll | Bin 0 -> 353280 bytes JY.Inspection/Lib/WcleAnimationLibrary.dll | Bin 0 -> 19456 bytes ...olLibraryExtension.ComplexityPropertys.dll | Bin 0 -> 9216 bytes .../Lib/WinformControlLibraryExtension.dll | Bin 0 -> 1177088 bytes JY.Inspection/Mes/MESDataCombin.cs | 314 + JY.Inspection/Mes/MesLog.cs | 66 + JY.Inspection/MetroFramework.txt | 25 + JY.Inspection/Program.cs | 67 + JY.Inspection/Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 413 + JY.Inspection/Properties/Resources.resx | 226 + JY.Inspection/Properties/Settings.Designer.cs | 26 + JY.Inspection/Properties/Settings.settings | 7 + JY.Inspection/Resouces/LFLog.png | Bin 0 -> 15827 bytes JY.Inspection/Resouces/logo1.png | Bin 0 -> 5961 bytes JY.Inspection/Resouces/save.png | Bin 0 -> 872 bytes JY.Inspection/Resouces/串口.png | Bin 0 -> 446 bytes JY.Inspection/Resouces/主页.png | Bin 0 -> 645 bytes JY.Inspection/Resouces/云上传.png | Bin 0 -> 1157 bytes JY.Inspection/Resouces/停止.png | Bin 0 -> 985 bytes JY.Inspection/Resouces/关于.png | Bin 0 -> 936 bytes JY.Inspection/Resouces/切换.png | Bin 0 -> 681 bytes JY.Inspection/Resouces/切换1.png | Bin 0 -> 546 bytes JY.Inspection/Resouces/图表.png | Bin 0 -> 737 bytes JY.Inspection/Resouces/存储设备.png | Bin 0 -> 854 bytes JY.Inspection/Resouces/数据查询.png | Bin 0 -> 577 bytes JY.Inspection/Resouces/查询.png | Bin 0 -> 878 bytes JY.Inspection/Resouces/模块.png | Bin 0 -> 1002 bytes JY.Inspection/Resouces/清空 (1).png | Bin 0 -> 1588 bytes JY.Inspection/Resouces/用户.png | Bin 0 -> 917 bytes JY.Inspection/Resouces/用户管理.png | Bin 0 -> 793 bytes JY.Inspection/Resouces/登录.png | Bin 0 -> 3367 bytes JY.Inspection/Resouces/系统构建.png | Bin 0 -> 832 bytes JY.Inspection/Resouces/系统设置.png | Bin 0 -> 888 bytes JY.Inspection/Resouces/维修.png | Bin 0 -> 826 bytes JY.Inspection/Resouces/设置.png | Bin 0 -> 828 bytes JY.Inspection/Resouces/运行.png | Bin 0 -> 1223 bytes JY.Inspection/Resouces/运行中.png | Bin 0 -> 1958 bytes JY.Inspection/Resources/inlogo.png | Bin 0 -> 5826 bytes JY.Inspection/Resources/yiweidongli.png | Bin 0 -> 12576 bytes JY.Inspection/Resources/三角感叹号32.png | Bin 0 -> 559 bytes .../Resources/导入数据_操作_jurassic.png | Bin 0 -> 718 bytes JY.Inspection/Resources/报警记录.png | Bin 0 -> 6864 bytes JY.Inspection/Resources/数据导入.png | Bin 0 -> 972 bytes JY.Inspection/Resources/白色X32.png | Bin 0 -> 604 bytes JY.Inspection/Resources/白色勾48.png | Bin 0 -> 898 bytes JY.Inspection/Resources/白色感叹号32.png | Bin 0 -> 594 bytes JY.Inspection/Resources/设备报警.png | Bin 0 -> 8796 bytes JY.Inspection/Resources/错误提示图标32.png | Bin 0 -> 1073 bytes JY.Inspection/ViewModel/FrmMesSettingVM.cs | 60 + JY.Inspection/appini.manifest | 75 + JY.Inspection/log4net.xml | 32444 ++++++++++++++++ JY.Inspection/packages.config | 31 + JY.Inspection/外观检测.ico | Bin 0 -> 67646 bytes JY.MES/Entity/CheckBarcodeParam.cs | 58 + JY.MES/Entity/CheckBarcodeResult.cs | 29 + JY.MES/Entity/EqpStatusParam.cs | 44 + JY.MES/Entity/EqpStatusResult.cs | 28 + JY.MES/Entity/UploadAlarmParam.cs | 48 + JY.MES/Entity/UploadAlarmResult.cs | 28 + JY.MES/Entity/UploadTestDataParam.cs | 421 + JY.MES/Entity/UploadTestDataResult.cs | 28 + JY.MES/FMS/FMS_Alarm.cs | 56 + JY.MES/FMS/FMS_Materialln.cs | 32 + JY.MES/FMS/FMS_Status.cs | 44 + JY.MES/FMS/MesHelper_EVE.cs | 529 + JY.MES/FMS/MesRequestAndRespondParam.cs | 564 + JY.MES/FMS/MesReturnParam.cs | 24 + JY.MES/FMS/Model/FMS_In.cs | 32 + JY.MES/FMS/Model/FMS_Out.cs | 101 + JY.MES/JY.MES.csproj | 87 + JY.MES/MES/GradingParam.cs | 55 + JY.MES/MES/ProductResultParameters.cs | 118 + JY.MES/MES/ReqArrivalStation.cs | 50 + JY.MES/MES/ReqExitStation.cs | 72 + JY.MES/MES/RespArrivalStation.cs | 34 + JY.MES/MES/RespExitStation.cs | 15 + JY.MES/MESApiHelper.cs | 41 + JY.MES/MesResponse.cs | 65 + JY.MES/Properties/AssemblyInfo.cs | 36 + JY.MES/app.config | 19 + JY.MES/packages.config | 5 + JY.Model/BL.Entity/Chart24HourData.cs | 35 + JY.Model/BL.Entity/RequestResult.cs | 42 + JY.Model/DB.Entity/AbnormalVoice.cs | 29 + JY.Model/DB.Entity/AlarmData.cs | 73 + JY.Model/DB.Entity/BlankingData.cs | 200 + JY.Model/DB.Entity/CamInfor.cs | 130 + JY.Model/DB.Entity/ChartDataType.cs | 23 + JY.Model/DB.Entity/FeedingData.cs | 45 + JY.Model/DB.Entity/HourprodEntity.cs | 34 + JY.Model/DB.Entity/PLCConfigBase.cs | 28 + JY.Model/DB.Entity/PLCConfigPara.cs | 41 + JY.Model/DB.Entity/ParaRange.cs | 175 + JY.Model/DB.Entity/ProductModel.cs | 24 + JY.Model/DB.Entity/ProductPara.cs | 37 + JY.Model/DB.Entity/ProductParaBase.cs | 24 + JY.Model/DB.Entity/SystemConfig.cs | 110 + JY.Model/DB.Entity/TrayTestEntry.cs | 33 + JY.Model/Excel/CollectItemCfg.cs | 35 + JY.Model/JY.Model.csproj | 96 + JY.Model/Properties/AssemblyInfo.cs | 36 + JY.Model/app.config | 19 + JY.Model/packages.config | 10 + JY.Utility/CSVHelper.cs | 39 + JY.Utility/ChartHelper.cs | 132 + JY.Utility/ConvertHelper.cs | 54 + JY.Utility/CustomAttributeHelper.cs | 115 + JY.Utility/DataList.cs | 99 + JY.Utility/EPPlusExcelHelper.cs | 379 + JY.Utility/ExcelImporter.cs | 92 + JY.Utility/IniFileHelper.cs | 79 + JY.Utility/JY.Utility.csproj | 126 + JY.Utility/JY.Utility.csproj.user | 6 + JY.Utility/LogHelper.cs | 389 + JY.Utility/OpenOfficeXML.cs | 259 + JY.Utility/Properties/AssemblyInfo.cs | 36 + JY.Utility/TxtHelper.cs | 68 + JY.Utility/app.config | 23 + JY.Utility/packages.config | 22 + PLCCommunication/App.config | 6 + PLCCommunication/Common/DemoUtils.cs | 103 + PLCCommunication/Common/IniHelper.cs | 60 + PLCCommunication/Entity/DataFormatType.cs | 29 + PLCCommunication/Entity/PLCConfig.cs | 59 + PLCCommunication/Entity/TriggerParams.cs | 33 + PLCCommunication/Entity/VarType.cs | 20 + PLCCommunication/FrmOmronPLCCom.Designer.cs | 86 + PLCCommunication/FrmOmronPLCCom.cs | 217 + PLCCommunication/FrmOmronPLCCom.resx | 120 + PLCCommunication/OmronPLCUI.Designer.cs | 848 + PLCCommunication/OmronPLCUI.cs | 1472 + PLCCommunication/OmronPLCUI.resx | 173 + PLCCommunication/PLCCommunication.csproj | 118 + PLCCommunication/PLCCommunication.csproj.user | 6 + PLCCommunication/Program.cs | 22 + PLCCommunication/Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 83 + PLCCommunication/Properties/Resources.resx | 127 + .../Properties/Settings.Designer.cs | 26 + PLCCommunication/Properties/Settings.settings | 7 + PLCCommunication/Resources/green.png | Bin 0 -> 1501 bytes PLCCommunication/Resources/red.png | Bin 0 -> 2320 bytes PLCCommunication/TriggerUI.Designer.cs | 297 + PLCCommunication/TriggerUI.cs | 120 + PLCCommunication/TriggerUI.resx | 120 + README.en.md | 36 + README.md | 39 + S1270.sln | 149 + SimpleServer/Client.cs | 279 + SimpleServer/ComConfig.cs | 76 + SimpleServer/CommonHelper.cs | 13 + SimpleServer/CommunUI.Designer.cs | 907 + SimpleServer/CommunUI.cs | 1384 + SimpleServer/CommunUI.resx | 123 + SimpleServer/FrmCommunication.Designer.cs | 93 + SimpleServer/FrmCommunication.cs | 238 + SimpleServer/FrmCommunication.resx | 123 + SimpleServer/IniHelper.cs | 59 + SimpleServer/LogHelper.cs | 73 + SimpleServer/Program.cs | 31 + SimpleServer/Properties/AssemblyInfo.cs | 36 + SimpleServer/Properties/Resources.Designer.cs | 63 + SimpleServer/Properties/Resources.resx | 117 + SimpleServer/Properties/Settings.Designer.cs | 26 + SimpleServer/Properties/Settings.settings | 7 + SimpleServer/Serial.cs | 239 + SimpleServer/Server.cs | 272 + SimpleServer/SimpleCommunication.csproj | 147 + SimpleServer/SimpleCommunication.csproj.user | 6 + SimpleServer/StringBox.cs | 18 + SimpleServer/app.config | 3 + SocketHelper/DelegateHelper.cs | 37 + SocketHelper/Properties/AssemblyInfo.cs | 36 + SocketHelper/SocketHelper.csproj | 53 + SocketHelper/TCPClient.cs | 256 + 数据库/S1319.sql | Bin 0 -> 23022 bytes 335 files changed, 81415 insertions(+) create mode 100644 .gitignore create mode 100644 HC.md create mode 100644 JY.Control/Base/ButtonRenderer.cs create mode 100644 JY.Control/Base/ColorMng.cs create mode 100644 JY.Control/Base/ControlHelper.cs create mode 100644 JY.Control/Base/LBIndustrialCtrlBase.Designer.cs create mode 100644 JY.Control/Base/LBIndustrialCtrlBase.cs create mode 100644 JY.Control/Base/LedRenderer.cs create mode 100644 JY.Control/Base/NativeMethods.cs create mode 100644 JY.Control/Base/Renderer.cs create mode 100644 JY.Control/Blower.cs create mode 100644 JY.Control/Blower.resx create mode 100644 JY.Control/CircleCountValue.Designer.cs create mode 100644 JY.Control/CircleCountValue.cs create mode 100644 JY.Control/CircleProgramBar.cs create mode 100644 JY.Control/IO_Instructions.Designer.cs create mode 100644 JY.Control/IO_Instructions.cs create mode 100644 JY.Control/IO_Instructions.resx create mode 100644 JY.Control/Image/list_add.png create mode 100644 JY.Control/Image/list_subtract.png create mode 100644 JY.Control/Image/tips.png create mode 100644 JY.Control/Image/下载.png create mode 100644 JY.Control/Image/增加.png create mode 100644 JY.Control/Image/查询.png create mode 100644 JY.Control/Image/设置.png create mode 100644 JY.Control/Image/运行中.png create mode 100644 JY.Control/JY.Control.csproj create mode 100644 JY.Control/JY.Control.csproj.user create mode 100644 JY.Control/LBButton.Designer.cs create mode 100644 JY.Control/LBButton.cs create mode 100644 JY.Control/LBLed.Designer.cs create mode 100644 JY.Control/LBLed.cs create mode 100644 JY.Control/LBLed.resx create mode 100644 JY.Control/LedControl.Designer.cs create mode 100644 JY.Control/LedControl.cs create mode 100644 JY.Control/LedControl.resx create mode 100644 JY.Control/LogManagerControl.Designer.cs create mode 100644 JY.Control/LogManagerControl.cs create mode 100644 JY.Control/LogManagerControl.resx create mode 100644 JY.Control/Properties/AssemblyInfo.cs create mode 100644 JY.Control/Properties/Resources.Designer.cs create mode 100644 JY.Control/Properties/Resources.resx create mode 100644 JY.Control/PulseButton.Designer.cs create mode 100644 JY.Control/PulseButton.cs create mode 100644 JY.Control/RingProgramBar.cs create mode 100644 JY.Control/RoundButton.Designer.cs create mode 100644 JY.Control/RoundButton.cs create mode 100644 JY.Control/TextBoxWatermark.cs create mode 100644 JY.Control/TreeViewEx.Designer.cs create mode 100644 JY.Control/TreeViewEx.cs create mode 100644 JY.Control/TreeViewEx.resx create mode 100644 JY.DAL/IDbHelper.cs create mode 100644 JY.DAL/IocConfig.cs create mode 100644 JY.DAL/JY.DAL.csproj create mode 100644 JY.DAL/JY.DAL.csproj.user create mode 100644 JY.DAL/Mapper/AlarmDataMapping.cs create mode 100644 JY.DAL/Mapper/ProductModelMapping.cs create mode 100644 JY.DAL/MySQLHelper.cs create mode 100644 JY.DAL/OpMysqlDataBase.cs create mode 100644 JY.DAL/OpSqlDataBase.cs create mode 100644 JY.DAL/Properties/AssemblyInfo.cs create mode 100644 JY.DAL/Repository/DataContext.cs create mode 100644 JY.DAL/Repository/IRepository.cs create mode 100644 JY.DAL/Repository/Repository.cs create mode 100644 JY.DAL/Service/AlarmDataService.cs create mode 100644 JY.DAL/Service/BlankingDataService.cs create mode 100644 JY.DAL/Service/FeedingDataService.cs create mode 100644 JY.DAL/Service/IService.cs create mode 100644 JY.DAL/Service/Service.cs create mode 100644 JY.DAL/ServiceLocator.cs create mode 100644 JY.DAL/SqlHelper.cs create mode 100644 JY.DAL/app.config create mode 100644 JY.DAL/packages.config create mode 100644 JY.Inspection/App.config create mode 100644 JY.Inspection/Common/AlarmForm.cs create mode 100644 JY.Inspection/Common/ByteUtil.cs create mode 100644 JY.Inspection/Common/CSVHelper.cs create mode 100644 JY.Inspection/Common/CollectionUtil.cs create mode 100644 JY.Inspection/Common/ConnectionClient.cs create mode 100644 JY.Inspection/Common/DGShowMsg.cs create mode 100644 JY.Inspection/Common/DateTimeSynchronization.cs create mode 100644 JY.Inspection/Common/DeleteLog.cs create mode 100644 JY.Inspection/Common/ExcelToSQL.cs create mode 100644 JY.Inspection/Common/ExportXls.cs create mode 100644 JY.Inspection/Common/Global.cs create mode 100644 JY.Inspection/Common/Log4Helper.cs create mode 100644 JY.Inspection/Common/MessageBoxTimeOut.cs create mode 100644 JY.Inspection/Common/MessageTip.cs create mode 100644 JY.Inspection/Common/PLCAlarmParse.cs create mode 100644 JY.Inspection/Common/StrUtil.cs create mode 100644 JY.Inspection/Common/TxtHelper.cs create mode 100644 JY.Inspection/Common/UserHelper.cs create mode 100644 JY.Inspection/Config/ComConfig.ini create mode 100644 JY.Inspection/Config/Configure.ini create mode 100644 JY.Inspection/Config/PlcConfig.ini create mode 100644 JY.Inspection/Config/采集项参照表.xlsx create mode 100644 JY.Inspection/EmailTemplate/Model.xls create mode 100644 JY.Inspection/Entity/AlarmStatus.cs create mode 100644 JY.Inspection/Frm/FormMesDataSet.cs create mode 100644 JY.Inspection/Frm/FormMesDataSet.designer.cs create mode 100644 JY.Inspection/Frm/FormMesDataSet.resx create mode 100644 JY.Inspection/Frm/FormMesGradingSet.Designer.cs create mode 100644 JY.Inspection/Frm/FormMesGradingSet.cs create mode 100644 JY.Inspection/Frm/FormMesGradingSet.resx create mode 100644 JY.Inspection/Frm/FrmAbnormalVoice.Designer.cs create mode 100644 JY.Inspection/Frm/FrmAbnormalVoice.cs create mode 100644 JY.Inspection/Frm/FrmAbnormalVoice.resx create mode 100644 JY.Inspection/Frm/FrmAlamQuery.cs create mode 100644 JY.Inspection/Frm/FrmAlamQuery.designer.cs create mode 100644 JY.Inspection/Frm/FrmAlamQuery.resx create mode 100644 JY.Inspection/Frm/FrmAlert.Designer.cs create mode 100644 JY.Inspection/Frm/FrmAlert.cs create mode 100644 JY.Inspection/Frm/FrmAlert.resx create mode 100644 JY.Inspection/Frm/FrmCCDQuery.cs create mode 100644 JY.Inspection/Frm/FrmCCDQuery.designer.cs create mode 100644 JY.Inspection/Frm/FrmCCDQuery.resx create mode 100644 JY.Inspection/Frm/FrmChangeModel.cs create mode 100644 JY.Inspection/Frm/FrmChangeModel.designer.cs create mode 100644 JY.Inspection/Frm/FrmChangeModel.resx create mode 100644 JY.Inspection/Frm/FrmConfigBaseSet.cs create mode 100644 JY.Inspection/Frm/FrmConfigBaseSet.designer.cs create mode 100644 JY.Inspection/Frm/FrmConfigBaseSet.resx create mode 100644 JY.Inspection/Frm/FrmDBbaseSet.cs create mode 100644 JY.Inspection/Frm/FrmDBbaseSet.designer.cs create mode 100644 JY.Inspection/Frm/FrmDBbaseSet.resx create mode 100644 JY.Inspection/Frm/FrmHelper.cs create mode 100644 JY.Inspection/Frm/FrmHelper.designer.cs create mode 100644 JY.Inspection/Frm/FrmHelper.resx create mode 100644 JY.Inspection/Frm/FrmHistoricalDataQuery.cs create mode 100644 JY.Inspection/Frm/FrmHistoricalDataQuery.designer.cs create mode 100644 JY.Inspection/Frm/FrmHistoricalDataQuery.resx create mode 100644 JY.Inspection/Frm/FrmParaConfig.cs create mode 100644 JY.Inspection/Frm/FrmParaConfig.designer.cs create mode 100644 JY.Inspection/Frm/FrmParaConfig.resx create mode 100644 JY.Inspection/Frm/FrmPwd.Designer.cs create mode 100644 JY.Inspection/Frm/FrmPwd.cs create mode 100644 JY.Inspection/Frm/FrmPwd.resx create mode 100644 JY.Inspection/Frm/FrmStatistics.cs create mode 100644 JY.Inspection/Frm/FrmStatistics.designer.cs create mode 100644 JY.Inspection/Frm/FrmStatistics.resx create mode 100644 JY.Inspection/Frm/FrmTest.Designer.cs create mode 100644 JY.Inspection/Frm/FrmTest.cs create mode 100644 JY.Inspection/Frm/FrmTest.resx create mode 100644 JY.Inspection/Frm/ListViewBuff.cs create mode 100644 JY.Inspection/Frm/LoginForm.cs create mode 100644 JY.Inspection/Frm/LoginForm.designer.cs create mode 100644 JY.Inspection/Frm/LoginForm.resx create mode 100644 JY.Inspection/Frm/SetForm.cs create mode 100644 JY.Inspection/Frm/SetForm.designer.cs create mode 100644 JY.Inspection/Frm/SetForm.resx create mode 100644 JY.Inspection/HomeForm.cs create mode 100644 JY.Inspection/HomeForm.designer.cs create mode 100644 JY.Inspection/HomeForm.resx create mode 100644 JY.Inspection/JY.Inspection.csproj create mode 100644 JY.Inspection/JY.Inspection.csproj.user create mode 100644 JY.Inspection/Lib/HslCommunication.dll create mode 100644 JY.Inspection/Lib/MetroFramework.Design.dll create mode 100644 JY.Inspection/Lib/MetroFramework.Fonts.dll create mode 100644 JY.Inspection/Lib/MetroFramework.dll create mode 100644 JY.Inspection/Lib/WcleAnimationLibrary.dll create mode 100644 JY.Inspection/Lib/WinformControlLibraryExtension.ComplexityPropertys.dll create mode 100644 JY.Inspection/Lib/WinformControlLibraryExtension.dll create mode 100644 JY.Inspection/Mes/MESDataCombin.cs create mode 100644 JY.Inspection/Mes/MesLog.cs create mode 100644 JY.Inspection/MetroFramework.txt create mode 100644 JY.Inspection/Program.cs create mode 100644 JY.Inspection/Properties/AssemblyInfo.cs create mode 100644 JY.Inspection/Properties/Resources.Designer.cs create mode 100644 JY.Inspection/Properties/Resources.resx create mode 100644 JY.Inspection/Properties/Settings.Designer.cs create mode 100644 JY.Inspection/Properties/Settings.settings create mode 100644 JY.Inspection/Resouces/LFLog.png create mode 100644 JY.Inspection/Resouces/logo1.png create mode 100644 JY.Inspection/Resouces/save.png create mode 100644 JY.Inspection/Resouces/串口.png create mode 100644 JY.Inspection/Resouces/主页.png create mode 100644 JY.Inspection/Resouces/云上传.png create mode 100644 JY.Inspection/Resouces/停止.png create mode 100644 JY.Inspection/Resouces/关于.png create mode 100644 JY.Inspection/Resouces/切换.png create mode 100644 JY.Inspection/Resouces/切换1.png create mode 100644 JY.Inspection/Resouces/图表.png create mode 100644 JY.Inspection/Resouces/存储设备.png create mode 100644 JY.Inspection/Resouces/数据查询.png create mode 100644 JY.Inspection/Resouces/查询.png create mode 100644 JY.Inspection/Resouces/模块.png create mode 100644 JY.Inspection/Resouces/清空 (1).png create mode 100644 JY.Inspection/Resouces/用户.png create mode 100644 JY.Inspection/Resouces/用户管理.png create mode 100644 JY.Inspection/Resouces/登录.png create mode 100644 JY.Inspection/Resouces/系统构建.png create mode 100644 JY.Inspection/Resouces/系统设置.png create mode 100644 JY.Inspection/Resouces/维修.png create mode 100644 JY.Inspection/Resouces/设置.png create mode 100644 JY.Inspection/Resouces/运行.png create mode 100644 JY.Inspection/Resouces/运行中.png create mode 100644 JY.Inspection/Resources/inlogo.png create mode 100644 JY.Inspection/Resources/yiweidongli.png create mode 100644 JY.Inspection/Resources/三角感叹号32.png create mode 100644 JY.Inspection/Resources/导入数据_操作_jurassic.png create mode 100644 JY.Inspection/Resources/报警记录.png create mode 100644 JY.Inspection/Resources/数据导入.png create mode 100644 JY.Inspection/Resources/白色X32.png create mode 100644 JY.Inspection/Resources/白色勾48.png create mode 100644 JY.Inspection/Resources/白色感叹号32.png create mode 100644 JY.Inspection/Resources/设备报警.png create mode 100644 JY.Inspection/Resources/错误提示图标32.png create mode 100644 JY.Inspection/ViewModel/FrmMesSettingVM.cs create mode 100644 JY.Inspection/appini.manifest create mode 100644 JY.Inspection/log4net.xml create mode 100644 JY.Inspection/packages.config create mode 100644 JY.Inspection/外观检测.ico create mode 100644 JY.MES/Entity/CheckBarcodeParam.cs create mode 100644 JY.MES/Entity/CheckBarcodeResult.cs create mode 100644 JY.MES/Entity/EqpStatusParam.cs create mode 100644 JY.MES/Entity/EqpStatusResult.cs create mode 100644 JY.MES/Entity/UploadAlarmParam.cs create mode 100644 JY.MES/Entity/UploadAlarmResult.cs create mode 100644 JY.MES/Entity/UploadTestDataParam.cs create mode 100644 JY.MES/Entity/UploadTestDataResult.cs create mode 100644 JY.MES/FMS/FMS_Alarm.cs create mode 100644 JY.MES/FMS/FMS_Materialln.cs create mode 100644 JY.MES/FMS/FMS_Status.cs create mode 100644 JY.MES/FMS/MesHelper_EVE.cs create mode 100644 JY.MES/FMS/MesRequestAndRespondParam.cs create mode 100644 JY.MES/FMS/MesReturnParam.cs create mode 100644 JY.MES/FMS/Model/FMS_In.cs create mode 100644 JY.MES/FMS/Model/FMS_Out.cs create mode 100644 JY.MES/JY.MES.csproj create mode 100644 JY.MES/MES/GradingParam.cs create mode 100644 JY.MES/MES/ProductResultParameters.cs create mode 100644 JY.MES/MES/ReqArrivalStation.cs create mode 100644 JY.MES/MES/ReqExitStation.cs create mode 100644 JY.MES/MES/RespArrivalStation.cs create mode 100644 JY.MES/MES/RespExitStation.cs create mode 100644 JY.MES/MESApiHelper.cs create mode 100644 JY.MES/MesResponse.cs create mode 100644 JY.MES/Properties/AssemblyInfo.cs create mode 100644 JY.MES/app.config create mode 100644 JY.MES/packages.config create mode 100644 JY.Model/BL.Entity/Chart24HourData.cs create mode 100644 JY.Model/BL.Entity/RequestResult.cs create mode 100644 JY.Model/DB.Entity/AbnormalVoice.cs create mode 100644 JY.Model/DB.Entity/AlarmData.cs create mode 100644 JY.Model/DB.Entity/BlankingData.cs create mode 100644 JY.Model/DB.Entity/CamInfor.cs create mode 100644 JY.Model/DB.Entity/ChartDataType.cs create mode 100644 JY.Model/DB.Entity/FeedingData.cs create mode 100644 JY.Model/DB.Entity/HourprodEntity.cs create mode 100644 JY.Model/DB.Entity/PLCConfigBase.cs create mode 100644 JY.Model/DB.Entity/PLCConfigPara.cs create mode 100644 JY.Model/DB.Entity/ParaRange.cs create mode 100644 JY.Model/DB.Entity/ProductModel.cs create mode 100644 JY.Model/DB.Entity/ProductPara.cs create mode 100644 JY.Model/DB.Entity/ProductParaBase.cs create mode 100644 JY.Model/DB.Entity/SystemConfig.cs create mode 100644 JY.Model/DB.Entity/TrayTestEntry.cs create mode 100644 JY.Model/Excel/CollectItemCfg.cs create mode 100644 JY.Model/JY.Model.csproj create mode 100644 JY.Model/Properties/AssemblyInfo.cs create mode 100644 JY.Model/app.config create mode 100644 JY.Model/packages.config create mode 100644 JY.Utility/CSVHelper.cs create mode 100644 JY.Utility/ChartHelper.cs create mode 100644 JY.Utility/ConvertHelper.cs create mode 100644 JY.Utility/CustomAttributeHelper.cs create mode 100644 JY.Utility/DataList.cs create mode 100644 JY.Utility/EPPlusExcelHelper.cs create mode 100644 JY.Utility/ExcelImporter.cs create mode 100644 JY.Utility/IniFileHelper.cs create mode 100644 JY.Utility/JY.Utility.csproj create mode 100644 JY.Utility/JY.Utility.csproj.user create mode 100644 JY.Utility/LogHelper.cs create mode 100644 JY.Utility/OpenOfficeXML.cs create mode 100644 JY.Utility/Properties/AssemblyInfo.cs create mode 100644 JY.Utility/TxtHelper.cs create mode 100644 JY.Utility/app.config create mode 100644 JY.Utility/packages.config create mode 100644 PLCCommunication/App.config create mode 100644 PLCCommunication/Common/DemoUtils.cs create mode 100644 PLCCommunication/Common/IniHelper.cs create mode 100644 PLCCommunication/Entity/DataFormatType.cs create mode 100644 PLCCommunication/Entity/PLCConfig.cs create mode 100644 PLCCommunication/Entity/TriggerParams.cs create mode 100644 PLCCommunication/Entity/VarType.cs create mode 100644 PLCCommunication/FrmOmronPLCCom.Designer.cs create mode 100644 PLCCommunication/FrmOmronPLCCom.cs create mode 100644 PLCCommunication/FrmOmronPLCCom.resx create mode 100644 PLCCommunication/OmronPLCUI.Designer.cs create mode 100644 PLCCommunication/OmronPLCUI.cs create mode 100644 PLCCommunication/OmronPLCUI.resx create mode 100644 PLCCommunication/PLCCommunication.csproj create mode 100644 PLCCommunication/PLCCommunication.csproj.user create mode 100644 PLCCommunication/Program.cs create mode 100644 PLCCommunication/Properties/AssemblyInfo.cs create mode 100644 PLCCommunication/Properties/Resources.Designer.cs create mode 100644 PLCCommunication/Properties/Resources.resx create mode 100644 PLCCommunication/Properties/Settings.Designer.cs create mode 100644 PLCCommunication/Properties/Settings.settings create mode 100644 PLCCommunication/Resources/green.png create mode 100644 PLCCommunication/Resources/red.png create mode 100644 PLCCommunication/TriggerUI.Designer.cs create mode 100644 PLCCommunication/TriggerUI.cs create mode 100644 PLCCommunication/TriggerUI.resx create mode 100644 README.en.md create mode 100644 README.md create mode 100644 S1270.sln create mode 100644 SimpleServer/Client.cs create mode 100644 SimpleServer/ComConfig.cs create mode 100644 SimpleServer/CommonHelper.cs create mode 100644 SimpleServer/CommunUI.Designer.cs create mode 100644 SimpleServer/CommunUI.cs create mode 100644 SimpleServer/CommunUI.resx create mode 100644 SimpleServer/FrmCommunication.Designer.cs create mode 100644 SimpleServer/FrmCommunication.cs create mode 100644 SimpleServer/FrmCommunication.resx create mode 100644 SimpleServer/IniHelper.cs create mode 100644 SimpleServer/LogHelper.cs create mode 100644 SimpleServer/Program.cs create mode 100644 SimpleServer/Properties/AssemblyInfo.cs create mode 100644 SimpleServer/Properties/Resources.Designer.cs create mode 100644 SimpleServer/Properties/Resources.resx create mode 100644 SimpleServer/Properties/Settings.Designer.cs create mode 100644 SimpleServer/Properties/Settings.settings create mode 100644 SimpleServer/Serial.cs create mode 100644 SimpleServer/Server.cs create mode 100644 SimpleServer/SimpleCommunication.csproj create mode 100644 SimpleServer/SimpleCommunication.csproj.user create mode 100644 SimpleServer/StringBox.cs create mode 100644 SimpleServer/app.config create mode 100644 SocketHelper/DelegateHelper.cs create mode 100644 SocketHelper/Properties/AssemblyInfo.cs create mode 100644 SocketHelper/SocketHelper.csproj create mode 100644 SocketHelper/TCPClient.cs create mode 100644 数据库/S1319.sql diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..511e45d --- /dev/null +++ b/.gitignore @@ -0,0 +1,50 @@ +################################################################################ +# 此 .gitignore 文件已由 Microsoft(R) Visual Studio 自动创建。 +################################################################################ + +/.vs +/SocketHelper/obj/Debug +/SocketHelper/obj/Release +/SimpleServer/obj/x86 +/PLCCommunication/obj/Debug +/JY.Control/obj +/JY.Utility/obj +/PLCCommunication/obj/Release +/SimpleServer/obj +/JY.Model/obj/Release +/JY.MES/obj/Release +/JY.MES/obj/Debug +/JY.DAL/bin/Debug +/JY.DAL/obj/Debug +/JY.Inspection/bin/Debug +/JY.Control/bin/Debug +/JY.MES/bin/Debug +/JY.Model/bin/Debug +/JY.Utility/bin/Debug +/packages/BouncyCastle.Cryptography.2.4.0 +/packages +/PLCCommunication/bin/Debug +/SimpleServer/bin/Debug +/SocketHelper/bin/Debug +/JY.Model/obj/Debug +/JY.Inspection/obj/Debug +/JY.Inspection/obj/Release +/JY.Inspection/bin/Debug.rar + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ +/JY.DAL/obj/Release/JY.DAL.csproj.AssemblyReference.cache +/JY.Inspection/obj/Debug/JY.Inspection.csproj.AssemblyReference.cache diff --git a/HC.md b/HC.md new file mode 100644 index 0000000..e9d0cb5 --- /dev/null +++ b/HC.md @@ -0,0 +1,5 @@ + +# 数据读取流程 +ReceiveEvent += OmronRegEvent_Job1 + +(81, 282) \ No newline at end of file diff --git a/JY.Control/Base/ButtonRenderer.cs b/JY.Control/Base/ButtonRenderer.cs new file mode 100644 index 0000000..8668c7c --- /dev/null +++ b/JY.Control/Base/ButtonRenderer.cs @@ -0,0 +1,260 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JYControl +{ + /// + /// Base class for the button renderers + /// + public class LBButtonRenderer : LBRendererBase + { + #region (* Variables *) + protected RectangleF rectCtrl; + protected RectangleF rectBody; + protected RectangleF rectText; + protected float drawRatio = 1.0F; + #endregion + + #region (* Constructor *) + public LBButtonRenderer() + { + this.rectCtrl = new RectangleF(0, 0, 0, 0); + } + #endregion + + #region (* Overrided methods *) + /// + /// Update the rectangles for drawing + /// + /// + public override bool Update() + { + // Check Button object + if (this.Button == null) + throw new NullReferenceException("Invalid 'Button' object"); + + // Control rectangle + this.rectCtrl.X = 0; + this.rectCtrl.Y = 0; + this.rectCtrl.Width = this.Button.Width; + this.rectCtrl.Height = this.Button.Height; + + if (this.Button.Style == LBButton.ButtonStyle.Circular) + { + if (rectCtrl.Width < rectCtrl.Height) + rectCtrl.Height = rectCtrl.Width; + else if (rectCtrl.Width > rectCtrl.Height) + rectCtrl.Width = rectCtrl.Height; + + if (rectCtrl.Width < 10) + rectCtrl.Width = 10; + if (rectCtrl.Height < 10) + rectCtrl.Height = 10; + } + + this.rectBody = this.rectCtrl; + this.rectBody.Width -= 1; + this.rectBody.Height -= 1; + + this.rectText = this.rectCtrl; + this.rectText.Width -= 2; + this.rectText.Height -= 2; + + // Calculate ratio + drawRatio = (Math.Min(rectCtrl.Width, rectCtrl.Height)) / 200; + if (drawRatio == 0.0) + drawRatio = 1; + + return true; + } + + /// + /// Draw the button object + /// + /// + public override void Draw(Graphics Gr) + { + if (Gr == null) + throw new ArgumentNullException("Gr", "Invalid Graphics object"); + + if (this.Button == null) + throw new NullReferenceException("Invalid 'Button' object"); + + this.DrawBackground(Gr, this.rectCtrl); + this.DrawBody(Gr, this.rectBody); + this.DrawText(Gr, this.rectText); + } + #endregion + + #region (* Properies *) + /// + /// Get the associated button object + /// + public LBButton Button + { + get { return this.Control as LBButton; } + } + #endregion + + #region (* Virtual method *) + /// + /// Draw the background of the control + /// + /// + /// + /// + public virtual bool DrawBackground(Graphics Gr, RectangleF rc) + { + if (this.Button == null) + return false; + + Color c = this.Button.BackColor; + SolidBrush br = new SolidBrush(c); + Pen pen = new Pen(c); + + Rectangle _rcTmp = new Rectangle(0, 0, this.Button.Width, this.Button.Height); + Gr.DrawRectangle(pen, _rcTmp); + Gr.FillRectangle(br, rc); + + br.Dispose(); + pen.Dispose(); + + return true; + } + + /// + /// Draw the body of the control + /// + /// + /// + /// + public virtual bool DrawBody(Graphics Gr, RectangleF rc) + { + if (this.Button == null) + return false; + + Color bodyColor = this.Button.ButtonColor; + Color cDark = LBColorManager.StepColor(bodyColor, 20); + + LinearGradientBrush br1 = new LinearGradientBrush(rc, + bodyColor, + cDark, + 45); + + if ((this.Button.Style == LBButton.ButtonStyle.Circular) || + (this.Button.Style == LBButton.ButtonStyle.Elliptical)) + { + Gr.FillEllipse(br1, rc); + } + else + { + GraphicsPath path = this.RoundedRect(rc, 15F); + Gr.FillPath(br1, path); + path.Dispose(); + } + + if (this.Button.State == LBButton.ButtonState.Pressed) + { + RectangleF _rc = rc; + _rc.Inflate(-15F * this.drawRatio, -15F * drawRatio); + LinearGradientBrush br2 = new LinearGradientBrush(_rc, + cDark, + bodyColor, + 45); + if ((this.Button.Style == LBButton.ButtonStyle.Circular) || + (this.Button.Style == LBButton.ButtonStyle.Elliptical)) + { + Gr.FillEllipse(br2, _rc); + } + else + { + GraphicsPath path = this.RoundedRect(_rc, 10F); + Gr.FillPath(br2, path); + path.Dispose(); + } + + br2.Dispose(); + } + + br1.Dispose(); + return true; + } + + /// + /// Draw the text of the control + /// + /// + /// + /// + public virtual bool DrawText(Graphics Gr, RectangleF rc) + { + if (this.Button == null) + return false; + + //Draw Strings + Font font = new Font(this.Button.Font.FontFamily, + this.Button.Font.Size * this.drawRatio, + this.Button.Font.Style); + + String str = this.Button.Label; + + Color bodyColor = this.Button.ButtonColor; + Color cDark = LBColorManager.StepColor(bodyColor, 20); + + SizeF size = Gr.MeasureString(str, font); + + SolidBrush br1 = new SolidBrush(bodyColor); + SolidBrush br2 = new SolidBrush(cDark); + + Gr.DrawString(str, + font, + br1, + rc.Left + ((rc.Width * 0.5F) - (float)(size.Width * 0.5F)) + (float)(1 * this.drawRatio), + rc.Top + ((rc.Height * 0.5F) - (float)(size.Height * 0.5)) + (float)(1 * this.drawRatio)); + + Gr.DrawString(str, + font, + br2, + rc.Left + ((rc.Width * 0.5F) - (float)(size.Width * 0.5F)), + rc.Top + ((rc.Height * 0.5F) - (float)(size.Height * 0.5))); + + br1.Dispose(); + br2.Dispose(); + font.Dispose(); + + return false; + } + #endregion + + #region (* Protected Methods *) + protected GraphicsPath RoundedRect(RectangleF rect, float radius) + { + RectangleF baseRect = rect; + float diameter = (radius * this.drawRatio) * 2.0f; + SizeF sizeF = new SizeF(diameter, diameter); + RectangleF arc = new RectangleF(baseRect.Location, sizeF); + GraphicsPath path = new GraphicsPath(); + + // top left arc + path.AddArc(arc, 180, 90); + // top right arc + arc.X = baseRect.Right - diameter; + path.AddArc(arc, 270, 90); + // bottom right arc + arc.Y = baseRect.Bottom - diameter; + path.AddArc(arc, 0, 90); + // bottom left arc + arc.X = baseRect.Left; + path.AddArc(arc, 90, 90); + + path.CloseFigure(); + return path; + } + #endregion + } +} diff --git a/JY.Control/Base/ColorMng.cs b/JY.Control/Base/ColorMng.cs new file mode 100644 index 0000000..ac2c07c --- /dev/null +++ b/JY.Control/Base/ColorMng.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JYControl +{ + /// + /// Manager for color + /// + public class LBColorManager : Object + { + public static double BlendColour(double fg, double bg, double alpha) + { + double result = bg + (alpha * (fg - bg)); + if (result < 0.0) + result = 0.0; + if (result > 255) + result = 255; + return result; + } + + public static Color StepColor(Color clr, int alpha) + { + if (alpha == 100) + return clr; + + byte a = clr.A; + byte r = clr.R; + byte g = clr.G; + byte b = clr.B; + float bg = 0; + + int _alpha = Math.Min(alpha, 200); + _alpha = Math.Max(alpha, 0); + double ialpha = ((double)(_alpha - 100.0)) / 100.0; + + if (ialpha > 100) + { + // blend with white + bg = 255.0F; + ialpha = 1.0F - ialpha; // 0 = transparent fg; 1 = opaque fg + } + else + { + // blend with black + bg = 0.0F; + ialpha = 1.0F + ialpha; // 0 = transparent fg; 1 = opaque fg + } + + r = (byte)(LBColorManager.BlendColour(r, bg, ialpha)); + g = (byte)(LBColorManager.BlendColour(g, bg, ialpha)); + b = (byte)(LBColorManager.BlendColour(b, bg, ialpha)); + + return Color.FromArgb(a, r, g, b); + } + }; +} diff --git a/JY.Control/Base/ControlHelper.cs b/JY.Control/Base/ControlHelper.cs new file mode 100644 index 0000000..744ba64 --- /dev/null +++ b/JY.Control/Base/ControlHelper.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace JYControl +{ + public static class ControlHelper + { + /// + /// The m LST freeze control + /// + static Dictionary m_lstFreezeControl = new Dictionary(); + + public static void FreezeControl(Control control, bool blnToFreeze) + { + if (blnToFreeze && control.IsHandleCreated && control.Visible && !control.IsDisposed && (!m_lstFreezeControl.ContainsKey(control) || (m_lstFreezeControl.ContainsKey(control) && m_lstFreezeControl[control] == false))) + { + m_lstFreezeControl[control] = true; + control.Disposed += control_Disposed; + NativeMethods.SendMessage(control.Handle, 11, 0, 0); + } + else if (!blnToFreeze && !control.IsDisposed && m_lstFreezeControl.ContainsKey(control) && m_lstFreezeControl[control] == true) + { + m_lstFreezeControl.Remove(control); + NativeMethods.SendMessage(control.Handle, 11, 1, 0); + control.Invalidate(true); + } + } + + /// + /// Handles the Disposed event of the control control. + /// + /// The source of the event. + /// The instance containing the event data. + static void control_Disposed(object sender, EventArgs e) + { + try + { + if (m_lstFreezeControl.ContainsKey((Control)sender)) + m_lstFreezeControl.Remove((Control)sender); + } + catch { } + } + + /// + /// 设置GDI高质量模式抗锯齿 + /// + /// The g. + public static void SetGDIHigh(this Graphics g) + { + g.SmoothingMode = SmoothingMode.AntiAlias; //使绘图质量最高,即消除锯齿 + g.InterpolationMode = InterpolationMode.HighQualityBicubic; + g.CompositingQuality = CompositingQuality.HighQuality; + } + + /// + /// 根据矩形和圆得到一个圆角矩形Path + /// + /// The rect. + /// The corner radius. + /// GraphicsPath. + public static GraphicsPath CreateRoundedRectanglePath(this Rectangle rect, int cornerRadius) + { + GraphicsPath roundedRect = new GraphicsPath(); + roundedRect.AddArc(rect.X, rect.Y, cornerRadius * 2, cornerRadius * 2, 180, 90); + roundedRect.AddLine(rect.X + cornerRadius, rect.Y, rect.Right - cornerRadius * 2, rect.Y); + roundedRect.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y, cornerRadius * 2, cornerRadius * 2, 270, 90); + roundedRect.AddLine(rect.Right, rect.Y + cornerRadius * 2, rect.Right, rect.Y + rect.Height - cornerRadius * 2); + roundedRect.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y + rect.Height - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 0, 90); + roundedRect.AddLine(rect.Right - cornerRadius * 2, rect.Bottom, rect.X + cornerRadius * 2, rect.Bottom); + roundedRect.AddArc(rect.X, rect.Bottom - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 90, 90); + roundedRect.AddLine(rect.X, rect.Bottom - cornerRadius * 2, rect.X, rect.Y + cornerRadius * 2); + roundedRect.CloseFigure(); + return roundedRect; + } + } +} diff --git a/JY.Control/Base/LBIndustrialCtrlBase.Designer.cs b/JY.Control/Base/LBIndustrialCtrlBase.Designer.cs new file mode 100644 index 0000000..95752e4 --- /dev/null +++ b/JY.Control/Base/LBIndustrialCtrlBase.Designer.cs @@ -0,0 +1,37 @@ +namespace JYControl +{ + partial class LBIndustrialCtrlBase + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + } + + #endregion + } +} diff --git a/JY.Control/Base/LBIndustrialCtrlBase.cs b/JY.Control/Base/LBIndustrialCtrlBase.cs new file mode 100644 index 0000000..44616e9 --- /dev/null +++ b/JY.Control/Base/LBIndustrialCtrlBase.cs @@ -0,0 +1,249 @@ +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 JYControl +{ + /// + /// Base class for the IndustrialCtrls + /// + public partial class LBIndustrialCtrlBase : UserControl + { + #region (* Constructor *) + public LBIndustrialCtrlBase() + { + InitializeComponent(); + + // Set the styles for drawing + SetStyle(ControlStyles.AllPaintingInWmPaint | + ControlStyles.ResizeRedraw | + ControlStyles.DoubleBuffer | + ControlStyles.SupportsTransparentBackColor, + true); + + // Transparent background + this.BackColor = Color.Transparent; + + // Creation of the default renderer + this._defaultRenderer = CreateDefaultRenderer(); + if (this._defaultRenderer != null) + this._defaultRenderer.Control = this; + } + #endregion + + #region (* Properties *) + /// + /// Default renderer of the control + /// + private ILBRenderer _defaultRenderer = null; + [Browsable(false)] + public ILBRenderer DefaultRenderer + { + get { return this._defaultRenderer; } + } + + /// + /// User defined renderer + /// + private ILBRenderer _renderer = null; + [Browsable(false)] + public ILBRenderer Renderer + { + set + { + // set the renderer + this._renderer = value; + if (this._renderer != null) + { + // Set the control tu the renderer + this._renderer.Control = this; + // Update the renderer + this._renderer.Update(); + } + + // Redraw the renderer + Invalidate(); + } + get { return this._renderer; } + } + #endregion + + #region (* Events delegates *) + /// + /// Font change event + /// + /// + [System.ComponentModel.EditorBrowsableAttribute()] + protected override void OnFontChanged(EventArgs e) + { + // Calculate dimensions + this.CalculateDimensions(); + } + /// + /// SizeChanged event + /// + /// + [System.ComponentModel.EditorBrowsableAttribute()] + protected override void OnSizeChanged(EventArgs e) + { + // Default + base.OnSizeChanged(e); + // Calculate al the data for + // drawing the control + this.CalculateDimensions(); + // Redraw + this.Invalidate(); + } + + /// + /// Resize event + /// + /// + protected override void OnResize(EventArgs e) + { + base.OnResize(e); + // Calculate al the data for + // drawing the control + this.CalculateDimensions(); + // Redraw + this.Invalidate(); + } + /// + /// Paint event + /// + /// + [System.ComponentModel.EditorBrowsableAttribute()] + protected override void OnPaint(PaintEventArgs e) + { + // Rectangle of the control + RectangleF _rc = new RectangleF(0, 0, this.Width, this.Height); + e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; + + // Call the default renderer if the user + // rendere is null + if (this.Renderer == null) + { + this.DefaultRenderer.Draw(e.Graphics); + return; + } + + // Draw with the user renderer + this.Renderer.Draw(e.Graphics); + } + #endregion + + #region (* Virtual method *) + /// + /// Call from the constructor to create the default renderer + /// + /// + protected virtual ILBRenderer CreateDefaultRenderer() + { + return new LBRendererBase(); + } + + /// + /// Calculate the dimensions of the control + /// + protected virtual void CalculateDimensions() + { + this.DefaultRenderer.Update(); + + // Update the data in the renderer + if (this.Renderer != null) + this.Renderer.Update(); + + this.Invalidate(); + } + #endregion + } + + /// + /// Base class for the controls renderer + /// + public class LBRendererBase : ILBRenderer + { + #region (* Constructor *) + public LBRendererBase() + { + } + #endregion + + #region (* IDisposable implementation *) + public void Dispose() + { + this.OnDispose(); + } + #endregion + + #region (* Properties *) + /// + /// Associated control + /// + protected object _control = null; + public object Control + { + set { this._control = value; } + get { return this._control; } + } + #endregion + + #region (* Virtual methods *) + /// + /// Dispose the resource of the object + /// + public virtual void OnDispose() + { + } + + /// + /// Update the renderer + /// + /// + public virtual bool Update() + { + return false; + } + + /// + /// Drawing method + /// + /// + public virtual void Draw(Graphics Gr) + { + // Check the graphics + if (Gr == null) + throw new ArgumentNullException("Gr"); + + // Check the control + Control ctrl = this.Control as Control; + if (ctrl == null) + throw new NullReferenceException("Associated control is not valid"); + + // Default drawing + Rectangle rc = ctrl.Bounds; + + Gr.FillRectangle(Brushes.White, ctrl.Bounds); + Gr.DrawRectangle(Pens.Black, ctrl.Bounds); + + Gr.DrawLine(Pens.Red, + ctrl.Left, + ctrl.Top, + ctrl.Right, + ctrl.Bottom); + + Gr.DrawLine(Pens.Red, + ctrl.Right, + ctrl.Top, + ctrl.Left, + ctrl.Bottom); + } + #endregion + } +} diff --git a/JY.Control/Base/LedRenderer.cs b/JY.Control/Base/LedRenderer.cs new file mode 100644 index 0000000..3199d60 --- /dev/null +++ b/JY.Control/Base/LedRenderer.cs @@ -0,0 +1,271 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JYControl +{ + /// + /// Base class for the led renderers + /// + public class LBLedRenderer : LBRendererBase + { + #region (* Variables *) + private RectangleF drawRect; + private RectangleF rectLed; + private RectangleF rectLabel; + #endregion + + #region (* Properies *) + /// + /// Get the associated led object + /// + public LBLed Led + { + get { return this.Control as LBLed; } + } + #endregion + + #region (* Overrided method *) + /// + /// Update the rectangles for drawing + /// + /// + public override bool Update() + { + // Check Led object + if (this.Led == null) + throw new NullReferenceException("Invalid 'Led' object"); + + // Dati del rettangolo + float x, y, w, h; + x = 0; + y = 0; + w = this.Led.Size.Width; + h = this.Led.Size.Height; + + // Rettangolo di disegno + drawRect.X = x; + drawRect.Y = y; + drawRect.Width = w - 2; + drawRect.Height = h - 2; + if (drawRect.Width <= 0) + drawRect.Width = 20; + if (drawRect.Height <= 0) + drawRect.Height = 20; + + this.rectLed = drawRect; + this.rectLabel = drawRect; + + if (this.Led.LabelPosition == LBLed.LedLabelPosition.Bottom) + { + this.rectLed.X = (this.rectLed.Width * 0.5F) - (this.Led.LedSize.Width * 0.5F); + this.rectLed.Width = this.Led.LedSize.Width; + this.rectLed.Height = this.Led.LedSize.Height; + + this.rectLabel.Y = this.rectLed.Bottom; + } + + else if (this.Led.LabelPosition == LBLed.LedLabelPosition.Top) + { + this.rectLed.X = (this.rectLed.Width * 0.5F) - (this.Led.LedSize.Width * 0.5F); + this.rectLed.Y = this.rectLed.Height - this.Led.LedSize.Height; + this.rectLed.Width = this.Led.LedSize.Width; + this.rectLed.Height = this.Led.LedSize.Height; + + this.rectLabel.Height = this.rectLed.Top; + } + + else if (this.Led.LabelPosition == LBLed.LedLabelPosition.Left) + { + this.rectLed.X = this.rectLed.Width - this.Led.LedSize.Width; + this.rectLed.Width = this.Led.LedSize.Width; + this.rectLed.Height = this.Led.LedSize.Height; + + this.rectLabel.Width = this.rectLabel.Width - this.rectLed.Width; + } + + else if (this.Led.LabelPosition == LBLed.LedLabelPosition.Right) + { + this.rectLed.Width = this.Led.LedSize.Width; + this.rectLed.Height = this.Led.LedSize.Height; + + this.rectLabel.X = this.rectLed.Right; + } + + return true; + } + + /// + /// Draw the led object + /// + /// + public override void Draw(Graphics Gr) + { + if (Gr == null) + throw new ArgumentNullException("Gr"); + + LBLed ctrl = this.Led; + if (ctrl == null) + throw new NullReferenceException("Associated control is not valid"); + + Rectangle rc = ctrl.Bounds; + + this.DrawBackground(Gr, rc); + + if (this.rectLed.Width <= 0) + this.rectLed.Width = rectLabel.Width; + if (this.rectLed.Height <= 0) + this.rectLed.Height = ctrl.LedSize.Height; + + this.DrawLed(Gr, this.rectLed); + + this.DrawLabel(Gr, this.rectLabel); + } + #endregion + + #region (* Virtual method *) + /// + /// Draw the background of the control + /// + /// + /// + /// + public virtual bool DrawBackground(Graphics Gr, RectangleF rc) + { + if (this.Led == null) + return false; + + Color c = this.Led.BackColor; + SolidBrush br = new SolidBrush(c); + Pen pen = new Pen(c); + + Rectangle _rcTmp = new Rectangle(0, 0, this.Led.Width, this.Led.Height); + Gr.DrawRectangle(pen, _rcTmp); + Gr.FillRectangle(br, rc); + + br.Dispose(); + pen.Dispose(); + + return true; + } + + /// + /// Draw the body of the control + /// + /// + /// + /// + public virtual bool DrawLed(Graphics Gr, RectangleF rc) + { + if (this.Led == null) + return false; + + Color cDarkOff = LBColorManager.StepColor(Color.LightGray, 20); + Color cDarkOn = LBColorManager.StepColor(this.Led.LedColor, 60); + + LinearGradientBrush brOff = new LinearGradientBrush(rc, + Color.Gray, + cDarkOff, + 45); + + LinearGradientBrush brOn = new LinearGradientBrush(rc, + this.Led.LedColor, + cDarkOn, + 45); + if (this.Led.State == LBLed.LedState.Blink) + { + if (this.Led.BlinkIsOn == false) + { + if (this.Led.Style == LBLed.LedStyle.Circular) + Gr.FillEllipse(brOff, rc); + else if (this.Led.Style == LBLed.LedStyle.Rectangular) + Gr.FillRectangle(brOff, rc); + } + else + { + if (this.Led.Style == LBLed.LedStyle.Circular) + Gr.FillEllipse(brOn, rc); + else if (this.Led.Style == LBLed.LedStyle.Rectangular) + Gr.FillRectangle(brOn, rc); + } + } + else + { + if (this.Led.State == LBLed.LedState.Off) + { + if (this.Led.Style == LBLed.LedStyle.Circular) + Gr.FillEllipse(brOff, rc); + else if (this.Led.Style == LBLed.LedStyle.Rectangular) + Gr.FillRectangle(brOff, rc); + } + else + { + if (this.Led.Style == LBLed.LedStyle.Circular) + Gr.FillEllipse(brOn, rc); + else if (this.Led.Style == LBLed.LedStyle.Rectangular) + Gr.FillRectangle(brOn, rc); + } + } + + brOff.Dispose(); + brOn.Dispose(); + + return true; + } + + /// + /// Draw the text of the control + /// + /// + /// + /// + public virtual bool DrawLabel(Graphics Gr, RectangleF rc) + { + if (this.Led == null) + return false; + + if (this.Led.Label == String.Empty) + return false; + + SizeF size = Gr.MeasureString(this.Led.Label, this.Led.Font); + + SolidBrush br1 = new SolidBrush(this.Led.ForeColor); + + float hPos = 0; + float vPos = 0; + switch (this.Led.LabelPosition) + { + case LBLed.LedLabelPosition.Top: + hPos = (float)(rc.Width * 0.5F) - (float)(size.Width * 0.5F); + vPos = rc.Bottom - size.Height; + break; + + case LBLed.LedLabelPosition.Bottom: + hPos = (float)(rc.Width * 0.5F) - (float)(size.Width * 0.5F); + break; + + case LBLed.LedLabelPosition.Left: + hPos = rc.Width - size.Width; + vPos = (float)(rc.Height * 0.5F) - (float)(size.Height * 0.5F); + break; + + case LBLed.LedLabelPosition.Right: + vPos = (float)(rc.Height * 0.5F) - (float)(size.Height * 0.5F); + break; + } + + Gr.DrawString(this.Led.Label, + this.Led.Font, + br1, + rc.Left + hPos, + rc.Top + vPos); + + return true; + } + #endregion + } +} diff --git a/JY.Control/Base/NativeMethods.cs b/JY.Control/Base/NativeMethods.cs new file mode 100644 index 0000000..bbe027e --- /dev/null +++ b/JY.Control/Base/NativeMethods.cs @@ -0,0 +1,310 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace JYControl +{ + internal class NativeMethods + { + /// + /// Enum ComboBoxButtonState + /// + public enum ComboBoxButtonState + { + /// + /// The state system none + /// + STATE_SYSTEM_NONE, + /// + /// The state system invisible + /// + STATE_SYSTEM_INVISIBLE = 32768, + /// + /// The state system pressed + /// + STATE_SYSTEM_PRESSED = 8 + } + + /// + /// Struct RECT + /// + public struct RECT + { + /// + /// The left + /// + public int Left; + + /// + /// The top + /// + public int Top; + + /// + /// The right + /// + public int Right; + + /// + /// The bottom + /// + public int Bottom; + + /// + /// Gets the rect. + /// + /// The rect. + public Rectangle Rect + { + get + { + return new Rectangle(this.Left, this.Top, this.Right - this.Left, this.Bottom - this.Top); + } + } + + /// + /// Gets the size. + /// + /// The size. + public Size Size + { + get + { + return new Size(this.Right - this.Left, this.Bottom - this.Top); + } + } + + /// + /// Initializes a new instance of the struct. + /// + /// The left. + /// The top. + /// The right. + /// The bottom. + public RECT(int left, int top, int right, int bottom) + { + this.Left = left; + this.Top = top; + this.Right = right; + this.Bottom = bottom; + } + + /// + /// Initializes a new instance of the struct. + /// + /// The rect. + public RECT(Rectangle rect) + { + this.Left = rect.Left; + this.Top = rect.Top; + this.Right = rect.Right; + this.Bottom = rect.Bottom; + } + + /// + /// Froms the xywh. + /// + /// The x. + /// The y. + /// The width. + /// The height. + /// NativeMethods.RECT. + public static NativeMethods.RECT FromXYWH(int x, int y, int width, int height) + { + return new NativeMethods.RECT(x, y, x + width, y + height); + } + + /// + /// Froms the rectangle. + /// + /// The rect. + /// NativeMethods.RECT. + public static NativeMethods.RECT FromRectangle(Rectangle rect) + { + return new NativeMethods.RECT(rect.Left, rect.Top, rect.Right, rect.Bottom); + } + } + + /// + /// Struct PAINTSTRUCT + /// + public struct PAINTSTRUCT + { + /// + /// The HDC + /// + public IntPtr hdc; + + /// + /// The f erase + /// + public int fErase; + + /// + /// The rc paint + /// + public NativeMethods.RECT rcPaint; + + /// + /// The f restore + /// + public int fRestore; + + /// + /// The f inc update + /// + public int fIncUpdate; + + /// + /// The reserved1 + /// + public int Reserved1; + + /// + /// The reserved2 + /// + public int Reserved2; + + /// + /// The reserved3 + /// + public int Reserved3; + + /// + /// The reserved4 + /// + public int Reserved4; + + /// + /// The reserved5 + /// + public int Reserved5; + + /// + /// The reserved6 + /// + public int Reserved6; + + /// + /// The reserved7 + /// + public int Reserved7; + + /// + /// The reserved8 + /// + public int Reserved8; + } + + /// + /// Struct ComboBoxInfo + /// + public struct ComboBoxInfo + { + /// + /// The cb size + /// + public int cbSize; + + /// + /// The rc item + /// + public NativeMethods.RECT rcItem; + + /// + /// The rc button + /// + public NativeMethods.RECT rcButton; + + /// + /// The state button + /// + public NativeMethods.ComboBoxButtonState stateButton; + + /// + /// The HWND combo + /// + public IntPtr hwndCombo; + + /// + /// The HWND edit + /// + public IntPtr hwndEdit; + + /// + /// The HWND list + /// + public IntPtr hwndList; + } + + /// + /// The wm paint + /// + public const int WM_PAINT = 15; + + /// + /// The wm setredraw + /// + public const int WM_SETREDRAW = 11; + + /// + /// The false + /// + public static readonly IntPtr FALSE = IntPtr.Zero; + + /// + /// The true + /// + public static readonly IntPtr TRUE = new IntPtr(1); + + /// + /// Gets the ComboBox information. + /// + /// The HWND combo. + /// The information. + /// true if XXXX, false otherwise. + [DllImport("user32.dll")] + public static extern bool GetComboBoxInfo(IntPtr hwndCombo, ref NativeMethods.ComboBoxInfo info); + + /// + /// Gets the window rect. + /// + /// The HWND. + /// The lp rect. + /// System.Int32. + [DllImport("user32.dll")] + public static extern int GetWindowRect(IntPtr hwnd, ref NativeMethods.RECT lpRect); + + /// + /// Begins the paint. + /// + /// The h WND. + /// The ps. + /// IntPtr. + [DllImport("user32.dll")] + public static extern IntPtr BeginPaint(IntPtr hWnd, ref NativeMethods.PAINTSTRUCT ps); + + /// + /// Ends the paint. + /// + /// The h WND. + /// The ps. + /// true if XXXX, false otherwise. + [DllImport("user32.dll")] + public static extern bool EndPaint(IntPtr hWnd, ref NativeMethods.PAINTSTRUCT ps); + + /// + /// Sends the message. + /// + /// The h WND. + /// The MSG. + /// The w parameter. + /// The l parameter. + [DllImport("user32.dll")] + public static extern void SendMessage(IntPtr hWnd, int msg, int wParam, int lParam); + } +} diff --git a/JY.Control/Base/Renderer.cs b/JY.Control/Base/Renderer.cs new file mode 100644 index 0000000..7f473ec --- /dev/null +++ b/JY.Control/Base/Renderer.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JYControl +{ + /// + /// Renderer interface for all + /// LBSoft.IndustrialCtrls renderer + /// + public interface ILBRenderer : IDisposable + { + object Control + { + set; + get; + } + bool Update(); + void Draw(Graphics Gr); + } +} diff --git a/JY.Control/Blower.cs b/JY.Control/Blower.cs new file mode 100644 index 0000000..fef35e5 --- /dev/null +++ b/JY.Control/Blower.cs @@ -0,0 +1,402 @@ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.ComponentModel; + +namespace JYControl +{ + /// + /// Class UCBlower. + /// Implements the + /// + /// + public class Blower : UserControl + { + /// + /// The entrance direction + /// + private BlowerEntranceDirection entranceDirection = BlowerEntranceDirection.None; + + /// + /// Gets or sets the entrance direction. + /// + /// The entrance direction. + [Description("入口方向"), Category("自定义")] + public BlowerEntranceDirection EntranceDirection + { + get { return entranceDirection; } + set + { + entranceDirection = value; + Refresh(); + } + } + + /// + /// The exit direction + /// + private BlowerExitDirection exitDirection = BlowerExitDirection.Right; + + /// + /// Gets or sets the exit direction. + /// + /// The exit direction. + [Description("出口方向"), Category("自定义")] + public BlowerExitDirection ExitDirection + { + get { return exitDirection; } + set + { + exitDirection = value; + Refresh(); + } + } + + /// + /// The blower color + /// + private Color blowerColor = Color.FromArgb(255, 77, 59); + + /// + /// Gets or sets the color of the blower. + /// + /// The color of the blower. + [Description("风机颜色"), Category("自定义")] + public Color BlowerColor + { + get { return blowerColor; } + set + { + blowerColor = value; + Refresh(); + } + } + + /// + /// The fan color + /// + private Color fanColor = Color.FromArgb(3, 169, 243); + + /// + /// Gets or sets the color of the fan. + /// + /// The color of the fan. + [Description("风叶颜色"), Category("自定义")] + public Color FanColor + { + get { return fanColor; } + set + { + fanColor = value; + Refresh(); + } + } + TurnAround turnAround = JYControl.TurnAround.None; + [Description("风叶旋转方向,None表示不旋转"), Category("自定义")] + public TurnAround TurnAround + { + get { return turnAround; } + set + { + turnAround = value; + if (value == JYControl.TurnAround.None) + { + timer1.Enabled = false; + jiaodu = 0; + Refresh(); + } + else + timer1.Enabled = true; + } + } + + private int turnSpeed = 100; + private int jiaodu = 0; + private Timer timer1; + private IContainer components; + + [Description("风叶旋转速度,100-1000,值越小 速度越快"), Category("自定义")] + public int TurnSpeed + { + get { return turnSpeed; } + set + { + if (value < 0 || value > 1000) + return; + turnSpeed = value; + timer1.Interval = value; + } + } + + /// + /// 是否显示底座 + /// + private bool isDZ = false; + + /// + /// 是否显示底座 + /// + /// 是否显示底座 + [Description("是否显示底座"), Category("自定义")] + public bool IsDZ + { + get { return isDZ; } + set + { + isDZ = value; + Refresh(); + } + } + + /// + /// The m rect working + /// + Rectangle m_rectWorking; + + /// + /// Initializes a new instance of the class. + /// + public Blower() + { + InitializeComponent(); + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + this.SetStyle(ControlStyles.UserPaint, true); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.SizeChanged += UCBlower_SizeChanged; + this.Size = new Size(120, 120); + + } + + /// + /// Handles the SizeChanged event of the UCBlower control. + /// + /// The source of the event. + /// The instance containing the event data. + void UCBlower_SizeChanged(object sender, EventArgs e) + { + int intMin = Math.Min(this.Width, this.Height); + m_rectWorking = new Rectangle((this.Width - (intMin / 2 * 2)) / 2, (this.Height - (intMin / 2 * 2)) / 2, (intMin / 2 * 2), (intMin / 2 * 2)); + } + + /// + /// 引发 事件。 + /// + /// 包含事件数据的 。 + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + var g = e.Graphics; + g.SetGDIHigh(); + GraphicsPath pathLineIn = new GraphicsPath(); + GraphicsPath pathLineOut = new GraphicsPath(); + int intLinePenWidth = 0; + + switch (exitDirection) + { + case BlowerExitDirection.Left: + g.FillRectangle(new SolidBrush(blowerColor), new Rectangle(0, m_rectWorking.Top, this.Width / 2, m_rectWorking.Height / 2 - 5)); + intLinePenWidth = m_rectWorking.Height / 2 - 5; + pathLineOut.AddLine(new Point(-10, m_rectWorking.Top + (m_rectWorking.Height / 2 - 5) / 2), new Point(m_rectWorking.Left + m_rectWorking.Width / 2, m_rectWorking.Top + (m_rectWorking.Height / 2 - 5) / 2)); + g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(1, m_rectWorking.Top - 2), new Point(1, m_rectWorking.Top + (m_rectWorking.Height / 2 - 5) + 2)); + break; + case BlowerExitDirection.Right: + g.FillRectangle(new SolidBrush(blowerColor), new Rectangle(this.Width / 2, m_rectWorking.Top, this.Width / 2, m_rectWorking.Height / 2 - 5)); + intLinePenWidth = m_rectWorking.Height / 2 - 5; + pathLineOut.AddLine(new Point(this.Width + 10, m_rectWorking.Top + (m_rectWorking.Height / 2 - 5) / 2), new Point(m_rectWorking.Left + m_rectWorking.Width / 2, m_rectWorking.Top + (m_rectWorking.Height / 2 - 5) / 2)); + g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(this.Width - 2, m_rectWorking.Top - 2), new Point(this.Width - 2, m_rectWorking.Top + (m_rectWorking.Height / 2 - 5) + 2)); + break; + case BlowerExitDirection.Up: + g.FillRectangle(new SolidBrush(blowerColor), new Rectangle(m_rectWorking.Right - (m_rectWorking.Width / 2 - 5), 0, m_rectWorking.Width / 2 - 5, this.Height / 2)); + intLinePenWidth = m_rectWorking.Width / 2 - 5; + pathLineOut.AddLine(new Point(m_rectWorking.Right - (m_rectWorking.Width / 2 - 5) / 2, -10), new Point(m_rectWorking.Right - (m_rectWorking.Width / 2 - 5) / 2, m_rectWorking.Top + m_rectWorking.Height / 2)); + g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(m_rectWorking.Right + 2, 1), new Point(m_rectWorking.Right - (m_rectWorking.Width / 2 - 5) - 2, 1)); + break; + } + + switch (entranceDirection) + { + case BlowerEntranceDirection.Left: + g.FillRectangle(new SolidBrush(blowerColor), new Rectangle(0, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5, this.Width / 2, m_rectWorking.Height / 2 - 5)); + pathLineIn.AddLine(new Point(-10, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 + (m_rectWorking.Height / 2 - 5) / 2), new Point(m_rectWorking.Left + m_rectWorking.Width / 2, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 + (m_rectWorking.Height / 2 - 5) / 2)); + g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(1, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 - 2), new Point(1, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 + (m_rectWorking.Height / 2 - 5) + 2)); + break; + case BlowerEntranceDirection.Right: + g.FillRectangle(new SolidBrush(blowerColor), new Rectangle(this.Width / 2, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5, this.Width / 2, m_rectWorking.Height / 2 - 5)); + pathLineIn.AddLine(new Point(this.Width + 10, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 + (m_rectWorking.Height / 2 - 5) / 2), new Point(m_rectWorking.Left + m_rectWorking.Width / 2, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 + (m_rectWorking.Height / 2 - 5) / 2)); + g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(this.Width - 2, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 - 2), new Point(this.Width - 2, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 + (m_rectWorking.Height / 2 - 5) + 2)); + break; + case BlowerEntranceDirection.Up: + g.FillRectangle(new SolidBrush(blowerColor), new Rectangle(m_rectWorking.Left, 0, m_rectWorking.Width / 2 - 5, this.Height / 2)); + pathLineIn.AddLine(new Point(m_rectWorking.Left + (m_rectWorking.Width / 2 - 5) / 2, -10), new Point(m_rectWorking.Left + (m_rectWorking.Width / 2 - 5) / 2, m_rectWorking.Top + m_rectWorking.Height / 2)); + g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(m_rectWorking.Left - 2, 1), new Point(m_rectWorking.Left + (m_rectWorking.Width / 2 - 5) + 2, 1)); + break; + } + + //渐变色 + int _intPenWidth = intLinePenWidth; + int intCount = _intPenWidth / 2 / 4; + for (int i = 0; i < intCount; i++) + { + int _penWidth = _intPenWidth / 2 - 4 * i; + if (_penWidth <= 0) + _penWidth = 1; + if (entranceDirection != BlowerEntranceDirection.None) + g.DrawPath(new Pen(new SolidBrush(Color.FromArgb(40, Color.White.R, Color.White.G, Color.White.B)), _penWidth), pathLineIn); + g.DrawPath(new Pen(new SolidBrush(Color.FromArgb(40, Color.White.R, Color.White.G, Color.White.B)), _penWidth), pathLineOut); + if (_penWidth == 1) + break; + } + + //底座 + if (isDZ) + { + GraphicsPath gpDZ = new GraphicsPath(); + gpDZ.AddLines(new Point[] + { + new Point( m_rectWorking.Left+m_rectWorking.Width/2,m_rectWorking.Top+m_rectWorking.Height/2), + new Point(m_rectWorking.Left+2,this.Height), + new Point(m_rectWorking.Right-2,this.Height) + }); + gpDZ.CloseAllFigures(); + g.FillPath(new SolidBrush(blowerColor), gpDZ); + g.FillPath(new SolidBrush(Color.FromArgb(50, Color.White)), gpDZ); + g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(m_rectWorking.Left, this.Height - 2), new Point(m_rectWorking.Right, this.Height - 2)); + } + + + //中心 + g.FillEllipse(new SolidBrush(blowerColor), m_rectWorking); + g.FillEllipse(new SolidBrush(Color.FromArgb(20, Color.White)), m_rectWorking); + + + //扇叶 + Rectangle _rect = new Rectangle(m_rectWorking.Left + (m_rectWorking.Width - (m_rectWorking.Width / 3 * 2)) / 2, m_rectWorking.Top + (m_rectWorking.Height - (m_rectWorking.Width / 3 * 2)) / 2, (m_rectWorking.Width / 3 * 2), (m_rectWorking.Width / 3 * 2)); + + int _splitCount = 8; + float fltSplitValue = 360F / (float)_splitCount; + for (int i = 0; i <= _splitCount; i++) + { + float fltAngle = (fltSplitValue * i - 180) % 360 + jiaodu; + float fltY1 = (float)(_rect.Top + _rect.Width / 2 - ((_rect.Width / 2) * Math.Sin(Math.PI * (fltAngle / 180.00F)))); + float fltX1 = (float)(_rect.Left + (_rect.Width / 2 - ((_rect.Width / 2) * Math.Cos(Math.PI * (fltAngle / 180.00F))))); + float fltY2 = 0; + float fltX2 = 0; + + fltY2 = (float)(_rect.Top + _rect.Width / 2 - ((_rect.Width / 4) * Math.Sin(Math.PI * (fltAngle / 180.00F)))); + fltX2 = (float)(_rect.Left + (_rect.Width / 2 - ((_rect.Width / 4) * Math.Cos(Math.PI * (fltAngle / 180.00F))))); + + g.DrawLine(new Pen(new SolidBrush(fanColor), 2), new PointF(fltX1, fltY1), new PointF(fltX2, fltY2)); + } + + g.FillEllipse(new SolidBrush(fanColor), new Rectangle(_rect.Left + _rect.Width / 2 - _rect.Width / 4 + 2, _rect.Top + _rect.Width / 2 - _rect.Width / 4 + 2, _rect.Width / 2 - 4, _rect.Width / 2 - 4)); + g.FillEllipse(new SolidBrush(Color.FromArgb(50, Color.White)), new Rectangle(_rect.Left - 5, _rect.Top - 5, _rect.Width + 10, _rect.Height + 10)); + } + + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.SuspendLayout(); + // + // timer1 + // + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // UCBlower + // + this.Name = "Blower"; + this.ResumeLayout(false); + + } + + private void timer1_Tick(object sender, EventArgs e) + { + if (turnAround == JYControl.TurnAround.Clockwise) + { + jiaodu += 15; + if (jiaodu == 45) + jiaodu = 0; + } + else if (turnAround == JYControl.TurnAround.Counterclockwise) + { + jiaodu -= 15; + if (jiaodu == -45) + jiaodu = 0; + } + + Refresh(); + } + } + /// + /// Enum BlowerEntranceDirection + /// + public enum BlowerEntranceDirection + { + /// + /// The none + /// + None, + /// + /// The left + /// + Left, + /// + /// The right + /// + Right, + /// + /// Up + /// + Up + } + + /// + /// Enum BlowerExitDirection + /// + public enum BlowerExitDirection + { + /// + /// The none + /// + None, + /// + /// The left + /// + Left, + /// + /// The right + /// + Right, + /// + /// Up + /// + Up + } + /// + /// 旋转方向 + /// + public enum TurnAround + { + /// + /// 不旋转 + /// + None, + /// + /// 顺时针 + /// + Clockwise, + /// + /// 逆时针 + /// + Counterclockwise + } +} diff --git a/JY.Control/Blower.resx b/JY.Control/Blower.resx new file mode 100644 index 0000000..1f666f2 --- /dev/null +++ b/JY.Control/Blower.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/JY.Control/CircleCountValue.Designer.cs b/JY.Control/CircleCountValue.Designer.cs new file mode 100644 index 0000000..4aac48f --- /dev/null +++ b/JY.Control/CircleCountValue.Designer.cs @@ -0,0 +1,37 @@ + +namespace JYControl +{ + partial class CircleCountValue + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/JY.Control/CircleCountValue.cs b/JY.Control/CircleCountValue.cs new file mode 100644 index 0000000..f722c61 --- /dev/null +++ b/JY.Control/CircleCountValue.cs @@ -0,0 +1,144 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace JYControl +{ + public partial class CircleCountValue : Control + { + //这个写最上面是因为我自己也不懂是啥意思,只知道界面控件重绘容易产生闪烁的问题,这个加了就不会有 + //解决控件批量更新时带来的闪烁 + protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; return cp; } } + + //-------------------颜色 + private Color bgColor = Color.FromArgb(224, 224, 224); //背景边框颜色 + private Color sectorColor = Color.FromArgb(109, 179, 63); //扇形颜色 + [Category("控件属性")] + [Description("背景边框颜色")] + public Color BgColor + { + get { return this.bgColor; } + set + { + this.bgColor = value; + this.Invalidate(); + } + } + + [Category("控件属性")] + [Description("扇形颜色")] + public Color SectorColor + { + get { return this.sectorColor; } + set + { + this.sectorColor = value; + this.Invalidate(); + } + } + + private int borderWidth = 2;//边框宽度 + [Category("控件属性")] + [Description("边框宽度")] + public int BorderWidth + { + get { return this.borderWidth; } + set + { + this.borderWidth = value; + this.Invalidate(); + } + } + + /// + /// 圆形进度条实心 + /// + public CircleCountValue() + { + InitControl(); + this.SizeChanged += delegate + { + this.Invalidate(); //重绘控件 + }; + } + + int maxValue = 500000; //进度最大值 + private int countValue = 0; + /// + /// 进度值 + /// + /// + [Category("控件属性")] + [Description("进度值,最大值500000")] + public int CountValue + { + get { return this.countValue; } + set + { + if (value > this.maxValue) + { + return; + } + this.countValue = value; + this.Invalidate(); + } + } + + /// + /// 初始化控件参数 + /// + private void InitControl() + { + this.Width = 200; + this.Height = 200; + } + + //对Control进行绘制 + protected override void OnPaint(PaintEventArgs e) + { + DrawShape(e.Graphics); //绘制控件样式 + } + + /// + /// 画图 + /// + /// 画图工具类 + private void DrawShape(Graphics g) + { + if (this.Width < borderWidth * 4 || this.Height < borderWidth * 4) + { + return; + } + g.SmoothingMode = SmoothingMode.AntiAlias; //消除锯齿,也就是抗锯齿什么鬼东西 + g.InterpolationMode = InterpolationMode.HighQualityBicubic; + g.CompositingQuality = CompositingQuality.HighQuality; + + + RectangleF bg_rectangle = new RectangleF(0 + borderWidth, 0 + borderWidth, Width - borderWidth * 2, Height - borderWidth * 2); //控件整体坐标 + + g.DrawEllipse(new Pen(bgColor, borderWidth), bg_rectangle); //画背景圆 + + + + Rectangle rl = new Rectangle(0 + borderWidth * 2, 0 + borderWidth * 2, this.Width - borderWidth * 4, this.Height - borderWidth * 4); + + decimal topAngle = (this.countValue * 1.0M / this.maxValue) * 360M;//计算进度条划过的度数 + g.FillPie(new SolidBrush(sectorColor), rl, 0, (float)topAngle); //填充扇形 + + //SizeF proValSize = g.MeasureString(this.progress.ToString() + "%", this.Font);//计算文字的范围 + SizeF proValSize = g.MeasureString(this.countValue.ToString(), this.Font);//计算文字的范围 + + //g.DrawString(this.progress.ToString() + "%", this.Font, new SolidBrush(this.ForeColor), + g.DrawString(this.countValue.ToString(), this.Font, new SolidBrush(this.ForeColor), + bg_rectangle.X + bg_rectangle.Width / 2 - proValSize.Width / 2, bg_rectangle.Y + bg_rectangle.Height / 2 - proValSize.Height / 2); + } + + + } +} + diff --git a/JY.Control/CircleProgramBar.cs b/JY.Control/CircleProgramBar.cs new file mode 100644 index 0000000..9a17658 --- /dev/null +++ b/JY.Control/CircleProgramBar.cs @@ -0,0 +1,141 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace JYControl +{ + public class CircleProgramBar : Control + { + //这个写最上面是因为我自己也不懂是啥意思,只知道界面控件重绘容易产生闪烁的问题,这个加了就不会有 + //解决控件批量更新时带来的闪烁 + protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; return cp; } } + + //-------------------颜色 + private Color bgColor = Color.FromArgb(224, 224, 224); //背景边框颜色 + private Color sectorColor = Color.FromArgb(109, 179, 63); //扇形颜色 + [Category("控件属性")] + [Description("背景边框颜色")] + public Color BgColor + { + get { return this.bgColor; } + set + { + this.bgColor = value; + this.Invalidate(); + } + } + + [Category("控件属性")] + [Description("扇形颜色")] + public Color SectorColor + { + get { return this.sectorColor; } + set + { + this.sectorColor = value; + this.Invalidate(); + } + } + + private int borderWidth = 2;//边框宽度 + [Category("控件属性")] + [Description("边框宽度")] + public int BorderWidth { + get { return this.borderWidth; } + set { + this.borderWidth = value; + this.Invalidate(); + } + } + + /// + /// 圆形进度条实心 + /// + public CircleProgramBar() + { + InitControl(); + this.SizeChanged += delegate + { + this.Invalidate(); //重绘控件 + }; + } + + int maxValue = 1000; //进度最大值 + private int progress = 0; + /// + /// 进度值 + /// + /// + [Category("控件属性")] + [Description("进度值,最大值1000")] + public int Progress + { + get { return this.progress; } + set + { + if (value > this.maxValue) + { + return; + } + this.progress = value; + this.Invalidate(); + } + } + + /// + /// 初始化控件参数 + /// + private void InitControl() + { + this.Width = 200; + this.Height = 200; + } + + //对Control进行绘制 + protected override void OnPaint(PaintEventArgs e) + { + DrawShape(e.Graphics); //绘制控件样式 + } + + /// + /// 画图 + /// + /// 画图工具类 + private void DrawShape(Graphics g) + { + if (this.Width < borderWidth*4 || this.Height < borderWidth*4) + { + return; + } + g.SmoothingMode = SmoothingMode.AntiAlias; //消除锯齿,也就是抗锯齿什么鬼东西 + g.InterpolationMode = InterpolationMode.HighQualityBicubic; + g.CompositingQuality = CompositingQuality.HighQuality; + + + RectangleF bg_rectangle = new RectangleF(0+ borderWidth, 0+ borderWidth, Width- borderWidth*2, Height- borderWidth*2); //控件整体坐标 + + g.DrawEllipse(new Pen(bgColor,borderWidth), bg_rectangle); //画背景圆 + + + + Rectangle rl = new Rectangle(0+ borderWidth*2, 0 + borderWidth*2, this.Width- borderWidth*4, this.Height- borderWidth*4); + + decimal topAngle = (this.progress * 1.0M / this.maxValue) * 360M;//计算进度条划过的度数 + g.FillPie(new SolidBrush(sectorColor), rl, 0, (float)topAngle); //填充扇形 + + //SizeF proValSize = g.MeasureString(this.progress.ToString() + "%", this.Font);//计算文字的范围 + SizeF proValSize = g.MeasureString(this.progress.ToString(), this.Font);//计算文字的范围 + + //g.DrawString(this.progress.ToString() + "%", this.Font, new SolidBrush(this.ForeColor), + g.DrawString(this.progress.ToString(), this.Font, new SolidBrush(this.ForeColor), + bg_rectangle.X + bg_rectangle.Width / 2 - proValSize.Width / 2, bg_rectangle.Y + bg_rectangle.Height / 2 - proValSize.Height / 2); + } + + + } +} diff --git a/JY.Control/IO_Instructions.Designer.cs b/JY.Control/IO_Instructions.Designer.cs new file mode 100644 index 0000000..92434a0 --- /dev/null +++ b/JY.Control/IO_Instructions.Designer.cs @@ -0,0 +1,83 @@ +namespace JYControl +{ + partial class IO_Instructions + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.ledControl = new JYControl.LedControl(); + this.LabelX = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // ledControl + // + this.ledControl.BorderWidth = 5; + this.ledControl.CenterColor = System.Drawing.Color.White; + this.ledControl.FlashInterval = 500; + this.ledControl.GapWidth = 5; + this.ledControl.IsBorder = false; + this.ledControl.IsFlash = false; + this.ledControl.IsHighLight = false; + this.ledControl.LampColor = new System.Drawing.Color[] { + System.Drawing.Color.Green, + System.Drawing.Color.Yellow}; + this.ledControl.LedColor = System.Drawing.Color.Green; + this.ledControl.LedFalseColor = System.Drawing.Color.Red; + this.ledControl.LedStatus = true; + this.ledControl.LedTrueColor = System.Drawing.Color.Green; + this.ledControl.Location = new System.Drawing.Point(0, 0); + this.ledControl.Name = "ledControl"; + this.ledControl.Size = new System.Drawing.Size(16, 16); + this.ledControl.TabIndex = 0; + // + // LabelX + // + this.LabelX.AutoSize = true; + this.LabelX.Location = new System.Drawing.Point(29, 3); + this.LabelX.Name = "LabelX"; + this.LabelX.Size = new System.Drawing.Size(29, 12); + this.LabelX.TabIndex = 2; + this.LabelX.Text = "描述"; + // + // IO_Instructions + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.LabelX); + this.Controls.Add(this.ledControl); + this.Name = "IO_Instructions"; + this.Size = new System.Drawing.Size(72, 18); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private LedControl ledControl; + private System.Windows.Forms.Label LabelX; + } +} diff --git a/JY.Control/IO_Instructions.cs b/JY.Control/IO_Instructions.cs new file mode 100644 index 0000000..2487389 --- /dev/null +++ b/JY.Control/IO_Instructions.cs @@ -0,0 +1,136 @@ +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 JYControl +{ + public partial class IO_Instructions : UserControl + { + public IO_Instructions() + { + InitializeComponent(); + + } + + public int IO_Value; + public string mstrCaption = ""; + public string mstrText = "输入描述"; + public bool Reversal, GreenOrRed; + + + + [Category("jason控件属性")] + [Description("是否开启反转")] + public bool AAReversal + { + get + { + return Reversal; + } + set + { + Reversal = value; + } + } + + [Category("jason控件属性")] + [Description("颜色变更绿色或者红色")] + public bool AAGreenOrRed + { + get + { + return GreenOrRed; + } + set + { + GreenOrRed = value; + } + } + + [Category("jason控件属性")] + [Description("控件名称")] + public string AAName + { + get + { + return mstrCaption; + } + set + { + mstrCaption = value; + } + } + + [Category("jason控件属性")] + [Description("控件描述")] + public string AAText + { + get + { + return mstrText; + } + set + { + mstrText = value; + LabelX.Text = AAText; + } + } + + [Category("jason控件属性")] + [Description("控件IO值")] + public int AAValue + { + get + { + return IO_Value; + } + set + { + IO_Value = value; + if (value == 1) + { + if (Reversal) + { + if (GreenOrRed) + { ledControl.LedTrueColor = Color.Red; } + else + { ledControl.LedTrueColor = Color.Green; } + } + else + { + if (GreenOrRed) + { ledControl.LedTrueColor = Color.Transparent; } + else + { ledControl.LedTrueColor = Color.Lime; } + } + + + } + else + { + if (Reversal) + { + if (GreenOrRed) + { ledControl.LedTrueColor = Color.Lime; } + else + { ledControl.LedTrueColor = Color.Red; } + } + else + { + if (GreenOrRed) + { ledControl.LedTrueColor = Color.Red; } + else + { ledControl.LedTrueColor = Color.Transparent; } + } + } + + } + } + } +} diff --git a/JY.Control/IO_Instructions.resx b/JY.Control/IO_Instructions.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JY.Control/IO_Instructions.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JY.Control/Image/list_add.png b/JY.Control/Image/list_add.png new file mode 100644 index 0000000000000000000000000000000000000000..24d65349dc33472d6d6fef2cd46fbf83ae97b196 GIT binary patch literal 321 zcmV-H0lxl;P)vd2&69pi2#iNj6jV*$bbwaf@_RGGO)~m42Bx&s9N{n9u^-~IiI)N zJ=>2nTzKrleE83Vl12bN0c=RJi??N2Zp`csz%9vbV19Tg=>@)R(bfG0sc+y{ z=X~)ww!@Cg?U;vuV1J@9#(U>nVdm4R%qKGxk#hhyHRytwZ^xjcKviAjoSy-_*N_7u zT2)o`Is_dAs_K49$zXHu{lWk#B?G;A?+yCV2OR{8h*>);r5uG2o=hBLTs!9;0o*aO zMbW8V;8s{lc?cn#G*$J2j+-Af`yHUF&T`Ibxe?K_ZOx*{Ih*x8BAU1R9iWJ802~rg zH57imEG?yMLI|tD2}R@zz$Jjm^JtvYH8Y#;tG*}P{tDoQnU_-sZ2dkrlZX8i@aR&0 f3uwRpgA;xN!o_tJmIzJY00000NkvXXu0mjf5|D_C literal 0 HcmV?d00001 diff --git a/JY.Control/Image/tips.png b/JY.Control/Image/tips.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8b8c54618aa4ea0c1634a2bd3bc47c1f77aa48 GIT binary patch literal 362 zcmV-w0hRuVP)$wH6VgdDQWjk+?W4LA1QIzAt;P=sGeIEbQPjpCz<3Y{S|0Q^ z#Fzh8uMP4;H5=H`lcPx&t4TybR9HvFS51fS; z@%A{5pHbBZ>L@0nV_BBHHa9o-)j0XF0Iaods_L#>(Gmc0&eDStO`IxIsk6S6&z&dJ>zcV_eJCYfai1B6U^Kkb#5d85z+k6Dd*hd ztyb&nI>v)cyWPGmilVmxT;bQ4xzbkUqKJF~;2!7P{#L8CZxX|0*>=0VFN&fU0es5L z_m=mE02E?=oSA)02fl@cg$rh9XCEV?TUGU{Jk}>w^_yz{Zhp9q@xEfBU1d+CY5I?EUPN@gG3KY0@D;K)B+KW_e0NySV}5!Sw~xYgw%hG) zDdvQTd}uTOIOg6z}G{6<07D*$!__>P%x8SsFJ z`2Kyhs_smZn=m>z{nR)8~0Bh~Ps(N7@$6K1s z=AQ-B-vhX5EdT)gz|7mj*-oc(d6s3TiRhd$=Audfs=7HzlE0?`AWhRtiD;=3KnMYV z`{VdR{fFLQvk4x^kK zEO;BM4kIs67{{lW`O0$ruW=mz;fcxEaa^eV6)LvQgrt(1)uCj^<2Zh}%ninM#+(DZ z?}><)orsbZJh4K}^8X=@FbYJN{rP?+6$@u4qUD||5Rnhh2~}O3nVIo(0?W(G+lgq- zhfP(R;lWZB^D^kM077+a*u$jMkhb-Dy`51M-C6ZCbIyIyXf%!lwlgkI20CFK;c3X! f3c)lC2c7=`euED`)g|;Y00000NkvXXu0mjfbz1AX literal 0 HcmV?d00001 diff --git a/JY.Control/Image/增加.png b/JY.Control/Image/增加.png new file mode 100644 index 0000000000000000000000000000000000000000..1dcc8b42803e6417b9556a4895ba76c688a2d88d GIT binary patch literal 1209 zcmV;q1V;ObP)Px(b4f%&RA@upT3u)qR}}v4Orl1SW>*9;(W)RVMvJ1N(ddIv#h)UG?%FgOYTWfj z{6R(WLD2^>sA#1x?iwW;Q+Jg@sBLKqeXy}ADlN5&rJ%M(5yYK{n5fCjl{@P!JF`18 zcV>2M*88|~&bi-r?%%oJT>?Nr5jRq30)ggLl@JGvBBeqF2rAXwP;}B>cl^MKKZR&69^>MhC##)0G;Ut z06?yQ%15Q}@r0W=jtP8lX6+O~6t+P?*iDC~J_-_wtQ>gu#qr;r#C1fV{A^@55y(~m zgY$Mm0kDWx&Dy4$D)eC2%J?2$65IsJ6OjZVWVtS|29|+x(@gv+rRTfCajp^OA`mzi z{Sy>bZZNv`A-E;2h<#$`Z%ZJMjLLRF{QNG3Vxm=iO9H`U>xS< z>GD8m_0|jE8v%80DYe;Uhn_$(`Wt{5DgpMzYG;=I{#ve)>Y6UA1cHgka!QEhm2UKqVfbUwKEB`{ttS7l z6aT$P{%gs8kI?wsCtlcLTYl@NkdsBsD$R<)L0cql7V*RG6o18< zy@-o`8)fO#-F=;2zYOEy%Ry$qq&vvc1R~$^OM})k$QJ^-E@_(-iZ5e7WvbEOH<1P^ zl9=t}<}mP^0Fh}l^?AHWM}Ud6B?C+DWbpOla=PzT-^ZFLY`D;@yOa@Y`z---MG768 zttI;Xx>Bl(xtK5Yj6fk|6;`nxo?53{?wfD4@K>7oHwr#kh4~tVEsl*R$Hc3!WeiAp zg)Pm|D5pC;+gSNsGyEepT*s5YZOh|qz@N`mifA-)Z<)_UX XYS$jGxo`Mt00000NkvXXu0mjfW*|r( literal 0 HcmV?d00001 diff --git a/JY.Control/Image/查询.png b/JY.Control/Image/查询.png new file mode 100644 index 0000000000000000000000000000000000000000..2a5d7854e2a369f250c7fe2473ba6fd3e59d09e0 GIT binary patch literal 878 zcmV-!1CjiRP)Px&C`m*?R7gwRm0yTdbri=x=QnrV+RS#Z6ch!Db9ZZtGNK24ara3S6oOiaUNTUb zyCvaUz3eW&8yI`nATa1Hdr~O_p@Cr6kfH+n<6T)nQ9<|4*owNlGrtqR>&$d#-5p1v zm+sTO=XcKe+~4_~^Zf~#$3GOW!DAAUGf5%8tG?t;F4>RnPvZfT<9laI!l1F{N3o`UnPmR>U!#Z_Q7D$eU~omivj;CedaH9jgzDqg znqn5x+{J(y$AF&ESr<}gQ@O`Kh~8CFI@1W*wy{CtGkOWe-IS?D1Ix20k+DZvn>ax z+dfD2F+|?38Ezu-wW^&1*(Q*$*?&asNfon2V4xn{4q&D8YRmpV2Z-vf+2P(V+Nwpy zY3=yAcU9!beGl16WxeZ^2L-qeGwRLU7a(w4)&BgT05@>|VHe3MgiES=Mbs`hHE1;l zWrbf_2-ilSyS82yk&)R#{*Zq-?$;^?jpBoLC#h z#}syCd@n2JKq=gC*x95h2-#i=^WUztgPv%5o1ovgvziTqoqjYu1G-A!r&Mg=HQo3xg?E6oPt*~;Q}gsrIk9b?>e z`(0zuo*X~Bx+1HNXK$r;I;r6!jH2AIs>Skf?>#E;57qglzzEU#Hvj+t07*qoM6N<$ Ef`av&00000 literal 0 HcmV?d00001 diff --git a/JY.Control/Image/设置.png b/JY.Control/Image/设置.png new file mode 100644 index 0000000000000000000000000000000000000000..cbe57d139e7b8f21773f753743f53ab6b94f462c GIT binary patch literal 494 zcmVPx$s7XXYR7gwBRxwV)KoFd@KLAGgK};l&fQF6&egFj&lr(^&fZzj3K7a%$jzEG3 zgn~#s0BR^ei4+N(FJLGsuov0E=8Wx}5i#OQ@668K?%tdU8P?dbwWz4LjzASm+go~1 zMkg7-izf-V4whak`i+bq6VMuuHIOo88~R#6)|%EH7zfd0v}qf~(-31?EwJ0O%cYu# ziwJxsuX+Fmwb|iAMMVKXD{-gn)`{@IP}Tvg`WQmZ-qz~@J`@m>%Z@FL3nE_v-VuXc zNHa(Q7eR?5B^o#Tmjqsx(uV`WQr63f0uAd7gpL0#0Q|Bhvs(}BBK5%`;0kchnK73(Ed<(e9PW}zyP*pU$zyIRj9)%aX4;h>>7$<{ kQfTyx4zVT1vi?Px+U`a$lRA@uRT78Tg#TEa(@ujFL74f(8Juz01E?)v9!Oik@5v0VQ`5HAL3Ie__wx<&xr2&Sz;+WxztY!zp;@Y z-$F$9*C<#XIQH`wZlhIS&l}s#PY0Sy7%>3U3CtqP+7*< z4iGH}qd{4mT3X%p&P*nsEt%w_!wV@PcZd3z_a-psyxI_3=RnHyZ)4z|N+{!{C8sAg zj9H$)k%4)Fu)f%5KQ&v1*Xl`n`6UF}to|e5_M&6oTV0jthsvtrrNr`OfJTYR zr|6akmglQjePPVRJ~OhVwC%+i7&orU4(7xjfafxaOGYT;XeQl7twflC2?EO2^OO*r7Ig6yXtx;g0U&gf2H zdHKx%Ez!kK;GR=kD{$;r4dp_(l`H%n%nt$hByj9bN(~M#Vj;t*kzle9q`M2cij$td ziNd!rqbDn6BCA`1M>EWG3*BX6KivOPTtLym0I(-;?1d(#SZ@9W5M5>>Q;(%jnPj$< z8p~q&$%l0HSe~zv>nSSWC(|;a}%S~jOVVUrT0J6G?&~p9f zKv>Se2C{PbZD3ji@I!&q^9K`SEYE)yfRWSF>(@(!mY07JpqoLwohzN&o)JWzCc z!sMX)q&)u_27aT9*T>Pi!0BGu3ZL@ws~Pl&s*T9<@?V76P2yL@etVPtBtX*hHxO{8 ziHtUu1k3%nFo4edB!ftfhKz*9UfGou5&Z=1+ZuzLSeGR)$fsF+ifpdx2i298}NvEme4 zIsaiWZj8g#kMk~)lrat2kq*oAuLJNnfRVtlkBiFbN@g=GC#r`@&x4P^oC(rBYxLmF zQPKX7Du;>#lSER9NG{a9(4;*7J_c^pFer<0WP$Ssc$ zSnj^NK;q7tiAD*O`QbN5WIn#>XJ5~j@k&oDtx{QqNn#6t789Lv{ih|-j|3qP+3{pC zef;~gX?S=>YZ&X6#FhdoYH^&#cU2o169;9s4KmSJ%T!lLt&VeAQj3+P8eT$>A&sY= z?}M3+=5A!D8DeQ;*QP1GKBX)3JuuXb%rshbYg#rq8oM*!B~x9;NQWgu>n_c-EvCjU zjV@ztvd0^-wM=wntaW!rjm9?l8oM>$Ws|Q}SEknKSO>!Js=79y4N>Dm-9-;)n>D;dDw=|45VNs3i#*anCHQ-fy9SE1$0mjJXhB!|tOPXOM`lz3Uu + + + + Debug + AnyCPU + {01A2AA2C-9B80-41AA-9F47-3CB67E60AF24} + Library + Properties + JYControl + JY.Control + v4.8 + 512 + true + + + + true + full + false + ..\..\..\..\JY.Inspection\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + UserControl + + + LBIndustrialCtrlBase.cs + + + + + + UserControl + + + Component + + + Component + + + CircleCountValue.cs + + + UserControl + + + IO_Instructions.cs + + + UserControl + + + LBButton.cs + + + UserControl + + + LBLed.cs + + + UserControl + + + LedControl.cs + + + UserControl + + + LogManagerControl.cs + + + + True + True + Resources.resx + + + Component + + + PulseButton.cs + + + Component + + + Component + + + RoundButton.cs + + + Component + + + Component + + + TreeViewEx.cs + + + + + Blower.cs + + + IO_Instructions.cs + + + LBLed.cs + + + LedControl.cs + + + LogManagerControl.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + + + TreeViewEx.cs + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JY.Control/JY.Control.csproj.user b/JY.Control/JY.Control.csproj.user new file mode 100644 index 0000000..0b24643 --- /dev/null +++ b/JY.Control/JY.Control.csproj.user @@ -0,0 +1,6 @@ + + + + ProjectFiles + + \ No newline at end of file diff --git a/JY.Control/LBButton.Designer.cs b/JY.Control/LBButton.Designer.cs new file mode 100644 index 0000000..74f35c4 --- /dev/null +++ b/JY.Control/LBButton.Designer.cs @@ -0,0 +1,37 @@ +namespace JYControl +{ + partial class LBButton + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + } + + #endregion + } +} diff --git a/JY.Control/LBButton.cs b/JY.Control/LBButton.cs new file mode 100644 index 0000000..e6de017 --- /dev/null +++ b/JY.Control/LBButton.cs @@ -0,0 +1,294 @@ +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 JYControl +{ + /// + /// Description of LBButton. + /// + public partial class LBButton : LBIndustrialCtrlBase + { + #region (* Enumeratives *) + /// + /// Button styles + /// + public enum ButtonStyle + { + Circular = 0, + Rectangular = 1, + Elliptical = 2, + } + + /// + /// Button states + /// + public enum ButtonState + { + Normal = 0, + Pressed, + } + #endregion + + #region (* Properties variables *) + private ButtonStyle buttonStyle = ButtonStyle.Circular; + private ButtonState buttonState = ButtonState.Normal; + private Color buttonColor = Color.Red; + private string label = String.Empty; + private bool enableRepeatState = false; + private int startRepeatInterval = 500; + private int repeatInterval = 100; + #endregion + + #region (* Variables *) + private Timer tmrRepeat = null; + #endregion + + #region (* Constructor *) + public LBButton() + { + // Initialization + InitializeComponent(); + + // Properties initialization + this.buttonColor = Color.Red; + this.Size = new Size(50, 50); + + // Timer + this.tmrRepeat = new Timer(); + this.tmrRepeat.Enabled = false; + this.tmrRepeat.Interval = this.startRepeatInterval; + this.tmrRepeat.Tick += this.Timer_Tick; + } + #endregion + + #region (* Overrided methods *) + protected override ILBRenderer CreateDefaultRenderer() + { + return new LBButtonRenderer(); + } + #endregion + + #region (* Properties *) + [ + Category("Button"), + Description("Style of the button") + ] + public ButtonStyle Style + { + set + { + this.buttonStyle = value; + this.CalculateDimensions(); + } + get { return this.buttonStyle; } + } + + [ + Category("Button"), + Description("Color of the body of the button") + ] + public Color ButtonColor + { + get { return buttonColor; } + set + { + buttonColor = value; + Invalidate(); + } + } + + [ + Category("Button"), + Description("Label of the button"), + ] + public string Label + { + get { return this.label; } + set + { + this.label = value; + Invalidate(); + } + } + + [ + Category("Button"), + Description("State of the button") + ] + public ButtonState State + { + set + { + this.buttonState = value; + this.Invalidate(); + } + get { return this.buttonState; } + } + + [ + Category("Button"), + Description("Enable/Disable the repetition of the event if the button is pressed") + ] + public bool RepeatState + { + set { this.enableRepeatState = value; } + get { return this.enableRepeatState; } + } + + [ + Category("Button"), + Description("Interval to wait in ms for start the repetition") + ] + public int StartRepeatInterval + { + set { this.startRepeatInterval = value; } + get { return this.startRepeatInterval; } + } + + [ + Category("Button"), + Description("Interva in ms for the repetition") + ] + public int RepeatInterval + { + set { this.repeatInterval = value; } + get { return this.repeatInterval; } + } + #endregion + + #region (* Events delegates *) + /// + /// Timer event + /// + /// + /// + void Timer_Tick(object sender, EventArgs e) + { + this.tmrRepeat.Enabled = false; + + // Update the interval + if (tmrRepeat.Interval == this.startRepeatInterval) + this.tmrRepeat.Interval = this.repeatInterval; + + // Call the delagate + LBButtonEventArgs ev = new LBButtonEventArgs(); + ev.State = this.State; + this.OnButtonRepeatState(ev); + + this.tmrRepeat.Enabled = true; + } + + /// + /// Mouse down event + /// + /// + /// + void OnMouseDown(object sender, MouseEventArgs e) + { + // Change the state + this.State = ButtonState.Pressed; + this.Invalidate(); + + // Call the delagates + LBButtonEventArgs ev = new LBButtonEventArgs(); + ev.State = this.State; + this.OnButtonChangeState(ev); + + // Enable the repeat timer + if (this.RepeatState != false) + { + this.tmrRepeat.Interval = this.StartRepeatInterval; + this.tmrRepeat.Enabled = true; + } + } + + /// + /// Mouse up event + /// + /// + /// + void OnMuoseUp(object sender, MouseEventArgs e) + { + // Change the state + this.State = ButtonState.Normal; + this.Invalidate(); + + // Call the delagates + LBButtonEventArgs ev = new LBButtonEventArgs(); + ev.State = this.State; + this.OnButtonChangeState(ev); + + // Disable the timer + this.tmrRepeat.Enabled = false; + } + #endregion + + #region (* Fire events *) + /// + /// Event for the state changed + /// + public event ButtonChangeState ButtonChangeState; + + /// + /// Method for call the delagetes + /// + /// + protected virtual void OnButtonChangeState(LBButtonEventArgs e) + { + if (this.ButtonChangeState != null) + this.ButtonChangeState(this, e); + } + + /// + /// Event for the repetition of state + /// + public event ButtonRepeatState ButtonRepeatState; + + /// + /// Method for call the delagetes + /// + /// + protected virtual void OnButtonRepeatState(LBButtonEventArgs e) + { + if (this.ButtonRepeatState != null) + this.ButtonRepeatState(this, e); + } + #endregion + } + + #region (* Classes for event and event delagates args *) + + #region (* Event args class *) + /// + /// Class for events delegates + /// + public class LBButtonEventArgs : EventArgs + { + private LBButton.ButtonState state; + + public LBButtonEventArgs() + { + } + + public LBButton.ButtonState State + { + get { return this.state; } + set { this.state = value; } + } + } + #endregion + + #region (* Delegates *) + public delegate void ButtonChangeState(object sender, LBButtonEventArgs e); + public delegate void ButtonRepeatState(object sender, LBButtonEventArgs e); + #endregion + + #endregion +} diff --git a/JY.Control/LBLed.Designer.cs b/JY.Control/LBLed.Designer.cs new file mode 100644 index 0000000..9b0ff6c --- /dev/null +++ b/JY.Control/LBLed.Designer.cs @@ -0,0 +1,53 @@ +namespace JYControl +{ + partial class LBLed + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.tmrBlink = new System.Windows.Forms.Timer(this.components); + this.SuspendLayout(); + // + // tmrBlink + // + this.tmrBlink.Interval = 500; + this.tmrBlink.Tick += new System.EventHandler(this.OnBlink); + // + // LBLed + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Name = "LBLed"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Timer tmrBlink; + } +} diff --git a/JY.Control/LBLed.cs b/JY.Control/LBLed.cs new file mode 100644 index 0000000..88b6fd1 --- /dev/null +++ b/JY.Control/LBLed.cs @@ -0,0 +1,214 @@ +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 JYControl +{ + /// + /// Class for the Led control. + /// + public partial class LBLed : LBIndustrialCtrlBase + { + #region (* Enumeratives *) + public enum LedState + { + Off = 0, + On, + Blink, + } + + public enum LedLabelPosition + { + Left = 0, + Top, + Right, + Bottom, + } + + public enum LedStyle + { + Circular = 0, + Rectangular, + } + + #endregion + + #region (* Properties variables *) + private Color ledColor; + private LedState state; + private LedStyle style; + private LedLabelPosition labelPosition; + private String label = "Led"; + private SizeF ledSize; + private int blinkInterval = 500; + #endregion + + #region (* Class variables *) + //private Timer tmrBlink; + private bool blinkIsOn = false; + #endregion + + #region (* Constructor *) + public LBLed() + { + InitializeComponent(); + + this.Size = new Size(20, 20); + this.ledColor = Color.Red; + this.state = LBLed.LedState.Off; + this.style = LBLed.LedStyle.Circular; + this.blinkIsOn = false; + this.ledSize = new SizeF(10F, 10F); + this.labelPosition = LedLabelPosition.Top; + } + #endregion + + #region (* Properties *) + [ + Category("Led"), + Description("改变LED灯样式") + ] + public LedStyle Style + { + get { return style; } + set + { + style = value; + this.CalculateDimensions(); + } + } + [ + Category("Led"), + Description("改变LED灯颜色") + ] + public Color LedColor + { + get { return ledColor; } + set + { + ledColor = value; + Invalidate(); + } + } + + + [ + Category("Led"), + Description("改变LED灯状态") + ] + public LedState State + { + get { return state; } + set + { + state = value; + if (state == LedState.Blink) + { + this.blinkIsOn = true; + this.tmrBlink.Interval = this.BlinkInterval; + this.tmrBlink.Start(); + } + else + { + this.blinkIsOn = true; + this.tmrBlink.Stop(); + } + + Invalidate(); + } + } + + + [ + Category("Led"), + Description("Size of the led") + ] + public SizeF LedSize + { + get { return this.ledSize; } + set + { + this.ledSize = value; + this.CalculateDimensions(); + Invalidate(); + } + } + + + [ + Category("Led"), + Description("Label of the led") + ] + public String Label + { + get { return this.label; } + set + { + this.label = value; + Invalidate(); + } + } + + + [ + Category("Led"), + Description("Position of the label of the led") + ] + public LedLabelPosition LabelPosition + { + get { return this.labelPosition; } + set + { + this.labelPosition = value; + this.CalculateDimensions(); + Invalidate(); + } + } + + + [ + Category("Led"), + Description("Interval for the blink state of the led") + ] + public int BlinkInterval + { + get { return this.blinkInterval; } + set { this.blinkInterval = value; } + } + + [Browsable(false)] + public bool BlinkIsOn + { + get { return this.blinkIsOn; } + } + #endregion + + #region (* Events delegates *) + void OnBlink(object sender, EventArgs e) + { + if (this.State == LedState.Blink) + { + if (this.blinkIsOn == false) + this.blinkIsOn = true; + else + this.blinkIsOn = false; + + this.Invalidate(); + } + } + #endregion + + #region (* Overrided methods *) + protected override ILBRenderer CreateDefaultRenderer() + { + return new LBLedRenderer(); + } + #endregion + } +} diff --git a/JY.Control/LBLed.resx b/JY.Control/LBLed.resx new file mode 100644 index 0000000..5b87100 --- /dev/null +++ b/JY.Control/LBLed.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/JY.Control/LedControl.Designer.cs b/JY.Control/LedControl.Designer.cs new file mode 100644 index 0000000..48d61d8 --- /dev/null +++ b/JY.Control/LedControl.Designer.cs @@ -0,0 +1,44 @@ +namespace JYControl +{ + partial class LedControl + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // LedControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Name = "LedControl"; + this.ResumeLayout(false); + + } + + #endregion + } +} diff --git a/JY.Control/LedControl.cs b/JY.Control/LedControl.cs new file mode 100644 index 0000000..9afcfeb --- /dev/null +++ b/JY.Control/LedControl.cs @@ -0,0 +1,426 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace JYControl +{ + public partial class LedControl : UserControl + { + public LedControl() + { + InitializeComponent(); + #region 【1】设置双缓冲等属性 + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + this.SetStyle(ControlStyles.UserPaint, true); + timer.Enabled = true; + timer.Tick += Timer_Tick; + #endregion + } + + private void Timer_Tick(object sender, EventArgs e) + { + intColorIndex++; + + if (intColorIndex >= lampColor.Length) + { + intColorIndex = 0; + } + this.Invalidate(); + } + + #region 【2】定义三个字段 + + private Graphics g; + + private Pen p; + + private SolidBrush sb; + + Timer timer = new Timer(); + + private int intColorIndex = 0; + + #endregion + + #region 【3】添加一个设置Graphics的方法 + private void SetGraphics(Graphics g) + { + //设置画布的属性 + g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; + g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; + g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; + g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; + } + + #endregion + + + #region 【4】根据实际控件分析的结果,创建属性 + + private Color ledTrueColor = Color.Green; + + [Category("jason控件属性")] + + [Description("TRUE的时候LED指示灯颜色")] + + public Color LedTrueColor + { + get { return ledTrueColor; } + set + { + ledTrueColor = value; + this.Invalidate(); + } + } + #endregion + + private Color ledFalseColor = Color.Red; + + [Category("jason控件属性")] + + [Description("False的时候LED指示灯颜色")] + + public Color LedFalseColor + + { + get { return ledFalseColor; } + set + + { + ledFalseColor = value; + this.Invalidate(); + } + + } + + private bool ledStatus = true; + [Category("jason控件属性")] + [Description("当前的状态")] + public bool LedStatus + { + get { return ledStatus; } + + set + + { + ledStatus = value; + this.Invalidate(); + } + } + + private Color ledColor = Color.Green; + [Category("jason控件属性")] + [Description("LED指示灯演示")] + public Color LedColor + { + get { return ledColor; } + set + + { + ledColor = value; + this.Invalidate(); + } + } + private bool isBorder = true; + + [Category("jason控件属性")] + + [Description("是否有边框")] + + public bool IsBorder + + { + + get { return isBorder; } + + set + + { + + isBorder = value; + + this.Invalidate(); + + } + + } + + private int borderWidth = 5; + + [Category("jason控件属性")] + + [Description("圆环的宽度")] + + public int BorderWidth + + { + + get { return borderWidth; } + + set + + { + + borderWidth = value; + + this.Invalidate(); + + } + + } + + private int gapWidth = 5; + + [Category("jason控件属性")] + + [Description("间隙的宽度")] + + public int GapWidth + + { + + get { return gapWidth; } + + set + + { + + gapWidth = value; + + this.Invalidate(); + + } + + } + + private bool isHighLight = true; + + [Category("jason控件属性")] + + [Description("是否高亮")] + + public bool IsHighLight + + { + + get { return isHighLight; } + + set + + { + + isHighLight = value; + + this.Invalidate(); + + } + + } + + private Color centerColor = Color.White; + + [Category("jason控件属性")] + + [Description("渐变中心的颜色")] + + public Color CenterColor + + { + + get { return centerColor; } + + set + + { + + centerColor = value; + + this.Invalidate(); + + } + + } + + private bool isFlash = true; + + [Category("jason控件属性")] + + [Description("是否闪烁")] + + public bool IsFlash + + { + + get { return isFlash; } + + set + + { + + isFlash = value; + + this.Invalidate(); + + } + + } + + private int flashInterval = 500; + + [Category("jason控件属性")] + + [Description("闪烁的频率")] + + public int FlashInterval + + { + + get { return flashInterval; } + + set + + { + + flashInterval = value; + + timer.Interval = flashInterval;//timer的时间间隔要放在这里 + + this.Invalidate(); + + } + + } + + private Color[] lampColor = new Color[] { }; + + [Category("jason控件属性")] + + [Description("闪烁灯的几种颜色,当需要闪烁时,至少需要2个及以上颜色,不需要闪烁则至少需要1个颜色")] + + public Color[] LampColor + + { + + get { return lampColor; } + + set + + { + + if (value == null || value.Length <= 0) + + return; + + lampColor = value; + + this.Invalidate(); + + } + + } + + #region 【5】创建重绘的事件 + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + g = e.Graphics;//获取画布 + + SetGraphics(g);//设置画布 + + #region 1,画一个圆 + + int LEDWidth = Math.Min(this.Width, this.Height); + + Color color = ledStatus ? ledTrueColor : ledFalseColor; + + if (isFlash) + + { + + lampColor = new Color[] { color, Color.Yellow }; + + color = lampColor[intColorIndex]; + + } + + sb = new SolidBrush(color); + + RectangleF rec = new RectangleF(1, 1, LEDWidth - 2, LEDWidth - 2);//创建矩形 + + g.FillEllipse(sb, rec);//画圆 + + #endregion + + #region 2,在圆里面画一个圆环 + + //如果有边框,那就画一个圆环 + + if (isBorder)//参数这里用字段或属性都可以,如果用属性,程序要都走一些判断的代码 + + { + + p = new Pen(this.BackColor, borderWidth);//使用背景色 + + //p = new Pen(Color.Red, borderWidth); + + float x = 1 + gapWidth + borderWidth * 0.5f; + + rec = new RectangleF(x, x, LEDWidth - 2 * x, LEDWidth - 2 * x); + + g.DrawEllipse(p, rec);//画圆环 + + } + + #endregion + + #region 3,渐变色绘制,是否高亮 + + if (isHighLight) + + { + + GraphicsPath gp = new GraphicsPath(); + + float x = isBorder ? 1 + gapWidth + borderWidth : 1;//使用三元运算来判断,优化代码 + + rec = new RectangleF(x, x, LEDWidth - 2 * x, LEDWidth - 2 * x); + + gp.AddEllipse(rec);//把矩形添加到路径 + + //渐变色画刷,高亮 + + PathGradientBrush pgb = new PathGradientBrush(gp);//把路径传入 + + Color[] surroundColor = new Color[] { color }; + + pgb.CenterColor = this.centerColor; + + //设置有多少组颜色来渐变 + + pgb.SurroundColors = surroundColor; + + g.FillPath(pgb, gp); + + } + + #endregion + + } + + #endregion + + } +} diff --git a/JY.Control/LedControl.resx b/JY.Control/LedControl.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JY.Control/LedControl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JY.Control/LogManagerControl.Designer.cs b/JY.Control/LogManagerControl.Designer.cs new file mode 100644 index 0000000..1d8c960 --- /dev/null +++ b/JY.Control/LogManagerControl.Designer.cs @@ -0,0 +1,78 @@ +namespace JYControl +{ + partial class LogManagerControl + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.listView1 = new System.Windows.Forms.ListView(); + this.time = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.message = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.SuspendLayout(); + // + // listView1 + // + this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.time, + this.message}); + this.listView1.Dock = System.Windows.Forms.DockStyle.Fill; + this.listView1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.listView1.HideSelection = false; + this.listView1.Location = new System.Drawing.Point(0, 0); + this.listView1.Name = "listView1"; + this.listView1.Size = new System.Drawing.Size(1103, 235); + this.listView1.TabIndex = 0; + this.listView1.UseCompatibleStateImageBehavior = false; + this.listView1.View = System.Windows.Forms.View.Details; + // + // time + // + this.time.Text = "时间"; + this.time.Width = 120; + // + // message + // + this.message.Text = "信息"; + this.message.Width = 2000; + // + // LogManagerControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.listView1); + this.Name = "LogManagerControl"; + this.Size = new System.Drawing.Size(1103, 235); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ListView listView1; + private System.Windows.Forms.ColumnHeader time; + private System.Windows.Forms.ColumnHeader message; + } +} diff --git a/JY.Control/LogManagerControl.cs b/JY.Control/LogManagerControl.cs new file mode 100644 index 0000000..d3593b8 --- /dev/null +++ b/JY.Control/LogManagerControl.cs @@ -0,0 +1,182 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.IO; + +namespace JYControl +{ + public enum Logtype//枚举类型 + { + Message, + Warning, + Error + } + + public enum LogAddtype//枚举类型 + { + MES, + local, + } + + public partial class LogManagerControl : UserControl + { + static bool _newErrorInfo = false; + static int _ErrorCount = 0; + public LogManagerControl() + { + InitializeComponent(); + this.DoubleBuffered = true; + this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | + ControlStyles.AllPaintingInWmPaint, + true); + this.UpdateStyles(); + } + + private static readonly string logMesPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Logs", "MESLogs"); + private static readonly string loglocalPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Logs", "localLogs"); + private static LogManagerControl _manager = new LogManagerControl(); + + delegate void DoAddMessage(string message, LogAddtype logAddtype, Logtype logType = Logtype.Message); + //delegate void DoDelete(); + public static void AddLog(string strLog, LogAddtype logAddtype, Logtype logType = Logtype.Message) + { + if (_manager.listView1.InvokeRequired) + { + DoAddMessage dam = new DoAddMessage(AddLog); + _manager.listView1.Invoke(dam, strLog,logAddtype, logType); + } + else + { + string strDate = DateTime.Now.ToString("HH:mm:ss:ff"); + ListViewItem item = new ListViewItem(); + switch (logType) + { + case Logtype.Message: + if (strLog.Contains("接收到客户端连接") || strLog.Contains("TCP服务器启动监听成功")) + { + item.ForeColor = Color.White; + item.BackColor = Color.SeaGreen; + } + break; + case Logtype.Warning: + item.BackColor = Color.Yellow; + strLog = "警告:" + strLog; + break; + case Logtype.Error: + item.BackColor = Color.Red; + item.ForeColor = Color.White; + strLog = "错误:" + strLog; + _newErrorInfo = true; + _ErrorCount++; + + break; + default: + break; + } + item.Text = strDate; + item.SubItems.Add(strLog); + _manager.listView1.BeginUpdate(); + + + _manager.listView1.Items.Insert(0, item);//添加在第一行 + //_manager.listView1.Items.Add(item);//添加在最后一行 + int ff = _manager.listView1.Items.Count - 1; + if (_manager.listView1.Items.Count > 150) + { + _manager.listView1.Items.RemoveAt(ff); + } + //_manager.listView1.Items[_manager.listView1.Items.Count - 1].EnsureVisible(); + + _manager.listView1.EndUpdate(); + + switch (logAddtype) + { + case LogAddtype.MES: + if (!Directory.Exists(logMesPath)) + { + Directory.CreateDirectory(logMesPath); + } + using (StreamWriter sw = new StreamWriter(logMesPath+DateTime.Now.ToString("yyyyMMdd") + ".txt", true)) + { + sw.WriteLine(strDate + " " + logType.ToString() + " " + strLog); + } + break; + case LogAddtype.local: + if (!Directory.Exists(loglocalPath)) + { + Directory.CreateDirectory(loglocalPath); + } + using (StreamWriter sw = new StreamWriter(loglocalPath+DateTime.Now.ToString("yyyyMMdd") + ".txt", true)) + { + sw.WriteLine(strDate + " " + logType.ToString() + " " + strLog); + } + break; + default: + break; + } + //添加日志到log文件中 + } + } + + public static void ClearLog() + { + //if (_manager.listView1.InvokeRequired) + //{ + // DoDelete dam = new DoDelete(ClearLog); + // _manager.listView1.Invoke(dam); + //} + //else + //{ + //if (_manager.listView1.Items.Count > 200) + //{ + // _manager.listView1.Items.RemoveAt(item); + //} + _manager.listView1.Items.Clear(); + //} + } + + /// + /// 双缓冲ListView ,解决闪烁 + /// + public class DoubleBufferListView : System.Windows.Forms.ListView + { + public DoubleBufferListView() + { + SetStyle(ControlStyles.DoubleBuffer | + ControlStyles.OptimizedDoubleBuffer | + ControlStyles.AllPaintingInWmPaint, true); + UpdateStyles(); + } + } + + protected override void WndProc(ref Message m) + { + if (m.Msg == 0x0014) // 禁掉清除背景消息 + return; + base.WndProc(ref m); + } + + public static bool HasNewErrorInfo + { + get { return _newErrorInfo; } + set { _newErrorInfo = value; } + } + public static int ErrorInfoCount + { + get { return _ErrorCount; } + set { _ErrorCount = 0; } + } + + public static LogManagerControl Manager + { + get { return LogManagerControl._manager; } + set { LogManagerControl._manager = value; } + } + } +} diff --git a/JY.Control/LogManagerControl.resx b/JY.Control/LogManagerControl.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JY.Control/LogManagerControl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JY.Control/Properties/AssemblyInfo.cs b/JY.Control/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..12e2396 --- /dev/null +++ b/JY.Control/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("JY.Control")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("JY.Control")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("01a2aa2c-9b80-41aa-9f47-3cb67e60af24")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/JY.Control/Properties/Resources.Designer.cs b/JY.Control/Properties/Resources.Designer.cs new file mode 100644 index 0000000..44a8341 --- /dev/null +++ b/JY.Control/Properties/Resources.Designer.cs @@ -0,0 +1,143 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace JYControl.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.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() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [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("JYControl.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap list_add { + get { + object obj = ResourceManager.GetObject("list_add", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap list_subtract { + get { + object obj = ResourceManager.GetObject("list_subtract", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap tips { + get { + object obj = ResourceManager.GetObject("tips", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 下载 { + get { + object obj = ResourceManager.GetObject("下载", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 增加 { + get { + object obj = ResourceManager.GetObject("增加", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 查询 { + get { + object obj = ResourceManager.GetObject("查询", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 设置 { + get { + object obj = ResourceManager.GetObject("设置", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 运行中 { + get { + object obj = ResourceManager.GetObject("运行中", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/JY.Control/Properties/Resources.resx b/JY.Control/Properties/Resources.resx new file mode 100644 index 0000000..9948e75 --- /dev/null +++ b/JY.Control/Properties/Resources.resx @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Image\list_add.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Image\list_subtract.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Image\tips.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Image\下载.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Image\增加.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Image\查询.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Image\设置.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Image\运行中.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/JY.Control/PulseButton.Designer.cs b/JY.Control/PulseButton.Designer.cs new file mode 100644 index 0000000..5063f66 --- /dev/null +++ b/JY.Control/PulseButton.Designer.cs @@ -0,0 +1,36 @@ +namespace JYControl +{ + partial class PulseButton + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/JY.Control/PulseButton.cs b/JY.Control/PulseButton.cs new file mode 100644 index 0000000..f870d12 --- /dev/null +++ b/JY.Control/PulseButton.cs @@ -0,0 +1,554 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Text; +using System.Windows.Forms; + +namespace JYControl +{ + public partial class PulseButton : Button + { + #region -- Members -- + private readonly Timer pulseTimer; + private RectangleF[] pulses; + private RectangleF centerRect; + private Color[] pulseColors; + private int pulseWidth; + private bool mouseOver; + private bool pressed; + private float pulseSpeed; + + public enum Shape + { + Round, + Rectangle + } + #endregion + + #region -- Properties -- + + /// + /// Gets or sets the top button color. + /// + /// The top button color. + [Browsable(true), DefaultValue(typeof(Color), "CornflowerBlue")] + [Category("Appearance")] + public Color ButtonColorTop { get; set; } + + /// + /// Gets or sets the bottom button color. + /// + /// The bottom button color. + [Browsable(true), DefaultValue(typeof(Color), "DodgerBlue")] + [Category("Appearance")] + public Color ButtonColorBottom { get; set; } + + /// + /// Gets or sets the color of the pulse. + /// + /// The color of the pulse. + [Browsable(true), DefaultValue(typeof(Color), "Black")] + [Category("Appearance")] + public Color PulseColor { get; set; } + + /// + /// Gets or sets the type of the shape. + /// + /// The type of the shape. + [Browsable(true), DefaultValue(typeof(Shape), "Round")] + [Category("Appearance")] + public Shape ShapeType { get; set; } + + /// + /// Gets or sets the corner radius. + /// + /// The corner radius. + [Browsable(true), DefaultValue(10)] + [Category("Appearance")] + public int CornerRadius { get; set; } + + /// + /// Gets or sets the color of the focus. + /// + /// The color of the focus. + [Browsable(true), DefaultValue(typeof(Color), "Orange")] + [Category("Appearance")] + public Color FocusColor { get; set; } + + /// + /// Gets or sets the foreground color of the control. + /// + /// + /// + /// The foreground of the control. The default is the value of the property. + /// + /// + /// + /// + [Browsable(true), DefaultValue(typeof(Color), "White")] + [Category("Appearance")] + public new Color ForeColor + { + get { return base.ForeColor; } + set { base.ForeColor = value; } + } + + /// + /// Gets or sets the number of pulses. + /// + /// The number of pulses. + [Browsable(true), DefaultValue(3)] + [Category("Appearance")] + public int NumberOfPulses + { + get { return pulses.Length; } + set + { + if (value <= 0) return; + pulses = new RectangleF[value]; + pulseColors = new Color[value]; + ArrangePulses(); + } + } + + /// + /// Gets or sets the width of the pulse. + /// + /// The width of the pulse. + [Browsable(true), DefaultValue(10)] + [Category("Appearance")] + public int PulseWidth + { + get { return pulseWidth; } + set { pulseWidth = value; ArrangePulses(); } + } + + /// + /// Gets or sets the wave speed. + /// + /// The speed of the pulses. + [Browsable(true), DefaultValue(typeof(float), "0.3f")] + [Category("Appearance")] + public float PulseSpeed + { + get { return pulseSpeed; } + set + { + if (value <= 0) return; + pulseSpeed = value; + } + } + + /// + /// Gets or sets the interval. + /// + /// The interval. + [Browsable(false), DefaultValue(50)] + public int Interval + { + get { return pulseTimer.Interval; } + set { pulseTimer.Interval = value; } + } + + #endregion + + #region -- Constructor -- + /// + /// Initializes a new instance of the class. + /// + public PulseButton() + { + // Control styles + SetStyle(ControlStyles.SupportsTransparentBackColor, true); + SetStyle(ControlStyles.OptimizedDoubleBuffer, true); + SetStyle(ControlStyles.AllPaintingInWmPaint, true); + SetStyle(ControlStyles.ResizeRedraw, true); + SetStyle(ControlStyles.UserPaint, true); + InitializeComponent(); + // Layout & initialization + SuspendLayout(); + pulseWidth = 10; + PulseSpeed = .3f; + ButtonColorTop = Color.CornflowerBlue; + ButtonColorBottom = Color.DodgerBlue; + FocusColor = Color.Orange; + PulseColor = Color.Black; + ShapeType = Shape.Round; + CornerRadius = 10; + Image = null; + base.TextAlign = ContentAlignment.MiddleCenter; + Size = new Size(40, 40); + // Timer + pulseTimer = new Timer { Interval = 50 }; + pulseTimer.Tick += PulseTimerTick; + pulses = new RectangleF[3]; + pulseColors = new Color[3]; + ArrangePulses(); + pulseTimer.Enabled = true; + ResumeLayout(true); + } + + #endregion + + #region -- EventHandlers -- + + /// + /// Handles the pulse timer tick. + /// + /// The sender. + /// The instance containing the event data. + private void PulseTimerTick(object sender, EventArgs e) + { + pulseTimer.Enabled = false; + InflatePulses(); + Invalidate(); + pulseTimer.Enabled = true; + } + + #endregion + + #region -- Protected overrides -- + + #region - Mouse - + + /// + /// Raises the event. + /// + /// A that contains the event data. + protected override void OnMouseUp(MouseEventArgs e) + { + base.OnMouseUp(e); + if (e.Button != MouseButtons.Left) return; + pressed = false; + } + + /// + /// Raises the event. + /// + /// A that contains the event data. + protected override void OnMouseDown(MouseEventArgs e) + { + base.OnMouseDown(e); + if (e.Button != MouseButtons.Left) return; + pressed = true; + } + + /// + /// Raises the event. + /// + /// A that contains the event data. + protected override void OnMouseMove(MouseEventArgs mevent) + { + base.OnMouseMove(mevent); + mouseOver = centerRect.Contains(mevent.Location); + } + + /// + /// Raises the event. + /// + /// A that contains the event data. + protected override void OnMouseLeave(EventArgs e) + { + base.OnMouseLeave(e); + mouseOver = false; + pressed = false; + } + + #endregion + + /// + /// Raises the event. + /// + /// An that contains the event data. + protected override void OnEnabledChanged(EventArgs e) + { + base.OnEnabledChanged(e); + pulseTimer.Enabled = Enabled; + } + + /// + /// Raises the event. + /// + /// An that contains the event data. + protected override void OnResize(EventArgs e) + { + base.OnResize(e); + if (pulses == null || pulses.Length == 0) return; + ArrangePulses(); + } + + /// + /// Raises the event. + /// + /// A that contains the event data. + protected override void OnPaint(PaintEventArgs e) + { + //base.OnPaint(e); + base.OnPaintBackground(e); + // Set Graphics interpolation and smoothing + Graphics g = e.Graphics; + g.InterpolationMode = InterpolationMode.HighQualityBicubic; + g.SmoothingMode = SmoothingMode.AntiAlias; + + // Draw pulses + DrawPulses(g); + + if (centerRect.IsEmpty) return; + // Draw center + DrawCenter(g); + + // Draw border + DrawBorder(g); + // Image + if (Image != null) + g.DrawImage(Image, centerRect); + + // Draw highlight + if (mouseOver) + DrawHighLight(g); + // Reflex + if (!pressed) DrawReflex(g); + // Text + DrawText(g); + } + + #endregion + + #region -- Protected virtual methods -- + + /// + /// Draws the border. + /// + /// The graphics object + protected virtual void DrawBorder(Graphics g) + { + using (var pen = new Pen(!Focused ? Color.FromArgb(60, Color.Black) : FocusColor, 2)) + PaintShape(g, pen, centerRect); + } + + /// + /// Draws the center. + /// + /// The graphics object + protected virtual void DrawCenter(Graphics g) + { + if (Enabled) + { + using (var lgb = new LinearGradientBrush(centerRect, ButtonColorTop, ButtonColorBottom, + LinearGradientMode.Vertical)) + { + PaintShape(g, lgb, centerRect); + } + } + else + { + using (var lgb = new SolidBrush(Color.Gray)) + PaintShape(g, lgb, centerRect); + + } + } + + /// + /// Draws the pulses. + /// + /// The graphics object + protected virtual void DrawPulses(Graphics g) + { + if (!Enabled) return; + for (var i = 0; i < pulses.Length; i++) + { + using (var sb = new SolidBrush(pulseColors[i])) + { + PaintShape(g, sb, pulses[i]); + } + } + } + + /// + /// Draws the text. + /// + /// The graphics object + protected virtual void DrawText(Graphics g) + { + var format = new StringFormat(StringFormat.GenericDefault) { Trimming = StringTrimming.EllipsisCharacter }; + format.FormatFlags |= StringFormatFlags.MeasureTrailingSpaces; + format.FormatFlags ^= StringFormatFlags.LineLimit; + format.HotkeyPrefix = HotkeyPrefix.Show; + SizeF size = g.MeasureString(Text, Font, new SizeF(centerRect.Width, centerRect.Height), format); + RectangleF textRect = GetAlignPlacement(TextAlign, centerRect, size); + using (var sb = new SolidBrush(ForeColor)) + g.DrawString(Text, Font, sb, textRect, format); + } + + /// + /// Draws the reflex. + /// + /// The graphics object + protected virtual void DrawReflex(Graphics g) + { + using (var path = new GraphicsPath()) + { + RectangleF rect = centerRect; + rect.Height = rect.Height / 2; + if (ShapeType == Shape.Round) + { + path.AddArc(centerRect, -180, 180); + RectangleF reflexRectangle = rect; + reflexRectangle.Offset(0, rect.Height); + reflexRectangle.Height /= 6; + path.AddArc(reflexRectangle, 0, 180); + path.CloseFigure(); + } + else + { + rect.Height += rect.Height / 6; + path.AddRectangle(rect); + } + RectangleF area = path.GetBounds(); + using (var lgb = new LinearGradientBrush(area, Color.FromArgb(30, Color.White), + Color.FromArgb(60, Color.White), -90)) + { + g.FillPath(lgb, path); + } + } + } + + /// + /// Draws the high light. + /// + /// The graphics object + protected virtual void DrawHighLight(Graphics g) + { + RectangleF highlightRect = centerRect; + highlightRect.Inflate(-2, -2); + using (var pen = new Pen(Color.FromArgb(60, Color.White), 4)) + { + if (ShapeType == Shape.Round) + g.DrawEllipse(pen, highlightRect); + else + g.DrawPath(pen, GetRoundRect(g, highlightRect, CornerRadius)); + } + } + + /// + /// Paints the shape. + /// + /// The graphics object + /// The pen + /// The rectangle. + protected virtual void PaintShape(Graphics g, Pen p, RectangleF rectangle) + { + if (ShapeType == Shape.Round) + g.DrawEllipse(p, rectangle); + else + using (var path = GetRoundRect(g, rectangle, CornerRadius)) + g.DrawPath(p, path); + } + + /// + /// Paints the shape. + /// + /// The graphics object + /// The brush + /// The rectangle. + protected virtual void PaintShape(Graphics g, Brush b, RectangleF rectangle) + { + if (ShapeType == Shape.Round) + g.FillEllipse(b, rectangle); + else + using (var path = GetRoundRect(g, rectangle, CornerRadius)) + g.FillPath(b, path); + } + + #endregion + + #region -- Public static methods -- + + /// + /// Gets a path of a rectangle with round corners. + /// + /// The graphics object + /// The rectangle + /// The corner radius + /// + public static GraphicsPath GetRoundRect(Graphics g, RectangleF rect, float radius) + { + var gp = new GraphicsPath(); + var diameter = radius * 2; + gp.AddArc(rect.X + rect.Width - diameter, rect.Y, diameter, diameter, 270, 90); + gp.AddArc(rect.X + rect.Width - diameter, rect.Y + rect.Height - diameter, diameter, diameter, 0, 90); + gp.AddArc(rect.X, rect.Y + rect.Height - diameter, diameter, diameter, 90, 90); + gp.AddArc(rect.X, rect.Y, diameter, diameter, 180, 90); + gp.CloseFigure(); + return gp; + } + + /// + /// Gets the placement. + /// + /// The alignment of the element + /// A retangle + /// The element to be placed + /// + public static RectangleF GetAlignPlacement(ContentAlignment align, RectangleF rect, SizeF element) + { + // Left & Top (default) + float lft = rect.Left; + float top = rect.Y; + // Right + if ((align & (ContentAlignment.BottomRight | ContentAlignment.MiddleRight | ContentAlignment.TopRight)) != 0) + lft = rect.Right - element.Width; + // Center + else if ((align & (ContentAlignment.BottomCenter | ContentAlignment.MiddleCenter | ContentAlignment.TopCenter)) != 0) + lft = (rect.Width / 2) - (element.Width / 2) + rect.Left; + // Bottom + if ((align & (ContentAlignment.BottomCenter | ContentAlignment.BottomLeft | ContentAlignment.BottomRight)) != 0) + top = rect.Bottom - element.Height; + // Middle + else if ((align & (ContentAlignment.MiddleCenter | ContentAlignment.MiddleLeft | ContentAlignment.MiddleRight)) != 0) + top = (rect.Height / 2) - (element.Height / 2) + rect.Y; + + return new RectangleF(lft, top, element.Width, element.Height); + } + + #endregion + + #region -- Private methods -- + + /// + /// Arranges the pulses. + /// + private void ArrangePulses() + { + centerRect = new RectangleF(pulseWidth, pulseWidth, Width - 2 * pulseWidth, Height - 2 * pulseWidth); + for (var i = 1; i <= pulses.Length; i++) + { + pulses[i - 1] = new RectangleF( + pulseWidth * i / (float)pulses.Length, + pulseWidth * i / (float)pulses.Length, + Width - 2 * pulseWidth * i / pulses.Length, + Height - 2 * pulseWidth * i / pulses.Length + ); + pulseColors[i - 1] = Color.FromArgb((int)(Math.Min(pulses[i - 1].X * 255 / pulseWidth, 255)), Color.White); + } + } + + /// + /// Inflates the pulses. + /// + private void InflatePulses() + { + for (var i = 0; i < pulses.Length; i++) + { + pulses[i].Inflate(PulseSpeed, PulseSpeed); + if (pulses[i].Width > Width || pulses[i].Height > Height || pulses[i].X < 0 || pulses[i].Y < 0) + pulses[i] = new RectangleF(pulseWidth, pulseWidth, Width - 2 * pulseWidth, Height - 2 * pulseWidth); + pulseColors[i] = Color.FromArgb((int)(Math.Min(pulses[i].X * 255 / pulseWidth, 255)), PulseColor); + } + } + + #endregion + + } +} diff --git a/JY.Control/RingProgramBar.cs b/JY.Control/RingProgramBar.cs new file mode 100644 index 0000000..dde63df --- /dev/null +++ b/JY.Control/RingProgramBar.cs @@ -0,0 +1,141 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace JYControl +{ + public class RingProgramBar : Control + { + //这个写最上面是因为我自己也不懂是啥意思,只知道界面控件高速的重绘容易产生闪烁的问题,这个加了就不会有 + protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; return cp; } } + + //-------------------颜色 + private Color bgColor = Color.FromArgb(224, 224, 224); //背景边框颜色 + private Color sectorColor = Color.FromArgb(109, 179, 63); //扇形颜色 + + [Category("控件属性")] + [Description("背景边框颜色")] + public Color BgColor + { + get { return this.bgColor; } + set + { + this.bgColor = value; + this.Invalidate(); + } + } + + [Category("控件属性")] + [Description("扇形颜色")] + public Color SectorColor + { + get { return this.sectorColor; } + set + { + this.sectorColor = value; + this.Invalidate(); + } + } + + private int borderWidth = 2; //边框宽度 + + [Category("控件属性")] + [Description("边框宽度")] + public int BorderWidth + { + get { return this.borderWidth; } + set + { + this.borderWidth = value; + this.Invalidate(); + } + } + + /// + /// 圆形进度条实心 + /// + public RingProgramBar() + { + InitControl(); + this.SizeChanged += delegate + { + this.Invalidate(); //重绘控件 + }; + } + + int maxValue = 100; //进度最大值 + private int progress = 0; + /// + /// 进度值 + /// + [Category("控件属性")] + [Description("进度值,最大值100")] + public int Progress + { + get { return this.progress; } + set + { + if (value > this.maxValue) + { + return; + } + this.progress = value; + this.Invalidate(); + } + } + + /// + /// 初始化控件参数 + /// + private void InitControl() + { + this.Width = 200; + this.Height = 200; + } + + //对Control进行绘制 + protected override void OnPaint(PaintEventArgs e) + { + DrawShape(e.Graphics); //绘制控件样式 + } + + /// + /// 画图 + /// + /// 画图工具类 + private void DrawShape(Graphics g) + { + if (this.Width < borderWidth*4 || this.Height < borderWidth*4) + { + return; + } + g.SmoothingMode = SmoothingMode.AntiAlias; //消除锯齿,也就是抗锯齿什么鬼东西 + g.InterpolationMode = InterpolationMode.HighQualityBicubic; + g.CompositingQuality = CompositingQuality.HighQuality; + + RectangleF bg_rectangle = new RectangleF(0+ borderWidth, 0+ borderWidth, Width - borderWidth * 2, Height - borderWidth * 2); //控件整体坐标 + + g.DrawEllipse(new Pen(bgColor, borderWidth), bg_rectangle); //画背景圆 + + Rectangle rl = new Rectangle(0 + borderWidth , 0 + borderWidth , this.Width - borderWidth * 2, this.Height - borderWidth * 2); + + decimal topAngle = (this.progress * 1.0M / this.maxValue) * 360M;//计算进度条划过的度数 + g.DrawArc(new Pen(sectorColor,borderWidth), rl, 0, (float)topAngle); //填充环形 + + + SizeF fs = g.MeasureString(this.progress.ToString() + "%", this.Font);//计算文字的范围 + //SizeF fs = g.MeasureString(this.progress.ToString(), this.Font);//计算文字的范围 + + g.DrawString(this.progress.ToString() + "%", this.Font, new SolidBrush(this.ForeColor), + //g.DrawString(this.progress.ToString(), this.Font, new SolidBrush(this.ForeColor), + bg_rectangle.X + bg_rectangle.Width / 2 - fs.Width / 2, bg_rectangle.Y + bg_rectangle.Height / 2 - fs.Height / 2); + } + + + } +} diff --git a/JY.Control/RoundButton.Designer.cs b/JY.Control/RoundButton.Designer.cs new file mode 100644 index 0000000..aadb0ce --- /dev/null +++ b/JY.Control/RoundButton.Designer.cs @@ -0,0 +1,36 @@ +namespace JYControl +{ + partial class RoundButton + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/JY.Control/RoundButton.cs b/JY.Control/RoundButton.cs new file mode 100644 index 0000000..87aff66 --- /dev/null +++ b/JY.Control/RoundButton.cs @@ -0,0 +1,383 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace JYControl +{ + //public partial class RoundButton : Button + //{ + // public RoundButton() + // { + // InitializeComponent(); + // } + + // protected override void OnPaint(PaintEventArgs pe) + // { + // base.OnPaint(pe); + // } + //} + public partial class RoundButton : Button + { + #region --成员变量-- + + RectangleF rect = new RectangleF();//控件矩形 + bool mouseEnter;//鼠标是否进入控件区域的标志 + bool buttonPressed;//按钮是否按下 + bool buttonClicked;//按钮是否被点击 + #endregion + + #region --属性-- + + #region 形状 + + /// + /// 设置或获取圆形按钮的圆的边距离方框边的距离 + /// + [Browsable(true), DefaultValue(2)] + [Category("Appearance")] + public int DistanceToBorder { get; set; } + + #endregion + + #region 填充色 + + /// + /// 获取或设置按钮主体颜色 + /// + /// The color of the focus. + [Browsable(true), DefaultValue(typeof(Color), "DodgerBlue"), Description("按钮主体渐变起始颜色")] + [Category("Appearance")] + public Color ButtonCenterColorEnd { get; set; } + + /// + /// 获取或设置按钮主体颜色 + /// + [Browsable(true), DefaultValue(typeof(Color), "CornflowerBlue"), Description("按钮主体渐变终点颜色")] + [Category("Appearance")] + public Color ButtonCenterColorStart { get; set; } + + /// + /// 获取或设置按钮主体颜色渐变方向 + /// + [Browsable(true), DefaultValue(90), Description("按钮主体颜色渐变方向,X轴顺时针开始")] + [Category("Appearance")] + public int GradientAngle { get; set; } + + /// + /// 是否显示中间标志 + /// + [Browsable(true), DefaultValue(typeof(bool), "true"), Description("是否显示中间标志")] + [Category("Appearance")] + public bool IsShowIcon { get; set; } + + /// + /// 按钮中间标志填充色 + /// + [Browsable(true), DefaultValue(typeof(Color), "Black"), Description("按钮中间标志填充色")] + [Category("Appearance")] + public Color IconColor { get; set; } + + + #endregion + + #region 边框 + + /// + /// 获取或设置边框大小 + /// + [Browsable(true), DefaultValue(4), Description("按钮边框大小")] + [Category("Appearance")] + public int BorderWidth { get; set; } + + /// + /// 获取或设置按钮边框颜色 + /// + /// The color of the focus. + [Browsable(true), DefaultValue(typeof(Color), "Black"), Description("按钮边框颜色")] + [Category("Appearance")] + public Color BorderColor { get; set; } + + /// + /// 获取或设置边框透明度 + /// + [Browsable(true), DefaultValue(200), Description("设置边框透明度:0-255")] + [Category("Appearance")] + public int BorderTransparent { get; set; } + + /// + /// 获取或设置按钮获取焦点后边框颜色 + /// + /// The color of the focus. + [Browsable(true), DefaultValue(typeof(Color), "Orange"), Description("按钮获得焦点后的边框颜色")] + [Category("Appearance")] + public Color FocusBorderColor { get; set; } + + #endregion + + #endregion + + #region --构造函数-- + /// + /// 构造函数 + /// + public RoundButton() + { + // 控件风格 + SetStyle(ControlStyles.SupportsTransparentBackColor, true); + SetStyle(ControlStyles.OptimizedDoubleBuffer, true); + SetStyle(ControlStyles.AllPaintingInWmPaint, true); + SetStyle(ControlStyles.ResizeRedraw, true); + SetStyle(ControlStyles.UserPaint, true); + //初始值设定 + this.Height = this.Width = 80; + + DistanceToBorder = 4; + ButtonCenterColorStart = Color.CornflowerBlue; + ButtonCenterColorEnd = Color.DodgerBlue; + BorderColor = Color.Black; + FocusBorderColor = Color.Orange; + IconColor = Color.Black; + BorderWidth = 4; + BorderTransparent = 200; + GradientAngle = 90; + + mouseEnter = false; + buttonPressed = false; + buttonClicked = false; + IsShowIcon = true; + + InitializeComponent(); + } + #endregion + + #region --重写部分事件-- + + #region OnPaint事件 + + /// + /// 控件绘制 + /// + /// + protected override void OnPaint(PaintEventArgs pevent) + { + //base.OnPaint(pevent); + base.OnPaintBackground(pevent); + + Graphics g = pevent.Graphics; + g.InterpolationMode = InterpolationMode.HighQualityBicubic; + g.SmoothingMode = SmoothingMode.AntiAlias;//抗锯齿 + + myResize();//调整圆形区域 + + var brush = new LinearGradientBrush(rect, ButtonCenterColorStart, ButtonCenterColorEnd, GradientAngle); + + PaintShape(g, brush, rect);//绘制按钮中心区域 + + DrawBorder(g);//绘制边框 + + DrawStateIcon(g);//绘制按钮功能标志 + + if (mouseEnter) + { + DrawHighLight(g);//绘制高亮区域 + DrawStateIcon(g);//绘制按钮功能标志 + } + } + + #endregion + + #region 鼠标 + + /// + /// 鼠标点击事件 + /// + /// + protected override void OnMouseClick(MouseEventArgs e) + { + base.OnMouseClick(e); + buttonClicked = !buttonClicked; + } + /// + /// Raises the event. + /// + /// A that contains the event data. + protected override void OnMouseUp(MouseEventArgs e) + { + base.OnMouseUp(e); + if (e.Button != MouseButtons.Left) return; + buttonPressed = false; + base.Invalidate(); + } + + /// + /// Raises the event. + /// + /// A that contains the event data. + protected override void OnMouseDown(MouseEventArgs e) + { + base.OnMouseDown(e); + if (e.Button != MouseButtons.Left) return; + buttonPressed = true; + } + + /// + /// 鼠标进入按钮 + /// + /// + protected override void OnMouseEnter(EventArgs e) + { + base.OnMouseEnter(e); + mouseEnter = true; + } + + /// + /// 鼠标离开控件 + /// + /// + protected override void OnMouseLeave(EventArgs e) + { + base.OnMouseLeave(e); + mouseEnter = false; + } + + #endregion + #endregion + + #region --自定义函数-- + + /// + /// 绘制中心区域标志 + /// + /// + private void DrawStateIcon(Graphics g) + { + if (IsShowIcon) + { + if (buttonClicked) + { + GraphicsPath startIconPath = new GraphicsPath(); + int W = base.Width / 3; + Point p1 = new Point(W, W); + Point p2 = new Point(2 * W, W); + Point p3 = new Point(2 * W, 2 * W); + Point p4 = new Point(W, 2 * W); + Point[] pts = { p1, p2, p3, p4 }; + startIconPath.AddLines(pts); + Brush brush = new SolidBrush(IconColor); + g.FillPath(brush, startIconPath); + } + else + { + GraphicsPath stopIconPath = new GraphicsPath(); + int W = base.Width / 4; + Point p1 = new Point(3 * W / 2, W); + Point p2 = new Point(3 * W / 2, 3 * W); + Point p3 = new Point(3 * W, 2 * W); + Point[] pts = { p1, p2, p3, }; + stopIconPath.AddLines(pts); + Brush brush = new SolidBrush(IconColor); + g.FillPath(brush, stopIconPath); + } + } + } + + /// + /// 重新确定控件大小 + /// + protected void myResize() + { + int x = DistanceToBorder; + int y = DistanceToBorder; + int width = this.Width - 2 * DistanceToBorder; + int height = this.Height - 2 * DistanceToBorder; + rect = new RectangleF(x, y, width, height); + } + + /// + /// 绘制高亮效果 + /// + /// Graphic对象 + protected virtual void DrawHighLight(Graphics g) + { + RectangleF highlightRect = rect; + highlightRect.Inflate(-BorderWidth / 2, -BorderWidth / 2); + Brush brush = Brushes.DodgerBlue; + if (buttonPressed) + { + brush = new LinearGradientBrush(rect, ButtonCenterColorStart, ButtonCenterColorEnd, GradientAngle); + } + + else + { + brush = new LinearGradientBrush(rect, Color.FromArgb(60, Color.White), + Color.FromArgb(60, Color.White), GradientAngle); + } + PaintShape(g, brush, highlightRect); + } + + /// + /// 绘制边框 + /// + /// Graphics对象 + protected virtual void DrawBorder(Graphics g) + { + Pen p = new Pen(BorderColor); + if (Focused) + { + p.Color = FocusBorderColor;//外圈获取焦点后的颜色 + p.Width = BorderWidth; + PaintShape(g, p, rect); + } + else + { + p.Width = BorderWidth; + PaintShape(g, p, rect); + } + + } + + /// + /// + /// + /// Graphic对象 + protected virtual void DrawPressState(Graphics g) + { + RectangleF pressedRect = rect; + pressedRect.Inflate(-2, -2); + Brush brush = new LinearGradientBrush(rect, Color.FromArgb(60, Color.White), + Color.FromArgb(60, Color.White), GradientAngle); + PaintShape(g, brush, pressedRect); + } + + /// + /// 绘制图形 + /// + /// Graphics对象 + /// Pen对象 + /// RectangleF对象 + protected virtual void PaintShape(Graphics g, Pen pen, RectangleF rect) + { + g.DrawEllipse(pen, rect); + } + + /// + /// 绘制图形 + /// + /// Graphics对象 + /// Brush对象 + /// Rectangle对象 + protected virtual void PaintShape(Graphics g, Brush brush, RectangleF rect) + { + g.FillEllipse(brush, rect); + } + + #endregion + } +} diff --git a/JY.Control/TextBoxWatermark.cs b/JY.Control/TextBoxWatermark.cs new file mode 100644 index 0000000..861a905 --- /dev/null +++ b/JY.Control/TextBoxWatermark.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace JYControl +{ + /// + /// TextBox添加水印文字 + /// + [ToolboxBitmap(typeof(TextBox))] + + public class WatermarkTextBox : TextBox + { + private string _watermark; + private Color _watermarkColor = Color.DarkGray; + private const int WM_PAINT = 0xF; + + public WatermarkTextBox() + : base() + { + } + /// + /// 输入需要显示水印文字 + /// + /// + [Category("控件属性")] + [Description("输入需要显示水印文字")] + [DefaultValue("")] + public string Watermark + { + get { return _watermark; } + set + { + _watermark = value; + base.Invalidate(); + } + } + + /// + /// 改变水印文字的颜色 + /// + /// + [Category("控件属性")] + [Description("改变水印文字的颜色")] + [DefaultValue(typeof(Color), "DarkGray")] + public Color WatermarkColor + { + get { return _watermarkColor; } + set + { + _watermarkColor = value; + base.Invalidate(); + } + } + + protected override void WndProc(ref Message m) + { + base.WndProc(ref m); + if (m.Msg == WM_PAINT) + { + WmPaint(ref m); + } + } + + private void WmPaint(ref Message m) + { + using (Graphics graphics = Graphics.FromHwnd(base.Handle)) + { + if (Text.Length == 0 + && !string.IsNullOrEmpty(_watermark) + && !Focused) + { + TextFormatFlags format = + TextFormatFlags.EndEllipsis | + TextFormatFlags.VerticalCenter; + + if (RightToLeft == RightToLeft.Yes) + { + format |= TextFormatFlags.RightToLeft | TextFormatFlags.Right; + } + + TextRenderer.DrawText( + graphics, + _watermark, + Font, + base.ClientRectangle, + _watermarkColor, + format); + } + } + } + } +} diff --git a/JY.Control/TreeViewEx.Designer.cs b/JY.Control/TreeViewEx.Designer.cs new file mode 100644 index 0000000..e163d88 --- /dev/null +++ b/JY.Control/TreeViewEx.Designer.cs @@ -0,0 +1,43 @@ +namespace JYControl +{ + partial class TreeViewEx + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // TreeViewEx + // + this.Name = "NaviButton"; + this.Size = new System.Drawing.Size(133, 57); + this.ResumeLayout(false); + + } + + #endregion + } +} diff --git a/JY.Control/TreeViewEx.cs b/JY.Control/TreeViewEx.cs new file mode 100644 index 0000000..841017d --- /dev/null +++ b/JY.Control/TreeViewEx.cs @@ -0,0 +1,649 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Windows.Forms; +using JYControl.Properties; + +namespace JYControl +{ + /// + /// Class TreeViewEx. + /// Implements the + /// + /// + public partial class TreeViewEx : TreeView + { + + /// + /// The ws vscroll + /// + private const int WS_VSCROLL = 2097152; + + /// + /// The GWL style + /// + private const int GWL_STYLE = -16; + + /// + /// The LST tips + /// + private Dictionary _lstTips = new Dictionary(); + + /// + /// The tip font + /// + private Font _tipFont = new Font("Arial Unicode MS", 12f); + + /// + /// The tip image + /// + private Image _tipImage = JYControl.Properties.Resources.tips; + + /// + /// The is show tip + /// + private bool _isShowTip = false; + + /// + /// The is show by custom model + /// + private bool _isShowByCustomModel = true; + + /// + /// The node height + /// + private int _nodeHeight = 50; + + /// + /// The node down pic + /// + private Image _nodeDownPic = JYControl.Properties.Resources.list_add; + + /// + /// The node up pic + /// + private Image _nodeUpPic = JYControl.Properties.Resources.list_subtract; + + /// + /// The node background color + /// + private Color _nodeBackgroundColor = Color.White; + + /// + /// The node fore color + /// + private Color _nodeForeColor = Color.FromArgb(62, 62, 62); + + /// + /// The node is show split line + /// + private bool _nodeIsShowSplitLine = false; + + /// + /// The node split line color + /// + private Color _nodeSplitLineColor = Color.FromArgb(232, 232, 232); + + /// + /// The m node selected color + /// + private Color m_nodeSelectedColor = Color.FromArgb(255, 77, 59); + + /// + /// The m node selected fore color + /// + private Color m_nodeSelectedForeColor = Color.White; + + /// + /// The parent node can select + /// + private bool _parentNodeCanSelect = true; + + /// + /// The tree font size + /// + private SizeF treeFontSize = SizeF.Empty; + + /// + /// The BLN has v bar + /// + private bool blnHasVBar = false; + + /// + /// Gets or sets the LST tips. + /// + /// The LST tips. + public Dictionary LstTips + { + get + { + return this._lstTips; + } + set + { + this._lstTips = value; + } + } + + /// + /// Gets or sets the tip font. + /// + /// The tip font. + [Category("自定义属性"), Description("角标文字字体")] + public Font TipFont + { + get + { + return this._tipFont; + } + set + { + this._tipFont = value; + } + } + + /// + /// Gets or sets the tip image. + /// + /// The tip image. + [Category("自定义属性"), Description("是否显示角标")] + public Image TipImage + { + get + { + return this._tipImage; + } + set + { + this._tipImage = value; + } + } + + /// + /// Gets or sets a value indicating whether this instance is show tip. + /// + /// true if this instance is show tip; otherwise, false. + [Category("自定义属性"), Description("是否显示角标")] + public bool IsShowTip + { + get + { + return this._isShowTip; + } + set + { + this._isShowTip = value; + } + } + + /// + /// Gets or sets a value indicating whether this instance is show by custom model. + /// + /// true if this instance is show by custom model; otherwise, false. + [Category("自定义属性"), Description("使用自定义模式")] + public bool IsShowByCustomModel + { + get + { + return this._isShowByCustomModel; + } + set + { + this._isShowByCustomModel = value; + } + } + + /// + /// Gets or sets the height of the node. + /// + /// The height of the node. + [Category("自定义属性"), Description("节点高度(IsShowByCustomModel=true时生效)")] + public int NodeHeight + { + get + { + return this._nodeHeight; + } + set + { + this._nodeHeight = value; + base.ItemHeight = value; + } + } + + /// + /// Gets or sets the node down pic. + /// + /// The node down pic. + [Category("自定义属性"), Description("下翻图标(IsShowByCustomModel=true时生效)")] + public Image NodeDownPic + { + get + { + return this._nodeDownPic; + } + set + { + this._nodeDownPic = value; + } + } + + /// + /// Gets or sets the node up pic. + /// + /// The node up pic. + [Category("自定义属性"), Description("上翻图标(IsShowByCustomModel=true时生效)")] + public Image NodeUpPic + { + get + { + return this._nodeUpPic; + } + set + { + this._nodeUpPic = value; + } + } + + /// + /// Gets or sets the color of the node background. + /// + /// The color of the node background. + [Category("自定义属性"), Description("节点背景颜色(IsShowByCustomModel=true时生效)")] + public Color NodeBackgroundColor + { + get + { + return this._nodeBackgroundColor; + } + set + { + this._nodeBackgroundColor = value; + } + } + + /// + /// Gets or sets the color of the node fore. + /// + /// The color of the node fore. + [Category("自定义属性"), Description("节点字体颜色(IsShowByCustomModel=true时生效)")] + public Color NodeForeColor + { + get + { + return this._nodeForeColor; + } + set + { + this._nodeForeColor = value; + } + } + + /// + /// Gets or sets a value indicating whether [node is show split line]. + /// + /// true if [node is show split line]; otherwise, false. + [Category("自定义属性"), Description("节点是否显示分割线(IsShowByCustomModel=true时生效)")] + public bool NodeIsShowSplitLine + { + get + { + return this._nodeIsShowSplitLine; + } + set + { + this._nodeIsShowSplitLine = value; + } + } + + /// + /// Gets or sets the color of the node split line. + /// + /// The color of the node split line. + [Category("自定义属性"), Description("节点分割线颜色(IsShowByCustomModel=true时生效)")] + public Color NodeSplitLineColor + { + get + { + return this._nodeSplitLineColor; + } + set + { + this._nodeSplitLineColor = value; + } + } + + /// + /// Gets or sets the color of the node selected. + /// + /// The color of the node selected. + [Category("自定义属性"), Description("选中节点背景颜色(IsShowByCustomModel=true时生效)")] + public Color NodeSelectedColor + { + get + { + return this.m_nodeSelectedColor; + } + set + { + this.m_nodeSelectedColor = value; + } + } + + /// + /// Gets or sets the color of the node selected fore. + /// + /// The color of the node selected fore. + [Category("自定义属性"), Description("选中节点字体颜色(IsShowByCustomModel=true时生效)")] + public Color NodeSelectedForeColor + { + get + { + return this.m_nodeSelectedForeColor; + } + set + { + this.m_nodeSelectedForeColor = value; + } + } + + /// + /// Gets or sets a value indicating whether [parent node can select]. + /// + /// true if [parent node can select]; otherwise, false. + [Category("自定义属性"), Description("父节点是否可选中")] + public bool ParentNodeCanSelect + { + get + { + return this._parentNodeCanSelect; + } + set + { + this._parentNodeCanSelect = value; + } + } + /// + /// Initializes a new instance of the class. + /// + public TreeViewEx() + { + base.HideSelection = false; + base.DrawMode = TreeViewDrawMode.OwnerDrawAll; + base.DrawNode += new DrawTreeNodeEventHandler(this.treeview_DrawNode); + base.NodeMouseClick += new TreeNodeMouseClickEventHandler(this.TreeViewEx_NodeMouseClick); + base.SizeChanged += new EventHandler(this.TreeViewEx_SizeChanged); + base.AfterSelect += new TreeViewEventHandler(this.TreeViewEx_AfterSelect); + base.FullRowSelect = true; + base.ShowLines = false; + base.ShowPlusMinus = false; + base.ShowRootLines = false; + this.BackColor = Color.White; + this.BorderStyle = System.Windows.Forms.BorderStyle.None; + DoubleBuffered = true; + } + /// + /// 重写 。 + /// + /// 要处理的 Windows。 + protected override void WndProc(ref Message m) + { + + if (m.Msg == 0x0014) // 禁掉清除背景消息WM_ERASEBKGND + + return; + + base.WndProc(ref m); + + } + /// + /// Handles the AfterSelect event of the TreeViewEx control. + /// + /// The source of the event. + /// The instance containing the event data. + private void TreeViewEx_AfterSelect(object sender, TreeViewEventArgs e) + { + try + { + if (e.Node != null) + { + if (!this._parentNodeCanSelect) + { + if (e.Node.Nodes.Count > 0) + { + e.Node.Expand(); + base.SelectedNode = e.Node.Nodes[0]; + } + } + } + } + catch (Exception ex) + { + throw ex; + } + } + + /// + /// Handles the SizeChanged event of the TreeViewEx control. + /// + /// The source of the event. + /// The instance containing the event data. + private void TreeViewEx_SizeChanged(object sender, EventArgs e) + { + this.Refresh(); + } + + /// + /// Handles the NodeMouseClick event of the TreeViewEx control. + /// + /// The source of the event. + /// The instance containing the event data. + private void TreeViewEx_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) + { + try + { + if (e.Node != null) + { + if (e.Node.Nodes.Count > 0) + { + if (e.Node.IsExpanded) + { + e.Node.Collapse(); + } + else + { + e.Node.Expand(); + } + } + if (base.SelectedNode != null) + { + if (base.SelectedNode == e.Node && e.Node.IsExpanded) + { + if (!this._parentNodeCanSelect) + { + if (e.Node.Nodes.Count > 0) + { + base.SelectedNode = e.Node.Nodes[0]; + } + } + } + } + } + } + catch (Exception ex) + { + throw ex; + } + } + + /// + /// Handles the DrawNode event of the treeview control. + /// + /// The source of the event. + /// The instance containing the event data. + private void treeview_DrawNode(object sender, DrawTreeNodeEventArgs e) + { + try + { + + if (e.Node == null || !this._isShowByCustomModel || (e.Node.Bounds.Width <= 0 && e.Node.Bounds.Height <= 0 && e.Node.Bounds.X <= 0 && e.Node.Bounds.Y <= 0)) + { + e.DrawDefault = true; + } + else + { + e.Graphics.SetGDIHigh(); + if (base.Nodes.IndexOf(e.Node) == 0) + { + this.blnHasVBar = this.IsVerticalScrollBarVisible(); + } + Font font = e.Node.NodeFont; + if (font == null) + { + font = ((TreeView)sender).Font; + } + if (this.treeFontSize == SizeF.Empty) + { + this.treeFontSize = this.GetFontSize(font, e.Graphics); + } + bool flag = false; + int intLeft = 0; + if (CheckBoxes) + { + intLeft = 20; + } + int num = 0; + if (base.ImageList != null && base.ImageList.Images.Count > 0 && e.Node.ImageIndex >= 0 && e.Node.ImageIndex < base.ImageList.Images.Count) + { + flag = true; + num = (e.Bounds.Height - base.ImageList.ImageSize.Height) / 2; + intLeft += base.ImageList.ImageSize.Width; + } + + intLeft += e.Node.Level * Indent; + + if ((e.State == TreeNodeStates.Selected || e.State == TreeNodeStates.Focused || e.State == (TreeNodeStates.Focused | TreeNodeStates.Selected)) && (this._parentNodeCanSelect || e.Node.Nodes.Count <= 0)) + { + e.Graphics.FillRectangle(new SolidBrush(this.m_nodeSelectedColor), new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(base.Width, e.Node.Bounds.Height))); + e.Graphics.DrawString(e.Node.Text, font, new SolidBrush(this.m_nodeSelectedForeColor), (float)e.Bounds.X + intLeft, (float)e.Bounds.Y + ((float)this._nodeHeight - this.treeFontSize.Height) / 2f); + } + else + { + e.Graphics.FillRectangle(new SolidBrush(this._nodeBackgroundColor), new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(base.Width, e.Node.Bounds.Height))); + e.Graphics.DrawString(e.Node.Text, font, new SolidBrush(this._nodeForeColor), (float)e.Bounds.X + intLeft, (float)e.Bounds.Y + ((float)this._nodeHeight - this.treeFontSize.Height) / 2f); + } + if (CheckBoxes) + { + Rectangle rectCheck = new Rectangle(e.Bounds.X + 3 + e.Node.Level * Indent, e.Bounds.Y + (e.Bounds.Height - 16) / 2, 16, 16); + GraphicsPath pathCheck = rectCheck.CreateRoundedRectanglePath(3); + e.Graphics.FillPath(new SolidBrush(Color.FromArgb(247, 247, 247)), pathCheck); + if (e.Node.Checked) + { + e.Graphics.DrawLines(new Pen(new SolidBrush(m_nodeSelectedColor), 2), new Point[] + { + new Point(rectCheck.Left+2,rectCheck.Top+8), + new Point(rectCheck.Left+6,rectCheck.Top+12), + new Point(rectCheck.Right-4,rectCheck.Top+4) + }); + } + + e.Graphics.DrawPath(new Pen(new SolidBrush(Color.FromArgb(200, 200, 200))), pathCheck); + } + if (flag) + { + int num2 = e.Bounds.X - num - base.ImageList.ImageSize.Width; + if (num2 < 0) + { + num2 = 3; + } + e.Graphics.DrawImage(base.ImageList.Images[e.Node.ImageIndex], new Rectangle(new Point(num2 + intLeft - base.ImageList.ImageSize.Width, e.Bounds.Y + num), base.ImageList.ImageSize)); + } + if (this._nodeIsShowSplitLine) + { + e.Graphics.DrawLine(new Pen(this._nodeSplitLineColor, 1f), new Point(0, e.Bounds.Y + this._nodeHeight - 1), new Point(base.Width, e.Bounds.Y + this._nodeHeight - 1)); + } + bool flag2 = false; + if (e.Node.Nodes.Count > 0) + { + if (e.Node.IsExpanded && this._nodeUpPic != null) + { + e.Graphics.DrawImage(this._nodeUpPic, new Rectangle(base.Width - (this.blnHasVBar ? 50 : 30), e.Bounds.Y + (this._nodeHeight - 20) / 2, 20, 20)); + } + else if (this._nodeDownPic != null) + { + e.Graphics.DrawImage(this._nodeDownPic, new Rectangle(base.Width - (this.blnHasVBar ? 50 : 30), e.Bounds.Y + (this._nodeHeight - 20) / 2, 20, 20)); + } + flag2 = true; + } + if (this._isShowTip && this._lstTips.ContainsKey(e.Node.Name) && !string.IsNullOrWhiteSpace(this._lstTips[e.Node.Name])) + { + int num3 = base.Width - (this.blnHasVBar ? 50 : 30) - (flag2 ? 20 : 0); + int num4 = e.Bounds.Y + (this._nodeHeight - 20) / 2; + e.Graphics.DrawImage(this._tipImage, new Rectangle(num3, num4, 20, 20)); + SizeF sizeF = e.Graphics.MeasureString(this._lstTips[e.Node.Name], this._tipFont, 100, StringFormat.GenericTypographic); + e.Graphics.DrawString(this._lstTips[e.Node.Name], this._tipFont, new SolidBrush(Color.White), (float)(num3 + 10) - sizeF.Width / 2f - 3f, (float)(num4 + 10) - sizeF.Height / 2f); + } + } + } + catch (Exception ex) + { + throw ex; + } + } + + /// + /// Gets the size of the font. + /// + /// The font. + /// The g. + /// SizeF. + private SizeF GetFontSize(Font font, Graphics g = null) + { + SizeF result; + try + { + bool flag = false; + if (g == null) + { + g = base.CreateGraphics(); + flag = true; + } + SizeF sizeF = g.MeasureString("a", font, 100, StringFormat.GenericTypographic); + if (flag) + { + g.Dispose(); + } + result = sizeF; + } + catch (Exception ex) + { + throw ex; + } + return result; + } + + /// + /// Gets the window long. + /// + /// The HWND. + /// Index of the n. + /// System.Int32. + [DllImport("user32", CharSet = CharSet.Auto)] + private static extern int GetWindowLong(IntPtr hwnd, int nIndex); + + /// + /// Determines whether [is vertical scroll bar visible]. + /// + /// true if [is vertical scroll bar visible]; otherwise, false. + private bool IsVerticalScrollBarVisible() + { + return base.IsHandleCreated && (TreeViewEx.GetWindowLong(base.Handle, -16) & 2097152) != 0; + } + } +} diff --git a/JY.Control/TreeViewEx.resx b/JY.Control/TreeViewEx.resx new file mode 100644 index 0000000..e5858cc --- /dev/null +++ b/JY.Control/TreeViewEx.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + \ No newline at end of file diff --git a/JY.DAL/IDbHelper.cs b/JY.DAL/IDbHelper.cs new file mode 100644 index 0000000..06ef540 --- /dev/null +++ b/JY.DAL/IDbHelper.cs @@ -0,0 +1,213 @@ +using JY.Model; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.DAL +{ + public interface IDbHelper + { + /// + /// 保存报警数据 + /// + /// + /// + int AddAlarmData(AlarmData m); + /// + /// 缓存报警数据 + /// + /// + /// + /// + int AddAlarmCacheData(string tablename, List m); + + /// + /// 查询缓存表报警信息 + /// + /// 开始时间 + /// 结束时间 + /// + List GetAlarmCacheData(); + /// + /// 删除未更新数据 + /// + /// + int DeleteAlarmCacheData(); + /// + /// 查询报警信息 + /// + /// 开始时间 + /// 结束时间 + /// + List GetAlarmData(string strDate1, string strDate2); + /// + /// 查询进站信息 + /// + /// + /// + List GetFeedingData(string strCode); + /// + /// 新增产品型号 + /// + /// 机型信息 + /// + int AddProductModel(ProductModel entity); + + /// + /// 删除本地型号 + /// + /// 型号 + /// + void DelProductModel(string modeltype); + + /// + /// 获取产品型号列表 + /// + /// 产品型号 + /// + List GetProductModelList(string strProdType = ""); + + /// + /// 保存产品类型配置参数 + /// + /// + bool AddProductParaList(List list); + + /// + /// 获取产品参数通过产品型号 + /// + /// 产品型号 + /// + List GetProductParaByProdModel(string strModelType); + + /// + /// 标准轴参数保存 + /// + /// + /// + /// + /// + bool InsertPLCConfigBase(List list); + + /// + /// 获取换型操作的基本参数 + /// + /// + List GetPLCConfigBases(); + + /// + /// 获取PLC换型参数绑定值 + /// + /// 产品型号 + /// + List GetPLCConfigPara(string modelName); + + /// + /// 具体型号轴参数保存 + /// + /// + /// + /// + /// + bool InsertPLCConfigParam(List list); + + /// + /// 查询历史数据 + /// + /// + /// + /// + /// + DataTable GetTestData(int type,string strBarCode, string strDate1, string strDate2, string flag); + /// + /// 查询历史数据 + /// + /// + /// + /// + /// + /// + DataTable GetTestData2(int type,int resultType, string strBarCode, string strDate1, string strDate2, string flag); + /// + /// 查询CCD历史数据 + /// + /// + /// + /// + /// + DataTable GetCCDData(string strWorkerNum, string strDate1, string strDate2); + + /// + /// 查询CCD历史数据 + /// + /// + /// + /// + /// + DataTable GetBarInTime(string strBar); + + /// + /// 更新获取进站时间状态 + /// + /// + /// + int UparInTime(string strBar); + /// + /// 按日期查询和时间查询投入产出信息 + /// + /// + /// + /// + List GetProdTotal(string strDate, int Hour); + + /// + /// 更新指定时间的小时产出 + /// + /// 小时产出数据 + /// + int UpdateHourprodData(HourprodEntity enity); + + /// + /// 保存进托盘数据 + /// + /// + /// + /// + int AddInPutTrayID(TrayTestEntry m, ref string strErr); + + /// + /// 保存空托盘排出数据 + /// + /// + /// + /// + int AddOutTrayID(TrayTestEntry m, ref string strErr); + + /// + /// 保存上料数据 + /// + /// + /// + /// + int AddFeedingData(FeedingData m, ref string strErr); + + /// + /// 保存下料数据 + /// + /// + /// + /// + int AddBlankingData(BlankingData m, ref string strErr); + int AddCamInforData(CamInfor m, ref string strErr); + /// + /// 根据工位编码获取异常播报内容 + /// + /// + /// 如果没有找到记录,是否需要插入 + /// + string GetAbnormalVoice(string code, bool needInsert = false); + } +} diff --git a/JY.DAL/IocConfig.cs b/JY.DAL/IocConfig.cs new file mode 100644 index 0000000..0c9d026 --- /dev/null +++ b/JY.DAL/IocConfig.cs @@ -0,0 +1,32 @@ +using JY.DAL.Repository; +using JY.DAL.Service; +using JY.Model; +using Microsoft.Extensions.DependencyInjection; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.DAL +{ + public static class IocConfig + { + public static ServiceProvider Provider { get; private set; } + + public static void Initialize() + { + var services = new ServiceCollection(); + //services.AddScoped(typeof(IRepository<>), typeof(Repository<>)); + services.AddScoped(typeof(IRepository<>), typeof(Repository<>)); + services.AddScoped, Repository>(); + + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + + Provider = services.BuildServiceProvider(); + } + } +} diff --git a/JY.DAL/JY.DAL.csproj b/JY.DAL/JY.DAL.csproj new file mode 100644 index 0000000..9dbd8fb --- /dev/null +++ b/JY.DAL/JY.DAL.csproj @@ -0,0 +1,192 @@ + + + + + + Debug + AnyCPU + {D5889580-58F9-467E-87D3-EFA37A300E67} + Library + Properties + JY.DAL + JY.DAL + v4.8 + 512 + true + + + + + + true + full + false + ..\..\..\..\JY.Inspection\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\BouncyCastle.Cryptography.2.4.0\lib\net461\BouncyCastle.Cryptography.dll + + + ..\packages\CsvHelper.30.0.1\lib\net45\CsvHelper.dll + + + ..\packages\Dapper.1.60.6\lib\net451\Dapper.dll + + + ..\packages\Enums.NET.5.0.0\lib\net461\Enums.NET.dll + + + ..\packages\EPPlus.8.0.8\lib\net462\EPPlus.dll + + + ..\packages\EPPlus.Interfaces.8.0.0\lib\net462\EPPlus.Interfaces.dll + + + ..\packages\ExtendedNumerics.BigDecimal.2025.1001.2.129\lib\net48\ExtendedNumerics.BigDecimal.dll + + + ..\packages\SharpZipLib.1.4.2\lib\netstandard2.0\ICSharpCode.SharpZipLib.dll + + + ..\packages\MathNet.Numerics.Signed.5.0.0\lib\net48\MathNet.Numerics.dll + + + ..\packages\Microsoft.Bcl.AsyncInterfaces.10.0.9\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll + + + ..\packages\Microsoft.Extensions.DependencyInjection.10.0.9\lib\net462\Microsoft.Extensions.DependencyInjection.dll + + + ..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.10.0.9\lib\net462\Microsoft.Extensions.DependencyInjection.Abstractions.dll + + + ..\packages\Microsoft.IO.RecyclableMemoryStream.3.0.1\lib\netstandard2.0\Microsoft.IO.RecyclableMemoryStream.dll + + + ..\packages\Microsoft.Owin.4.2.3\lib\net45\Microsoft.Owin.dll + + + ..\packages\MySql.Data.6.10.9\lib\net452\MySql.Data.dll + + + ..\packages\NPOI.2.7.4\lib\net472\NPOI.Core.dll + + + ..\packages\NPOI.2.7.4\lib\net472\NPOI.OOXML.dll + + + ..\packages\NPOI.2.7.4\lib\net472\NPOI.OpenXml4Net.dll + + + ..\packages\NPOI.2.7.4\lib\net472\NPOI.OpenXmlFormats.dll + + + ..\packages\Owin.1.0\lib\net40\Owin.dll + + + + ..\packages\SixLabors.Fonts.1.0.1\lib\netstandard2.0\SixLabors.Fonts.dll + + + ..\packages\SqlSugar.5.1.4.207\lib\SqlSugar.dll + + + + ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll + + + + ..\packages\System.ComponentModel.Annotations.5.0.0\lib\net461\System.ComponentModel.Annotations.dll + + + + + + + + + + + ..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll + + + + ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + ..\packages\System.Runtime.CompilerServices.Unsafe.6.1.2\lib\net462\System.Runtime.CompilerServices.Unsafe.dll + + + + ..\packages\System.Security.Cryptography.Xml.8.0.2\lib\net462\System.Security.Cryptography.Xml.dll + + + ..\packages\System.Text.Encoding.CodePages.9.0.7\lib\net462\System.Text.Encoding.CodePages.dll + + + ..\packages\System.Threading.Tasks.Extensions.4.6.3\lib\net462\System.Threading.Tasks.Extensions.dll + + + + ..\packages\System.ValueTuple.4.3.0\lib\netstandard1.0\System.ValueTuple.dll + + + + + + + + + + ..\packages\ZString.2.6.0\lib\netstandard2.0\ZString.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + {f7db3a93-fca2-479b-8b2e-380116aae9fc} + JY.Model + + + + + + + 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 + + + + \ No newline at end of file diff --git a/JY.DAL/JY.DAL.csproj.user b/JY.DAL/JY.DAL.csproj.user new file mode 100644 index 0000000..0b24643 --- /dev/null +++ b/JY.DAL/JY.DAL.csproj.user @@ -0,0 +1,6 @@ + + + + ProjectFiles + + \ No newline at end of file diff --git a/JY.DAL/Mapper/AlarmDataMapping.cs b/JY.DAL/Mapper/AlarmDataMapping.cs new file mode 100644 index 0000000..2b3e4ea --- /dev/null +++ b/JY.DAL/Mapper/AlarmDataMapping.cs @@ -0,0 +1,22 @@ +using DapperExtensions.Mapper; +using JY.Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.DAL.Mapper +{ + /// + /// ProdModel表映射,实体名和表名不一样实现映射 + /// + public class AlarmDataMapping : ClassMapper + { + public AlarmDataMapping() + { + Table("tb_alarm"); + AutoMap(); + } + } +} diff --git a/JY.DAL/Mapper/ProductModelMapping.cs b/JY.DAL/Mapper/ProductModelMapping.cs new file mode 100644 index 0000000..5609f8e --- /dev/null +++ b/JY.DAL/Mapper/ProductModelMapping.cs @@ -0,0 +1,22 @@ +using DapperExtensions.Mapper; +using JY.Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.DAL.Mapper +{ + /// + /// ProdModel表映射,实体名和表名不一样实现映射 + /// + public class ProductModelMapping : ClassMapper + { + public ProductModelMapping() + { + Table("tb_ProdModel"); + AutoMap(); + } + } +} diff --git a/JY.DAL/MySQLHelper.cs b/JY.DAL/MySQLHelper.cs new file mode 100644 index 0000000..7b78cb2 --- /dev/null +++ b/JY.DAL/MySQLHelper.cs @@ -0,0 +1,271 @@ +using Dapper; +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using MySql.Data.MySqlClient; +using System.Linq; + +namespace JY.DAL +{ + public class MySqlHelper where T : class + { + /// + /// 数据库连接字符串 + /// + private static readonly string connectionString = ConfigurationManager.ConnectionStrings["MysqlConn"].ConnectionString; + + /// + /// 查询列表 + /// + /// 查询的sql + /// 替换参数 + /// + public static List Query(string sql, object param = null) + { + using (MySqlConnection con = new MySqlConnection(connectionString)) + { + return con.Query(sql, param).ToList(); + } + } + + /// + /// 查询第一个数据 + /// + /// + /// + /// + public static T QueryFirst(string sql, object param = null) + { + using (MySqlConnection con = new MySqlConnection(connectionString)) + { + return con.QueryFirst(sql, param); + } + } + + /// + /// 查询第一个数据没有返回默认值 + /// + /// + /// + /// + public static T QueryFirstOrDefault(string sql, object param = null) + { + using (MySqlConnection con = new MySqlConnection(connectionString)) + { + return con.QueryFirstOrDefault(sql, param); + } + } + + /// + /// 查询单条数据 + /// + /// + /// + /// + public static T QuerySingle(string sql, object param = null) + { + using (MySqlConnection con = new MySqlConnection(connectionString)) + { + return con.QuerySingle(sql, param); + } + } + + /// + /// 查询单条数据没有返回默认值 + /// + /// + /// + /// + public static T QuerySingleOrDefault(string sql, object param = null) + { + using (MySqlConnection con = new MySqlConnection(connectionString)) + { + return con.QuerySingleOrDefault(sql, param); + } + } + + /// + /// 增删改 + /// + /// + /// + /// Number of rows affected + public static int Execute(string sql, object param = null) + { + using (MySqlConnection con = new MySqlConnection(connectionString)) + { + return con.Execute(sql, param); + } + } + + /// + /// Reader获取数据 + /// + /// + /// + /// + public static IDataReader ExecuteReader(string sql, object param) + { + using (MySqlConnection con = new MySqlConnection(connectionString)) + { + return con.ExecuteReader(sql, param); + } + } + + /// + /// 获取数据返回DataTable + /// + /// + /// + /// + public static DataTable QueryTable(string sql, object param = null) + { + using (MySqlConnection con = new MySqlConnection(connectionString)) + { + DataTable table = new DataTable(); + var reader = con.ExecuteReader(sql, param); + table.Load(reader); + return table; + } + } + + /// + /// Scalar获取数据 + /// + /// + /// + /// + public static object ExecuteScalar(string sql, object param = null) + { + using (MySqlConnection con = new MySqlConnection(connectionString)) + { + return con.ExecuteScalar(sql, param); + } + } + + /// + /// Scalar获取数据 + /// + /// + /// + /// + public static T ExecuteScalarForT(string sql, object param = null) + { + using (MySqlConnection con = new MySqlConnection(connectionString)) + { + return con.ExecuteScalar(sql, param); + } + } + + /// + /// 带参数的存储过程 + /// + /// + /// + /// + public static List ExecutePro(string proc, object param = null) + { + using (MySqlConnection con = new MySqlConnection(connectionString)) + { + List list = con.Query(proc, + param, + null, + true, + null, + CommandType.StoredProcedure).ToList(); + return list; + } + } + /// + /// 批量插入T数据,返回影响行数 + /// + /// 对象集合 + /// 影响行数 + public static int Insert(string strsql, List list) + { + using (IDbConnection connection = new MySqlConnection(connectionString)) + { + //return connection.Execute("insert into Person(Name,Remark) values(@Name,@Remark)", list); + return connection.Execute(strsql, list); + } + } + + /// + /// 事务1 - 全SQL + /// + /// 多条SQL + /// param + /// + public static int ExecuteTransaction(string[] sqlarr) + { + using (MySqlConnection con = new MySqlConnection(connectionString)) + { + con.Open(); + using (var transaction = con.BeginTransaction()) + { + try + { + int result = 0; + foreach (var sql in sqlarr) + { + result += con.Execute(sql, null, transaction); + } + + transaction.Commit(); + return result; + } + catch (Exception ex) + { + transaction.Rollback(); + throw ex; + } + finally + { + con.Close(); + } + } + } + } + + /// + /// 事务2 - 声明参数 + ///demo: + ///dic.Add("Insert into Users values (@UserName, @Email, @Address)", + /// new { UserName = "jack", Email = "380234234@qq.com", Address = "上海" }); + /// + /// 多条SQL + /// param + /// + public static int ExecuteTransaction(Dictionary dic) + { + using (MySqlConnection con = new MySqlConnection(connectionString)) + { + con.Open(); + using (var transaction = con.BeginTransaction()) + { + try + { + int result = 0; + foreach (var sql in dic) + { + result += con.Execute(sql.Key, sql.Value, transaction); + } + + transaction.Commit(); + return result; + } + catch (Exception ex) + { + transaction.Rollback(); + throw ex; + } + finally + { + con.Close(); + } + } + } + } + } +} \ No newline at end of file diff --git a/JY.DAL/OpMysqlDataBase.cs b/JY.DAL/OpMysqlDataBase.cs new file mode 100644 index 0000000..35078e6 --- /dev/null +++ b/JY.DAL/OpMysqlDataBase.cs @@ -0,0 +1,525 @@ +using JY.Model; +using System; +using System.Collections.Generic; +using System.Data; +using System.Text; +using System.Threading.Tasks; + +namespace JY.DAL +{ + /// + /// + /// + public class OpMysqlDataBase : IDbHelper + { + /// + /// 保存报警数据 + /// + /// + /// + public int AddAlarmData(AlarmData m) + { + + string strSql = string.Format(@"INSERT INTO tb_alarm (AlarmGuid,PLCAdress,AlarmCode,AlarmContent + ,AlarmType,AlarmDesc,AlarmState,StartTime,EndTime,Flag) + values('{0}','{1}','{2}','{3}','{4}',{5},'{6}','{7}','{8}',{9})" + , m.AlarmGuid, m.PLCAdress, m.AlarmCode, m.AlarmContent, m.AlarmType, m.AlarmDesc, m.AlarmState + , m.StartTime, m.EndTime, m.Flag); + int result = MySqlHelper.Execute(strSql); + return result; + } + + + /// + /// 删除未更新数据 + /// + /// 开始时间 + /// 结束时间 + /// + public int DeleteAlarmCacheData() + { + string strSql = $@"DELETE FROM tb_alarm WHERE Flag=0"; + int result = MySqlHelper.Execute(strSql); + return result; + } + /// + /// 查询报警信息 + /// + /// 开始时间 + /// 结束时间 + /// + public List GetAlarmData(string strDate1, string strDate2) + { + string strSql = $@" SELECT PLCAdress ,AlarmContent,AlarmCode,AlarmTime,StartUpTime ,BurningTime + FROM tb_alarm where AlarmTime >= '{ strDate1 }' and AlarmTime <= '{ strDate2 }' "; + var list = MySqlHelper.Query(strSql); + return list; + + } + + /// + /// 查询进站信息 + /// + /// + /// + public List GetFeedingData(string strCode) + { + string strSql = $@" SELECT * FROM FeedingData where BarCode = '{strCode}' ORDER BY CreateTime"; + var list = SqlHelper.Query(strSql); + return list; + + } + + /// + /// 新增产品型号 + /// + /// 机型信息 + /// + public int AddProductModel(ProductModel entity) + { + string strSql = $@"INSERT INTO `tb_productmodel`(`ModelName`, `Remark`) + VALUES ('{entity.ModelName}', '{entity.Remark}')"; + int result = MySqlHelper.Execute(strSql); + return result; + } + + /// + /// 删除本地型号 + /// + /// 型号 + /// + public void DelProductModel(string modeltype) + { + string strSql = $"delete from tb_productmodel where ModelName='{modeltype}'"; + MySqlHelper.Execute(strSql); + } + + /// + /// 获取产品型号列表 + /// + /// 产品型号 + /// + public List GetProductModelList(string strProdType = "") + { + try + { + string strSql = @"SELECT * FROM `tb_productmodel` "; + if (strProdType != "") + { + strSql += string.Format(" where ModelName='{0}'", strProdType); + } + strSql += " order by ModelName"; + var list = MySqlHelper.Query(strSql); + return list; + } + catch (Exception ex) + { + throw ex; + } + } + + /// + /// 保存产品类型配置参数 + /// + /// + public bool AddProductParaList(List list) + { + List listSql = new List(); + listSql.Add($@"delete from tb_paralist where ModelName='{list[0].ModelName}'"); + foreach (var item in list) + { + listSql.Add($@"INSERT INTO `tb_paralist`(`ModelName`, `ParaName`, `ParaValue`, `Remark`, `UpdateTime`) + VALUES ('{item.ModelName}', '{item.ParaName}', '{item.ParaValue}', '{item.Remark}', '{item.UpdateTime}')"); + } + var result = MySqlHelper.ExecuteTransaction(listSql.ToArray()); + + if (result > 0) + return true; + else + return false; + } + + /// + /// 获取产品参数通过产品型号 + /// + /// 产品型号 + /// + public List GetProductParaByProdModel(string strModelType) + { + string strSql = $@"SELECT pb.ParaName, '{strModelType}' ModelName,pl.ParaValue,pl.Remark,pl.UpdateTime + FROM tb_parabase pb + left join (select * from tb_paralist where ModelName = '{strModelType}' ) as pl + on pb.ParaName = pl.ParaName; "; + + var list = MySqlHelper.Query(strSql); + return list; + } + + /// + /// 标准轴参数保存 + /// + /// + /// + /// + /// + public bool InsertPLCConfigBase(List list) + { + List listSql = new List(); + listSql.Add("delete from tb_plcconfigbase;"); + foreach (var item in list) + { + listSql.Add($@"Insert into tb_plcconfigbase (PLCAddress,PLCRemark,OrderNum) + Values ('{item.PLCAddress}','{item.PLCRemark}',{item.OrderNum});"); + } + var result = MySqlHelper.ExecuteTransaction(listSql.ToArray()); + if (result > 0) + return true; + else + return false; + } + + /// + /// 获取换型操作的基本参数 + /// + /// + public List GetPLCConfigBases() + { + string strSql = string.Format(@"SELECT * FROM `tb_plcconfigbase` + ORDER BY OrderNum"); + var list = MySqlHelper.Query(strSql); + return list; + } + /// + /// 获取PLC换型参数绑定值 + /// + /// 产品型号 + /// + public List GetPLCConfigPara(string modelName) + { + string strSql = $@"SELECT '{modelName}' ModelName,pb.PLCAddress,pc.PLCValue,pc.UpdateTime,pb.PLCRemark,pb.OrderNum + FROM tb_plcconfigbase pb + left join (select * from tb_plcconfig where ModelName='{modelName}') pc + on pb.PLCAddress = pc.PLCAddress + order by pb.OrderNum;"; + var list = MySqlHelper.Query(strSql); + return list; + } + + /// + /// 具体型号轴参数保存 + /// + /// + /// + /// + /// + public bool InsertPLCConfigParam(List list) + { + List listSql = new List(); + listSql.Add($"delete from tb_plcconfig where ModelName='{list[0].ModelName}';"); + foreach (var item in list) + { + listSql.Add($@"INSERT INTO `tb_plcconfig`(`ModelName`, `PLCAddress`, `PLCValue`, `UpdateDate`) + Values ('{item.ModelName}','{item.PLCAddress}',{item.PLCValue}),'{item.UpdateData}';"); + } + var result = MySqlHelper.ExecuteTransaction(listSql.ToArray()); + if (result > 0) + return true; + else + return false; + } + + /// + /// 查询历史数据 + /// + /// + /// + /// + /// + public DataTable GetTestData(int type, string strBarCode, string strDate1, string strDate2, string flag) + { + string strSql = @" SELECT + tb_testvr.TD 通道, + tb_testvr.BarCode 条码, + tb_testvr.Vol 电压, + tb_testvr.IMP 内阻, + tb_testvr.K K值, + tb_testvr.T 温度, + tb_testvr.Length 长度, + tb_testvr.Wide 宽度, + tb_testvr.LMDistance 极边距, + tb_testvr.Thickness 厚度, + tb_testvr.LCDistance 中心距, + DATE_FORMAT(tb_testvr.TestTime,'%Y-%m-%d %H:%i:%s') 测试时间, + tb_testvr.Result 结果, + tb_testvr.Remark 备注, + case when tb_testvr.Flag=1 then '已上传' else '未上传' end 上传状态, + tb_testvr.ProdType 测试型号, + tb_testvr.OCVType 测试类别, + tb_testvr.EquNo 设备编号, + tb_testvr.TaskCode 任务号 + FROM + tb_testvr + where tb_testvr.TestTime >= '" + strDate1 + "' and tb_testvr.TestTime <= '" + strDate2 + "' "; + if (strBarCode != "") + { + strSql += " and tb_testvr.BarCode like '" + strBarCode + "%' "; + } + DataTable dt = MySqlHelper.QueryTable(strSql); + return dt; + } + /// + /// 查询历史数据 + /// + /// + /// + /// + /// + public DataTable GetTestData2(int type,int resultType, string strBarCode, string strDate1, string strDate2, string flag) + { + string strSql = @" SELECT + tb_testvr.TD 通道, + tb_testvr.BarCode 条码, + tb_testvr.Vol 电压, + tb_testvr.IMP 内阻, + tb_testvr.K K值, + tb_testvr.T 温度, + tb_testvr.Length 长度, + tb_testvr.Wide 宽度, + tb_testvr.LMDistance 极边距, + tb_testvr.Thickness 厚度, + tb_testvr.LCDistance 中心距, + DATE_FORMAT(tb_testvr.TestTime,'%Y-%m-%d %H:%i:%s') 测试时间, + tb_testvr.Result 结果, + tb_testvr.Remark 备注, + case when tb_testvr.Flag=1 then '已上传' else '未上传' end 上传状态, + tb_testvr.ProdType 测试型号, + tb_testvr.OCVType 测试类别, + tb_testvr.EquNo 设备编号, + tb_testvr.TaskCode 任务号 + FROM + tb_testvr + where tb_testvr.TestTime >= '" + strDate1 + "' and tb_testvr.TestTime <= '" + strDate2 + "' "; + if (strBarCode != "") + { + strSql += " and tb_testvr.BarCode like '" + strBarCode + "%' "; + } + DataTable dt = MySqlHelper.QueryTable(strSql); + return dt; + } + + + /// + /// 查询CCD数据 + /// + /// + /// + /// + /// + public DataTable GetCCDData(string strWorkerNum, string strDate1, string strDate2) + { + + + string strSql = string.Format(@"SELECT + date_format(data_run.Date, '%m-%d' ) 日期 + ,data_run.Class 班次 + ,data_run.Classtype 班别 + ,data_run.OrderNum 工单号 + ,data_run.Customer 客户名称 + ,sum(IFNULL(data_run.TotalNum,0)) 投入总数 + ,sum(IFNULL(data_run.OK,0)) 良品总数 + ,sum(IFNULL(data_run.NG,0)) 不良总数 + ,CAST(IFNULL(CONVERT(((CONVERT((sum(IFNULL(data_run.NG,0))),FLOAT)/CONVERT((sum(IFNULL(data_run.TotalNum,0))),FLOAT))*100),DOUBLE),0) as CHAR(10))+'%' 不良率 + ,sum(IFNULL(data_run.CanRepaired,0)) 质量缺陷 + ,sum(IFNULL(data_run.NotRepaired,0)) 非质量缺陷 + ,sum(IFNULL(data_run.OtherNG,0)) 其他不良 + ,sum(IFNULL(data_run.SideNG,0)) 侧面不良 + ,sum(IFNULL(data_run.PositiveNG,0)) 正极不良 + ,sum(IFNULL(data_run.NegativeNG,0)) 负极不良 + ,sum(IFNULL(data_run.ChongheNG,0)) 重合不良 + ,sum(IFNULL(data_run.CodeNG,0)) 喷码不良 + ,sum(IFNULL(data_run.SideDrumpack,0)) 侧面凹坑鼓包、变形 + ,sum(IFNULL(data_run.SideDirty,0)) 侧面脏污漏液 + ,sum(IFNULL(data_run.SideScratches,0)) 侧面凸点、划痕、破皮、膜内异物 + ,sum(IFNULL(data_run.DPNG,0)) 正极面垫不良多放、漏放 + ,sum(IFNULL(data_run.PositiveDamage,0)) 正极套膜不良含热缩不良、破损、褶皱、面垫翘起 + ,sum(IFNULL(data_run.PositiveDirty,0)) 正极套膜脏污 + ,sum(IFNULL(data_run.PositiveScratches,0)) 盖帽不良含漏液、盖帽脏污氧化生锈,划痕,变形 + ,sum(IFNULL(data_run.SizeNG,0)) 负极套膜尺寸不良 + ,sum(IFNULL(data_run.NegativeDamage,0)) 负极套膜不良含套膜褶皱变形、破损、褶皱 + ,sum(IFNULL(data_run.NegativeDirty,0)) 负极套膜脏污 + ,sum(IFNULL(data_run.NegativeScratches,0)) 底部不良含漏液、脏污、氧化生锈、划痕、变形 + ,data_run.Operator 操作员 + from data_run where data_run.OrderNum='{0}'", strWorkerNum); + //if (strWorkerNum != "") + //{ + // strSql += string.Format(@" and data_run.OrderNum='{0}'", strWorkerNum); + //} + //strSql += " GROUP BY data_run.Class"; + DataTable dt = SqlHelper.QueryTable(strSql); + return dt; + + } + /// + /// 按日期查询和时间查询投入产出信息 + /// + /// + /// + /// + public List GetProdTotal(string strDate, int Hour) + { + string strSql = string.Format(@"SELECT + FDate + ,FHour + ,ProdIn + ,ProdOut + ,TestTime + FROM Tb_HourProd where FDate = '{0}'", strDate); + if (Hour > 0) + { + strSql += string.Format(" and FHour={0}", Hour); + } + var list = MySqlHelper.Query(strSql); + return list; + } + + /// + /// 更新指定时间的小时产出 + /// + /// 小时产出数据 + /// + public int UpdateHourprodData(HourprodEntity enity) + { + try + { + string strSql = $@"select 1 from tb_hourprod where FDate='{enity.FDate}' and FHour={enity.FHour}"; + var obj = MySqlHelper.ExecuteScalar(strSql, null); + if (obj != null && obj.ToString().Trim() != "") + { + + strSql = $@"update tb_hourprod set ProdIn='{enity.ProdIn}',ProdOut='{enity.ProdOut}', TestTime='{DateTime.Now}' + where FDate='{enity.FDate}' and FHour={enity.FHour}"; + } + else + { + strSql = $@"Insert into tb_hourprod(FDate, FHour, ProdIn, ProdOut, TestTime) + values ('{enity.FDate}', '{enity.FHour}', '{enity.ProdIn}', '{enity.ProdOut}', '{DateTime.Now}')"; + } + int iresult = MySqlHelper.Execute(strSql); + return iresult; + } + catch (Exception ex) + { + throw ex; + } + } + + + /// + /// 保存进托盘数据 + /// + /// + /// + /// + //public int AddInPutTrayID(TrayTestEntry m, ref string strErr) + //{ + // string strSql = "INSERT INTO tb_InPutTrayID (TrayID,TestTime,Result,Remark)"; + // strSql += string.Format(" values('{0}','{1}','{2}','{3}')", m.TrayID, m.TrayDate, m.TrayResult, m.TrayRemark); + // int list = MySqlHelper.Execute(strSql); + // return list; + //} + + /// + /// 保存空托盘排出数据 + /// + /// + /// + /// + //public int AddOutTrayID(TrayTestEntry m, ref string strErr) + //{ + // string strSql = "INSERT INTO tb_OutTrayID (TrayID,TestTime,Result,Remark)"; + // strSql += string.Format(" values('{0}','{1}','{2}','{3}')", m.TrayID, m.TrayDate, m.TrayResult, m.TrayRemark); + // int list = MySqlHelper.Execute(strSql); + // return list; + + //} + + /// + /// 上料数据保存 + /// + /// + /// + /// + //public int AddTestCode(AbnormalCellEntity m, ref string strErr) + //{ + // string strSql = "INSERT INTO tb_savebarcode(TD,BarCode,TestTime,NGPosition, NGType,Remark, Flag)"; + // strSql += string.Format(" values({0},'{1}','{2}','{3}','{4}','{5}',{6})", m.TD, m.BarCode, m.strDate,m.NGPosition,m.NGType, m.Remark, m.Flag); + // int list = MySqlHelper.Execute(strSql); + // return list; + //} + + /// + /// 滚槽数据保存 + /// + /// + /// + /// + //public int AddGroovingData(GroovingData m, ref string strErr) + //{ + // string strSql = "INSERT INTO tb_grooving(TD,BarCode,Gear,IsRetest, TestTime, Result, Remark,Worker, Flag)"; + // strSql += string.Format(" values({0},'{1}','{2}','{3}','{4}','{5}','{6}','{7}',{8})", m.GradingTD, m.GradingBarCode, m.Gear, + // m.IsRetest, m.GradingstrDate, m.GradingResult, m.GradingRemark, m.StrWorker, m.Flag); + // int list = MySqlHelper.Execute(strSql); + // return list; + //} + + public int AddFeedingData(FeedingData m, ref string strErr) + { + throw new NotImplementedException(); + } + + public int AddBlankingData(BlankingData m, ref string strErr) + { + throw new NotImplementedException(); + } + + public int AddInPutTrayID(TrayTestEntry m, ref string strErr) + { + throw new NotImplementedException(); + } + + public int AddOutTrayID(TrayTestEntry m, ref string strErr) + { + throw new NotImplementedException(); + } + public int AddCamInforData(CamInfor m, ref string strErr) + { + throw new NotImplementedException(); + } + + public int AddAlarmCacheData(string tablename, List m) + { + throw new NotImplementedException(); + } + + public List GetAlarmCacheData() + { + throw new NotImplementedException(); + } + + public DataTable GetBarInTime(string strBar) + { + throw new NotImplementedException(); + } + + public int UparInTime(string strBar) + { + throw new NotImplementedException(); + } + + public string GetAbnormalVoice(string code, bool needInsert = false) + { + throw new NotImplementedException(); + } + } +} + diff --git a/JY.DAL/OpSqlDataBase.cs b/JY.DAL/OpSqlDataBase.cs new file mode 100644 index 0000000..82074c6 --- /dev/null +++ b/JY.DAL/OpSqlDataBase.cs @@ -0,0 +1,712 @@ +using JY.Model; +using System; +using System.Collections.Generic; +using System.Data; +using System.Text; +using System.Threading.Tasks; + +namespace JY.DAL +{ + /// + /// + /// + public class OpSqlDataBase : IDbHelper + { + #region SQLServer + /// + /// 保存报警数据 + /// + /// + /// + public int AddAlarmData(AlarmData m) + { + string strSql = string.Format(@"INSERT INTO [tb_alarm] ([AlarmGuid],[PLCAdress],[AlarmCode],[AlarmContent] + ,[AlarmType],[AlarmDesc],[AlarmState],[StartTime],[EndTime],[Flag]) + values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}',{9})" + , m.AlarmGuid, m.PLCAdress, m.AlarmCode, m.AlarmContent, m.AlarmType, m.AlarmDesc, m.AlarmState + , m.StartTime, m.EndTime, m.Flag); + int result = SqlHelper.Execute(strSql); + return result; + } + + /// + /// 保存报警数据至缓存表 + /// + /// + /// + public int AddAlarmCacheData(string tablename, List m) + { + try + { + int list = SqlHelper.BulkToDB(tablename, m); + return list; + } + catch (Exception ex) + { + + throw ex; + } + + } + + /// + /// 查询缓存表报警信息 + /// + /// 开始时间 + /// 结束时间 + /// + /// + public List GetAlarmCacheData() + { + string strSql = $@" SELECT [AlarmGuid] + ,[PLCAdress] + ,[AlarmCode] + ,[AlarmContent] + ,[AlarmType] + ,[AlarmDesc] + ,[AlarmState] + ,[StartTime] + ,[EndTime] + ,[Flag] + FROM tb_alarm where Flag =0"; + var list = SqlHelper.Query(strSql); + return list; + + } + + /// + /// 删除未更新数据 + /// + /// 开始时间 + /// 结束时间 + /// + public int DeleteAlarmCacheData() + { + string strSql = $@"DELETE FROM[dbo].[tb_alarm] WHERE [Flag]=0"; + int result = SqlHelper.Execute(strSql); + return result; + } + + /// + /// 查询报警信息 + /// + /// 开始时间 + /// 结束时间 + /// + public List GetAlarmData(string strDate1, string strDate2) + { + string strSql = $@" SELECT AlarmGuid,PLCAdress ,AlarmContent,AlarmCode,AlarmType,StartTime ,EndTime + FROM tb_alarm where StartTime >= '{ strDate1 }' and StartTime <= '{ strDate2 }' "; + var list = SqlHelper.Query(strSql); + return list; + + } + + /// + /// 查询进站信息 + /// + /// + /// + public List GetFeedingData(string strCode) + { + string strSql = $@" SELECT * FROM FeedingData where BarCode = '{strCode}' ORDER BY CreateTime desc"; + var list = SqlHelper.Query(strSql); + return list; + + } + + /// + /// 新增产品型号 + /// + /// 机型信息 + /// + public int AddProductModel(ProductModel entity) + { + string strSql = $@"INSERT INTO tb_productmodel (ModelName, Remark) + VALUES ('{entity.ModelName}', '{entity.Remark}')"; + int result = SqlHelper.Execute(strSql); + return result; + } + + /// + /// 删除本地型号 + /// + /// 型号 + /// + public void DelProductModel(string modeltype) + { + string strSql = $"delete from tb_productmodel where ModelName='{modeltype}'"; + SqlHelper.Execute(strSql); + } + + /// + /// 获取产品型号列表 + /// + /// 产品型号 + /// + public List GetProductModelList(string strProdType = "") + { + try + { + string strSql = @"SELECT * FROM tb_productmodel "; + if (strProdType != "") + { + strSql += string.Format(" where ModelName='{0}'", strProdType); + } + strSql += " order by ModelName"; + var list = SqlHelper.Query(strSql); + return list; + } + catch (Exception ex) + { + throw ex; + } + } + + /// + /// 保存产品类型配置参数 + /// + /// + public bool AddProductParaList(List list) + { + List listSql = new List(); + listSql.Add($@"delete from tb_paralist where ModelName='{list[0].ModelName}'"); + foreach (var item in list) + { + listSql.Add($@"INSERT INTO tb_paralist (ModelName, ParaName, ParaValue, Remark, UpdateTime) + VALUES ('{item.ModelName}', '{item.ParaName}', '{item.ParaValue}', '{item.Remark}', '{item.UpdateTime}')"); + } + var result = SqlHelper.ExecuteTransaction(listSql.ToArray()); + + if (result > 0) + return true; + else + return false; + } + + /// + /// 获取产品参数通过产品型号 + /// + /// 产品型号 + /// + public List GetProductParaByProdModel(string strModelType) + { + string strSql = $@"SELECT pb.ParaName, '{strModelType}' ModelName,pl.ParaValue,pl.Remark,pl.UpdateTime + FROM tb_parabase pb + left join (select * from tb_paralist where ModelName = '{strModelType}' ) as pl + on pb.ParaName = pl.ParaName; "; + + var list = SqlHelper.Query(strSql); + return list; + } + + /// + /// 标准轴参数保存 + /// + /// + /// + /// + /// + public bool InsertPLCConfigBase(List list) + { + List listSql = new List(); + listSql.Add("delete from tb_plcconfigbase;"); + foreach (var item in list) + { + listSql.Add($@"Insert into tb_plcconfigbase (PLCAddress,PLCRemark,OrderNum) + Values ('{item.PLCAddress}','{item.PLCRemark}',{item.OrderNum});"); + } + var result = SqlHelper.ExecuteTransaction(listSql.ToArray()); + if (result > 0) + return true; + else + return false; + } + + /// + /// 获取换型操作的基本参数 + /// + /// + public List GetPLCConfigBases() + { + string strSql = string.Format(@"SELECT * FROM tb_plcconfigbase + ORDER BY OrderNum"); + var list = SqlHelper.Query(strSql); + return list; + } + /// + /// 获取PLC换型参数绑定值 + /// + /// 产品型号 + /// + public List GetPLCConfigPara(string modelName) + { + string strSql = $@"SELECT '{modelName}' ModelName,pb.PLCAddress,pc.PLCValue,pc.UpdateDate,pb.PLCRemark,pb.OrderNum + FROM tb_plcconfigbase pb + left join (select * from tb_plcconfig where ModelName='{modelName}') pc + on pb.PLCAddress = pc.PLCAddress + order by pb.OrderNum;"; + var list = SqlHelper.Query(strSql); + return list; + } + + /// + /// 具体型号轴参数保存 + /// + /// + /// + /// + /// + public bool InsertPLCConfigParam(List list) + { + List listSql = new List(); + listSql.Add($"delete from tb_plcconfig where ModelName='{list[0].ModelName}';"); + foreach (var item in list) + { + listSql.Add($@"INSERT INTO tb_plcconfig (ModelName, PLCAddress, PLCValue, UpdateDate) + Values ('{item.ModelName}','{item.PLCAddress}',{item.PLCValue},'{item.UpdateData}');"); + } + var result = SqlHelper.ExecuteTransaction(listSql.ToArray()); + if (result > 0) + return true; + else + return false; + } + + /// + /// 查询历史数据 + /// + /// + /// + /// + /// + public DataTable GetTestData(int type, string strBarCode, string strDate1, string strDate2, string flag) + { + string strSql = ""; + switch (type) + { + case 0: + strSql = @"SELECT [ID] ID + ,[TD] 通道 + ,[BarCode] 入站条码 + ,CONVERT(varchar, [CreateTime], 120) 进站时间 + ,[Result] 结果 + ,[Remark] 备注 + ,[Flag] 状态 + FROM [dbo].[FeedingData] + where CreateTime >= '" + strDate1 + "' and CreateTime <= '" + strDate2 + "' "; + if (strBarCode != "") + { + strSql += " and BarCode like '%" + strBarCode + "%' "; + } + break; + case 1: + strSql = @" SELECT [ID] ID + ,[TD] 序号 + ,[WorkShift] 班次 + ,[ArrivalBarCode] 入站条码 + ,[DepartureBarCode] 出站条码 + ,[TMDB] 条码对比 + ,CONVERT(varchar, [OutTime], 120) 出站时间 + ,[CCD1] '正面(2D/3D)' + ,[CCD2] '反面(2D/3D)' + ,[CCD3] '左侧面(2D/3D)' + ,[CCD4] '右侧面(2D/3D)' + ,[CCD5] '顶面(2D/3D)' + ,[CCD6] '底面(2D/3D)' + ,[CCD7] 底WE1 + ,[CCD8] 底WE2 + ,[CCD9] 底WE3 + ,[CCD10] 底WE4 + ,[CCD11] 中ME1 + ,[CCD12] 中ME2 + ,[CCD13] 中ME3 + ,[CCD14] 中ME4 + ,[CCD15] '极柱(POS/NEG)' + ,[CCD16] '防爆阀(PRO)' + ,[Result] 综合结果 + ,[Remark] 备注 + ,[Flag] 状态 + FROM [dbo].[BlankingData] where OutTime >= '" + strDate1 + "' and OutTime <= '" + strDate2 + "' "; + if (strBarCode != "") + { + strSql += " and DepartureBarCode like '%" + strBarCode + "' "; + } + break; + } + + + DataTable dt = SqlHelper.QueryTable(strSql); + return dt; + } + /// + /// 查询历史数据 + /// + /// + /// + /// + /// + public DataTable GetTestData2(int type,int resultType, string strBarCode, string strDate1, string strDate2, string flag) + { + string strSql = ""; + switch (type) + { + case 0: + strSql = @"SELECT [ID] ID + ,[TD] 通道 + ,[TDGroup] 主道 + ,[BarCode] 入站条码 + ,CONVERT(varchar, [CreateTime], 120) 进站时间 + ,[Result] 结果 + ,[Remark] 备注 + ,[Flag] 状态 + FROM [dbo].[FeedingData] + where CreateTime >= '" + strDate1 + "' and CreateTime <= '" + strDate2 + "' "; + if (strBarCode != "") + { + strSql += " and BarCode like '%" + strBarCode + "%' "; + } + if (resultType == 1) + { + strSql += " and Result ='OK' "; + } + else if (resultType == 2) + { + strSql += " and Result = 'NG' "; + } + break; + case 1: + strSql = @" SELECT [ID] ID + ,[TD] 序号 + ,[WorkShift] 班次 + ,[TDGroup] 主道 + ,[ArrivalBarCode] 入站条码 + ,[DepartureBarCode] 出站条码 + ,[TMDB] 条码对比 + ,CONVERT(varchar, [OutTime], 120) 出站时间 + ,[CCD1] '正面(2D/3D)' + ,[CCD2] '反面(2D/3D)' + ,[CCD3] '左侧面(2D/3D)' + ,[CCD4] '右侧面(2D/3D)' + ,[CCD5] '顶面(2D/3D)' + ,[CCD6] '底面(2D/3D)' + ,[CCD7] 底WE1 + ,[CCD8] 底WE2 + ,[CCD9] 底WE3 + ,[CCD10] 底WE4 + ,[CCD11] 中ME1 + ,[CCD12] 中ME2 + ,[CCD13] 中ME3 + ,[CCD14] 中ME4 + ,[CCD15] '极柱(POS/NEG)' + ,[CCD16] '防爆阀(PRO)' + ,[Result] 综合结果 + ,[Remark] 备注 + ,[Flag] 状态 + FROM [dbo].[BlankingData] where OutTime >= '" + strDate1 + "' and OutTime <= '" + strDate2 + "' "; + if (strBarCode != "") + { + strSql += " and DepartureBarCode like '%" + strBarCode + "' "; + } + if(resultType == 1) + { + strSql += " and Result ='OK' "; + } + else if (resultType == 2) + { + strSql += " and Result like '%NG%' "; + } + + break; + } + + + DataTable dt = SqlHelper.QueryTable(strSql); + return dt; + } + + /// + /// 查询CCD数据 + /// + /// + /// + /// + /// + public DataTable GetCCDData(string strWorkerNum, string strDate1, string strDate2) + { + + + string strSql = string.Format(@"SELECT + + data_run.OrderNum 工单号 + ,data_run.Customer 客户名称 + ,sum(IFNULL(data_run.TotalNum,0)) 投入总数 + ,sum(IFNULL(data_run.OK,0)) 良品总数 + ,sum(IFNULL(data_run.NG,0)) 不良总数 + ,CAST(IFNULL(CONVERT(((CONVERT((sum(IFNULL(data_run.NG,0))),FLOAT)/CONVERT((sum(IFNULL(data_run.TotalNum,0))),FLOAT))*100),DOUBLE),0) as CHAR(10))+'%' 不良率 + ,sum(IFNULL(data_run.CanRepaired,0)) 质量缺陷 + ,sum(IFNULL(data_run.NotRepaired,0)) 非质量缺陷 + ,sum(IFNULL(data_run.OtherNG,0)) 其他不良 + ,sum(IFNULL(data_run.SideNG,0)) 侧面不良 + ,sum(IFNULL(data_run.PositiveNG,0)) 正极不良 + ,sum(IFNULL(data_run.NegativeNG,0)) 负极不良 + ,sum(IFNULL(data_run.ChongheNG,0)) 重合不良 + ,sum(IFNULL(data_run.CodeNG,0)) 喷码不良 + ,sum(IFNULL(data_run.SideDrumpack,0)) 侧面凹坑鼓包、变形 + ,sum(IFNULL(data_run.SideDirty,0)) 侧面脏污漏液 + ,sum(IFNULL(data_run.SideScratches,0)) 侧面凸点、划痕、破皮、膜内异物 + ,sum(IFNULL(data_run.DPNG,0)) 正极面垫不良多放、漏放 + ,sum(IFNULL(data_run.PositiveDamage,0)) 正极套膜不良含热缩不良、破损、褶皱、面垫翘起 + ,sum(IFNULL(data_run.PositiveDirty,0)) 正极套膜脏污 + ,sum(IFNULL(data_run.PositiveScratches,0)) 盖帽不良含漏液、盖帽脏污氧化生锈,划痕,变形 + ,sum(IFNULL(data_run.SizeNG,0)) 负极套膜尺寸不良 + ,sum(IFNULL(data_run.NegativeDamage,0)) 负极套膜不良含套膜褶皱变形、破损、褶皱 + ,sum(IFNULL(data_run.NegativeDirty,0)) 负极套膜脏污 + ,sum(IFNULL(data_run.NegativeScratches,0)) 底部不良含漏液、脏污、氧化生锈、划痕、变形 + ,data_run.Operator 操作员 + from data_run where data_run.OrderNum='{0}'", strWorkerNum); + //from data_run where data_run.Date>='{0}' and data_run.Date<='{1}'", strDate1, strDate2); + //if (strWorkerNum != "") + //{ + // strSql += string.Format(@" and data_run.OrderNum='{0}'", strWorkerNum); + //} + //strSql += " GROUP BY data_run.Class"; + //date_format(data_run.Date, '%m-%d') 日期 + // ,data_run.Class 班次 + // , data_run.Classtype 班别 + DataTable dt = MySqlHelper.QueryTable(strSql); + return dt; + } + + /// + /// 按日期查询和时间查询投入产出信息 + /// + /// + /// + /// + public List GetProdTotal(string strDate, int Hour) + { + string strSql = string.Format(@"SELECT + FDate + ,FHour + ,ProdIn + ,ProdOut + ,TestTime + FROM Tb_HourProd where FDate = '{0}'", strDate); + if (Hour > 0) + { + strSql += string.Format(" and FHour={0}", Hour); + } + var list = SqlHelper.Query(strSql); + return list; + } + + /// + /// 更新指定时间的小时产出 + /// + /// 小时产出数据 + /// + public int UpdateHourprodData(HourprodEntity enity) + { + try + { + string strSql = $@"select 1 from tb_hourprod where FDate='{enity.FDate}' and FHour={enity.FHour}"; + var obj = SqlHelper.ExecuteScalar(strSql, null); + if (obj != null && obj.ToString().Trim() != "") + { + + strSql = $@"update tb_hourprod set ProdIn='{enity.ProdIn}',ProdOut='{enity.ProdOut}', TestTime='{DateTime.Now}' + where FDate='{enity.FDate}' and FHour={enity.FHour}"; + } + else + { + strSql = $@"Insert into tb_hourprod(FDate, FHour, ProdIn, ProdOut, TestTime) + values ('{enity.FDate}', '{enity.FHour}', '{enity.ProdIn}', '{enity.ProdOut}', '{DateTime.Now}')"; + } + int iresult = SqlHelper.Execute(strSql); + return iresult; + } + catch (Exception ex) + { + throw ex; + } + } + + + /// + /// 保存进托盘数据 + /// + /// + /// + /// + public int AddInPutTrayID(TrayTestEntry m, ref string strErr) + { + throw new NotImplementedException(); + } + + /// + /// 保存空托盘排出数据 + /// + /// + /// + /// + public int AddOutTrayID(TrayTestEntry m, ref string strErr) + { + throw new NotImplementedException(); + + } + + + /// + /// 获取电芯进站时间 + /// + /// + /// + public DataTable GetBarInTime(string strBar) + { + DataTable dt = null; + try + { + string strsql = string.Format(@"SELECT Top(1) [BarCode] 条码 + ,CONVERT(varchar, [CreateTime], 120) 进站时间 + FROM [dbo].[FeedingData] + where BarCode='{0}' order by ID DESC", strBar); + dt = SqlHelper.QueryTable(strsql); + + } + catch (Exception ex) + { + + throw ex; + } + return dt; + } + + /// + /// 更新获取时间 + /// + /// + /// + public int UparInTime(string strBar) + { + + try + { + string strsql = string.Format(@"UPDATE [dbo].[FeedingData] SET [Flag] = 1 WHERE [BarCode]='{0}' and Flag=0", strBar); + int iresult = SqlHelper.Execute(strsql); + return iresult; + + } + catch (Exception ex) + { + + throw ex; + } + + } + /// + /// 出站外观数据保存 + /// + /// + /// + /// + public int AddBlankingData(BlankingData m, ref string strErr) + { + string strSql = string.Format(@"INSERT INTO [dbo].[BlankingData] + ([TD] + ,[WorkShift] + ,[ArrivalBarCode] + ,[DepartureBarCode] + ,[TMDB] + ,[OutTime] + ,[CCD1] + ,[CCD2] + ,[CCD3] + ,[CCD4] + ,[CCD5] + ,[CCD6] + ,[CCD7] + ,[CCD8] + ,[CCD9] + ,[CCD10] + ,[CCD11] + ,[CCD12] + ,[CCD13] + ,[CCD14] + ,[CCD15] + ,[CCD16] + ,[Result] + ,[Remark] + ,[Flag] +,[TDGroup]) + VALUES"); + strSql += string.Format("({0},'{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}','{12}','{13}','{14}','{15}','{16}','{17}','{18}','{19}','{20}','{21}','{22}','{23}',{24},{25})", + m.TD, m.WorkShift, m.ArrivalBarCode, m.DepartureBarCode, m.TMDB, m.OutTime, m.CCD1, m.CCD2, m.CCD3, m.CCD4, m.CCD5, m.CCD6, m.CCD7, m.CCD8, m.CCD9, m.CCD10, m.CCD11, m.CCD12, m.CCD13, m.CCD14, m.CCD15, m.CCD16 + , m.Result, m.Remark, m.Flag,m.TDGroup); + int list = SqlHelper.Execute(strSql); + return list; + } + + /// + /// 电芯分档数据保存 + /// + /// + /// + /// + public int AddFeedingData(FeedingData m, ref string strErr) + { + string strSql = string.Format(@"INSERT INTO [dbo].[FeedingData] ([TD],[BarCode],[CreateTime],[Result],[Remark],[Flag],[TDGroup])"); + strSql += string.Format(@" values({0},'{1}','{2}','{3}','{4}',{5},{6})", m.TD, m.BarCode, m.CreateTime, m.Result, m.Remark, m.Flag,m.TDGroup); + int list = SqlHelper.Execute(strSql); + return list; + + } + + #endregion + + public int AddCamInforData(CamInfor m, ref string strErr) + { + string strSql = string.Format(@"INSERT INTO [dbo].[CamInforData] ([TD],[BarCode],[CreateTime], + [CCD15],[CCD16],[CCD17],[CCD18],,[CCD19],[CCD20],[CCD21],[CCD22],[CCD23],[CCD24],[CCD25],[CCD26],[CCD27],[CCD28],[CCD29,[CCD30],[CCD31],[CCD32],[CCD33],[CCD34],[CCD35],[CCD36],[CCD37],[CCD38],[Result],[Remark],[Flag])"); + strSql += string.Format(@" values({0},''{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}','{12}','{13}','{14}','{15}','{16}','{17}','{18}','{19}','{20}','{21}','{22}','{23}','{24}','{25}','{26}','{27}',{28})" + , m.TD, m.BarCode, m.CreateTime, m.CCD15, m.CCD16, m.CCD17, m.CCD18, m.CCD19, m.CCD20, m.CCD21, m.CCD22, m.CCD23, m.CCD24, m.CCD25, m.CCD26, m.CCD27, m.CCD28, m.CCD29, m.CCD30, m.CCD31, m.CCD32, m.CCD33, m.CCD34, m.CCD35, m.CCD36, m.CCD37, m.CCD38 + , m.Result, m.Remark, m.Flag); + int list = SqlHelper.Execute(strSql); + return list; + + } + /// + /// 根据工位编码获取异常播报内容 + /// + /// + /// + public string GetAbnormalVoice(string code, bool needInsert = false) + { + string remark = ""; + try + { + string strSql = $"select Remark from tb_AbnormalVoice where code='{code}' order by ID desc"; + DataTable dt = SqlHelper.QueryTable(strSql); + if (dt != null && dt.Rows.Count > 0) + { + remark = Convert.ToString(dt.Rows[0][0]); + } + else if (needInsert) + { + strSql = $"insert tb_AbnormalVoice(Code,Remark) values('{code}','')"; + SqlHelper.Execute(strSql); + } + } + catch (Exception ex) + { + throw ex; + } + if (string.IsNullOrEmpty(remark)) + { + remark = "没有播报内容,编码" + code; + } + return remark; + } + } +} + diff --git a/JY.DAL/Properties/AssemblyInfo.cs b/JY.DAL/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..aa8b86a --- /dev/null +++ b/JY.DAL/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("JY.DAL")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("JY.DAL")] +[assembly: AssemblyCopyright("Copyright © 2021")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("d5889580-58f9-467e-87d3-efa37a300e67")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/JY.DAL/Repository/DataContext.cs b/JY.DAL/Repository/DataContext.cs new file mode 100644 index 0000000..ab12057 --- /dev/null +++ b/JY.DAL/Repository/DataContext.cs @@ -0,0 +1,31 @@ +using SqlSugar; +using System; +using System.Configuration; + +namespace JY.DAL.Repository +{ + public static class DataContext + { + private static readonly Lazy _instance = new Lazy(() => + { + string connectionString = ConfigurationManager.ConnectionStrings["CurDB"].ConnectionString; + return new SqlSugarScope(new ConnectionConfig + { + ConnectionString = connectionString, + DbType = DbType.SqlServer, + IsAutoCloseConnection = true, + InitKeyType = InitKeyType.Attribute + }, db => + { + db.Aop.OnLogExecuting = (sql, pars) => + { +#if DEBUG + Console.WriteLine($"SqlSugar SQL: {sql}"); +#endif + }; + }); + }); + + public static SqlSugarScope Instance => _instance.Value; + } +} \ No newline at end of file diff --git a/JY.DAL/Repository/IRepository.cs b/JY.DAL/Repository/IRepository.cs new file mode 100644 index 0000000..26af07b --- /dev/null +++ b/JY.DAL/Repository/IRepository.cs @@ -0,0 +1,42 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq.Expressions; + +namespace JY.DAL.Repository +{ + public interface IRepository where T : class, new() + { + ISqlSugarClient Db { get; } + + T GetById(object id); + + T GetSingle(Expression> predicate); + + List GetList(); + + List GetList(Expression> predicate); + + List GetListPaged(int pageIndex, int pageSize, out int totalCount, Expression> predicate = null, string orderBy = null); + + int Insert(T entity); + + int Insert(List entities); + + int Update(T entity); + + int Update(T entity, Expression> whereExpression); + + int Update(Expression> columns, Expression> whereExpression); + + int Delete(object id); + + int Delete(Expression> predicate); + + int Delete(List entities); + + bool Any(Expression> predicate); + + int Count(Expression> predicate = null); + } +} \ No newline at end of file diff --git a/JY.DAL/Repository/Repository.cs b/JY.DAL/Repository/Repository.cs new file mode 100644 index 0000000..3f19d78 --- /dev/null +++ b/JY.DAL/Repository/Repository.cs @@ -0,0 +1,102 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq.Expressions; + +namespace JY.DAL.Repository +{ + public class Repository : IRepository where T : class, new() + { + public ISqlSugarClient Db => DataContext.Instance; + + public T GetById(object id) + { + return Db.Queryable().InSingle(id); + } + + public T GetSingle(Expression> predicate) + { + return Db.Queryable().Where(predicate).Single(); + } + + public List GetList() + { + return Db.Queryable().ToList(); + } + + public List GetList(Expression> predicate) + { + return Db.Queryable().Where(predicate).ToList(); + } + + public List GetListPaged(int pageIndex, int pageSize, out int totalCount, Expression> predicate = null, string orderBy = null) + { + totalCount = 0; + var query = Db.Queryable(); + if (predicate != null) + { + query = query.Where(predicate); + } + if (!string.IsNullOrEmpty(orderBy)) + { + query = query.OrderBy(orderBy); + } + return query.ToPageList(pageIndex, pageSize, ref totalCount); + } + + public int Insert(T entity) + { + return Db.Insertable(entity).ExecuteReturnIdentity(); + } + + public int Insert(List entities) + { + return Db.Insertable(entities).ExecuteCommand(); + } + + public int Update(T entity) + { + return Db.Updateable(entity).ExecuteCommand(); + } + + public int Update(T entity, Expression> whereExpression) + { + return Db.Updateable(entity).Where(whereExpression).ExecuteCommand(); + } + + public int Update(Expression> columns, Expression> whereExpression) + { + return Db.Updateable().SetColumns(columns).Where(whereExpression).ExecuteCommand(); + } + + public int Delete(object id) + { + return Db.Deleteable().In(id).ExecuteCommand(); + } + + public int Delete(Expression> predicate) + { + return Db.Deleteable().Where(predicate).ExecuteCommand(); + } + + public int Delete(List entities) + { + return Db.Deleteable(entities).ExecuteCommand(); + } + + public bool Any(Expression> predicate) + { + return Db.Queryable().Where(predicate).Any(); + } + + public int Count(Expression> predicate = null) + { + var query = Db.Queryable(); + if (predicate != null) + { + query = query.Where(predicate); + } + return query.Count(); + } + } +} \ No newline at end of file diff --git a/JY.DAL/Service/AlarmDataService.cs b/JY.DAL/Service/AlarmDataService.cs new file mode 100644 index 0000000..db6af89 --- /dev/null +++ b/JY.DAL/Service/AlarmDataService.cs @@ -0,0 +1,39 @@ +using JY.DAL.Repository; +using JY.Model; +using System; +using System.Collections.Generic; +using System.Linq.Expressions; + +namespace JY.DAL.Service +{ + public interface IAlarmDataService : IService + { + List GetAlarmDataByTime(string startTime, string endTime); + + List GetAlarmCacheData(); + + int DeleteAlarmCacheData(); + } + + public class AlarmDataService : Service, IAlarmDataService + { + public AlarmDataService(IRepository repository) : base(repository) + { + } + + public List GetAlarmDataByTime(string startTime, string endTime) + { + return _repository.GetList(x => x.StartTime >= Convert.ToDateTime(startTime) && x.StartTime <= Convert.ToDateTime(endTime)); + } + + public List GetAlarmCacheData() + { + return _repository.GetList(x => x.Flag == 0); + } + + public int DeleteAlarmCacheData() + { + return _repository.Delete(x => x.Flag == 0); + } + } +} \ No newline at end of file diff --git a/JY.DAL/Service/BlankingDataService.cs b/JY.DAL/Service/BlankingDataService.cs new file mode 100644 index 0000000..73cb549 --- /dev/null +++ b/JY.DAL/Service/BlankingDataService.cs @@ -0,0 +1,26 @@ +using JY.DAL.Repository; +using JY.Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.DAL.Service +{ + public interface IBlankingDataService : IService + { + int AddBlankData(BlankingData data); + } + public class BlankingDataService : Service, IBlankingDataService + { + public BlankingDataService(IRepository repository) : base(repository) + { + } + + public int AddBlankData(BlankingData data) + { + return _repository.Insert(data); + } + } +} diff --git a/JY.DAL/Service/FeedingDataService.cs b/JY.DAL/Service/FeedingDataService.cs new file mode 100644 index 0000000..8e45abe --- /dev/null +++ b/JY.DAL/Service/FeedingDataService.cs @@ -0,0 +1,30 @@ +using JY.DAL.Repository; +using JY.Model; +using System.Collections.Generic; + +namespace JY.DAL.Service +{ + public interface IFeedingDataService : IService + { + List GetFeedingData(string barCode); + + int AddFeedingData(FeedingData data); + } + + public class FeedingDataService : Service, IFeedingDataService + { + public FeedingDataService(IRepository repository) : base(repository) + { + } + + public List GetFeedingData(string barCode) + { + return _repository.GetList(x => x.BarCode == barCode); + } + + public int AddFeedingData(FeedingData data) + { + return _repository.Insert(data); + } + } +} \ No newline at end of file diff --git a/JY.DAL/Service/IService.cs b/JY.DAL/Service/IService.cs new file mode 100644 index 0000000..d35d4e3 --- /dev/null +++ b/JY.DAL/Service/IService.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq.Expressions; + +namespace JY.DAL.Service +{ + public interface IService where T : class, new() + { + T GetById(object id); + + T GetSingle(Expression> predicate); + + List GetList(); + + List GetList(Expression> predicate); + + List GetListPaged(int pageIndex, int pageSize, out int totalCount, Expression> predicate = null, string orderBy = null); + + int Insert(T entity); + + int Insert(List entities); + + int Update(T entity); + + int Update(T entity, Expression> whereExpression); + + int Update(Expression> columns, Expression> whereExpression); + + int Delete(object id); + + int Delete(Expression> predicate); + + int Delete(List entities); + + bool Any(Expression> predicate); + + int Count(Expression> predicate = null); + } +} \ No newline at end of file diff --git a/JY.DAL/Service/Service.cs b/JY.DAL/Service/Service.cs new file mode 100644 index 0000000..6e83124 --- /dev/null +++ b/JY.DAL/Service/Service.cs @@ -0,0 +1,92 @@ +using JY.DAL.Repository; +using System; +using System.Collections.Generic; +using System.Linq.Expressions; + +namespace JY.DAL.Service +{ + public class Service : IService where T : class, new() + { + protected readonly IRepository _repository; + + public Service(IRepository repository) + { + _repository = repository; + } + + public T GetById(object id) + { + return _repository.GetById(id); + } + + public T GetSingle(Expression> predicate) + { + return _repository.GetSingle(predicate); + } + + public List GetList() + { + return _repository.GetList(); + } + + public List GetList(Expression> predicate) + { + return _repository.GetList(predicate); + } + + public List GetListPaged(int pageIndex, int pageSize, out int totalCount, Expression> predicate = null, string orderBy = null) + { + return _repository.GetListPaged(pageIndex, pageSize, out totalCount, predicate, orderBy); + } + + public int Insert(T entity) + { + return _repository.Insert(entity); + } + + public int Insert(List entities) + { + return _repository.Insert(entities); + } + + public int Update(T entity) + { + return _repository.Update(entity); + } + + public int Update(T entity, Expression> whereExpression) + { + return _repository.Update(entity, whereExpression); + } + + public int Update(Expression> columns, Expression> whereExpression) + { + return _repository.Update(columns, whereExpression); + } + + public int Delete(object id) + { + return _repository.Delete(id); + } + + public int Delete(Expression> predicate) + { + return _repository.Delete(predicate); + } + + public int Delete(List entities) + { + return _repository.Delete(entities); + } + + public bool Any(Expression> predicate) + { + return _repository.Any(predicate); + } + + public int Count(Expression> predicate = null) + { + return _repository.Count(predicate); + } + } +} \ No newline at end of file diff --git a/JY.DAL/ServiceLocator.cs b/JY.DAL/ServiceLocator.cs new file mode 100644 index 0000000..5ee09dd --- /dev/null +++ b/JY.DAL/ServiceLocator.cs @@ -0,0 +1,109 @@ +using JY.DAL.Repository; +using JY.DAL.Service; +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace JY.DAL +{ + public static class ServiceLocator + { + private static readonly Dictionary _services = new Dictionary(); + private static readonly Dictionary> _serviceFactories = new Dictionary>(); + private static bool _isInitialized = false; + + public static void Initialize() + { + if (_isInitialized) return; + + RegisterRepositoryAndService(); + + _isInitialized = true; + } + + private static void RegisterRepositoryAndService() + { + var assembly = Assembly.GetExecutingAssembly(); + + foreach (var type in assembly.GetTypes()) + { + if (type.IsClass && !type.IsAbstract) + { + foreach (var iface in type.GetInterfaces()) + { + if (iface.IsGenericType) + { + var genericDef = iface.GetGenericTypeDefinition(); + if (genericDef == typeof(IRepository<>)) + { + _serviceFactories[iface] = () => Activator.CreateInstance(type); + } + else if (genericDef == typeof(IService<>)) + { + _serviceFactories[iface] = () => + { + var repoType = typeof(IRepository<>).MakeGenericType(type.GetGenericArguments()[0]); + var repo = Get(repoType); + return Activator.CreateInstance(type, repo); + }; + } + } + else + { + if (!iface.FullName.StartsWith("System.")) + { + _serviceFactories[iface] = () => CreateInstanceWithDependencies(type); + } + } + } + } + } + } + + private static object CreateInstanceWithDependencies(Type type) + { + var constructor = type.GetConstructors()[0]; + var parameters = constructor.GetParameters(); + var paramValues = new object[parameters.Length]; + + for (int i = 0; i < parameters.Length; i++) + { + paramValues[i] = Get(parameters[i].ParameterType); + } + + return Activator.CreateInstance(type, paramValues); + } + + public static void Register(T instance) + { + _services[typeof(T)] = instance; + } + + public static void Register(Func factory) + { + _serviceFactories[typeof(T)] = () => factory(); + } + + public static T Get() + { + return (T)Get(typeof(T)); + } + + public static object Get(Type serviceType) + { + if (_services.TryGetValue(serviceType, out object instance)) + { + return instance; + } + + if (_serviceFactories.TryGetValue(serviceType, out Func factory)) + { + instance = factory(); + _services[serviceType] = instance; + return instance; + } + + throw new InvalidOperationException($"服务 {serviceType.Name} 未注册"); + } + } +} \ No newline at end of file diff --git a/JY.DAL/SqlHelper.cs b/JY.DAL/SqlHelper.cs new file mode 100644 index 0000000..5ad9cbc --- /dev/null +++ b/JY.DAL/SqlHelper.cs @@ -0,0 +1,345 @@ +using Dapper; +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using MySql.Data.MySqlClient; +using System.Linq; +using System.Data.SqlClient; +using System.Collections; +using System.Reflection; + +namespace JY.DAL +{ + public class SqlHelper where T : class + { + /// + /// 数据库连接字符串 + /// + private static readonly string connectionString = ConfigurationManager.ConnectionStrings["SqlConn"].ConnectionString; + + /// + /// 查询列表 + /// + /// 查询的sql + /// 替换参数 + /// + public static List Query(string sql, object param = null) + { + using (SqlConnection con = new SqlConnection(connectionString)) + { + return con.Query(sql, param).ToList(); + } + } + + /// + /// 查询第一个数据 + /// + /// + /// + /// + public static T QueryFirst(string sql, object param = null) + { + using (SqlConnection con = new SqlConnection(connectionString)) + { + return con.QueryFirst(sql, param); + } + } + + /// + /// 查询第一个数据没有返回默认值 + /// + /// + /// + /// + public static T QueryFirstOrDefault(string sql, object param = null) + { + using (SqlConnection con = new SqlConnection(connectionString)) + { + return con.QueryFirstOrDefault(sql, param); + } + } + + /// + /// 查询单条数据 + /// + /// + /// + /// + public static T QuerySingle(string sql, object param = null) + { + using (SqlConnection con = new SqlConnection(connectionString)) + { + return con.QuerySingle(sql, param); + } + } + + /// + /// 查询单条数据没有返回默认值 + /// + /// + /// + /// + public static T QuerySingleOrDefault(string sql, object param = null) + { + using (SqlConnection con = new SqlConnection(connectionString)) + { + return con.QuerySingleOrDefault(sql, param); + } + } + + /// + /// 增删改 + /// + /// + /// + /// Number of rows affected + public static int Execute(string sql, object param = null) + { + using (SqlConnection con = new SqlConnection(connectionString)) + { + return con.Execute(sql, param); + } + } + + /// + /// Reader获取数据 + /// + /// + /// + /// + public static IDataReader ExecuteReader(string sql, object param) + { + using (SqlConnection con = new SqlConnection(connectionString)) + { + return con.ExecuteReader(sql, param); + } + } + + /// + /// 获取数据返回DataTable + /// + /// + /// + /// + public static DataTable QueryTable(string sql, object param = null) + { + using (SqlConnection con = new SqlConnection(connectionString)) + { + DataTable table = new DataTable(); + var reader = con.ExecuteReader(sql, param); + table.Load(reader); + return table; + } + } + + /// + /// Scalar获取数据 + /// + /// + /// + /// + public static object ExecuteScalar(string sql, object param = null) + { + using (SqlConnection con = new SqlConnection(connectionString)) + { + return con.ExecuteScalar(sql, param); + } + } + + /// + /// Scalar获取数据 + /// + /// + /// + /// + public static T ExecuteScalarForT(string sql, object param = null) + { + using (SqlConnection con = new SqlConnection(connectionString)) + { + return con.ExecuteScalar(sql, param); + } + } + + /// + /// 带参数的存储过程 + /// + /// + /// + /// + public static List ExecutePro(string proc, object param = null) + { + using (SqlConnection con = new SqlConnection(connectionString)) + { + List list = con.Query(proc, + param, + null, + true, + null, + CommandType.StoredProcedure).ToList(); + return list; + } + } + /// + /// 批量插入T数据,返回影响行数 + /// + /// 对象集合 + /// 影响行数 + public static int Insert(string strsql, List list) + { + using (IDbConnection connection = new SqlConnection(connectionString)) + { + //return connection.Execute("insert into Person(Name,Remark) values(@Name,@Remark)", list); + return connection.Execute(strsql, list); + } + } + + + + /// + /// list to datatable + /// + /// + /// + /// + public static DataTable ListToDt(IEnumerable collection) + { + var props = typeof(T).GetProperties(); + var dt = new DataTable(); + dt.Columns.AddRange(props.Select(p => new + DataColumn(p.Name, p.PropertyType)).ToArray()); + if (collection.Count() > 0) + { + for (int i = 0; i < collection.Count(); i++) + { + ArrayList tempList = new ArrayList(); + foreach (PropertyInfo pi in props) + { + object obj = pi.GetValue(collection.ElementAt(i), null); + tempList.Add(obj); + } + object[] array = tempList.ToArray(); + dt.LoadDataRow(array, true); + } + } + return dt; + } + + /// + /// 批量插入SqlBulkCopy + /// + /// + /// 表名 + public static void BatchInsertBySqlBulkCopy(DataTable dt, string tableName) + { + using (SqlBulkCopy sbc = new SqlBulkCopy(connectionString)) + { + sbc.BatchSize = dt.Rows.Count; + sbc.BulkCopyTimeout = 10; + sbc.DestinationTableName = tableName; + + sbc.ColumnMappings.Clear(); + //sbc.ColumnMappings.Add("CustomerID", "CustomerID"); + //sbc.ColumnMappings.Add("FirstName", "FirstName"); + //sbc.ColumnMappings.Add("LastName", "LastName"); + //sbc.ColumnMappings.Add("Address1", "Address1"); + //sbc.ColumnMappings.Add("Address2", "Address2"); + for (int i = 0; i < dt.Columns.Count; i++) + { + sbc.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName); + } + //全部写入数据库 + sbc.WriteToServer(dt); + } + } + + /// + /// 批量插入数据 + /// + /// + public static int BulkToDB(string tableName, List list) + { + //int result = 0; + DataTable dt = ListToDt(list); + BatchInsertBySqlBulkCopy(dt, tableName); + return 1; + } + + /// + /// 事务1 - 全SQL + /// + /// 多条SQL + /// param + /// + public static int ExecuteTransaction(string[] sqlarr) + { + using (SqlConnection con = new SqlConnection(connectionString)) + { + con.Open(); + using (var transaction = con.BeginTransaction()) + { + try + { + int result = 0; + foreach (var sql in sqlarr) + { + result += con.Execute(sql, null, transaction); + } + + transaction.Commit(); + return result; + } + catch (Exception ex) + { + transaction.Rollback(); + throw ex; + } + finally + { + con.Close(); + } + } + } + } + + /// + /// 事务2 - 声明参数 + ///demo: + ///dic.Add("Insert into Users values (@UserName, @Email, @Address)", + /// new { UserName = "jack", Email = "380234234@qq.com", Address = "上海" }); + /// + /// 多条SQL + /// param + /// + public static int ExecuteTransaction(Dictionary dic) + { + using (SqlConnection con = new SqlConnection(connectionString)) + { + con.Open(); + using (var transaction = con.BeginTransaction()) + { + try + { + int result = 0; + foreach (var sql in dic) + { + result += con.Execute(sql.Key, sql.Value, transaction); + } + + transaction.Commit(); + return result; + } + catch (Exception ex) + { + transaction.Rollback(); + throw ex; + } + finally + { + con.Close(); + } + } + } + } + } +} \ No newline at end of file diff --git a/JY.DAL/app.config b/JY.DAL/app.config new file mode 100644 index 0000000..12b9553 --- /dev/null +++ b/JY.DAL/app.config @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JY.DAL/packages.config b/JY.DAL/packages.config new file mode 100644 index 0000000..bc3cd95 --- /dev/null +++ b/JY.DAL/packages.config @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JY.Inspection/App.config b/JY.Inspection/App.config new file mode 100644 index 0000000..9fd7879 --- /dev/null +++ b/JY.Inspection/App.config @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/JY.Inspection/Common/AlarmForm.cs b/JY.Inspection/Common/AlarmForm.cs new file mode 100644 index 0000000..780786d --- /dev/null +++ b/JY.Inspection/Common/AlarmForm.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using CsvHelper.Configuration.Attributes; + +namespace JY.Inspection.Common +{ + /// + /// 报警表单数据 + /// + public class AlarmForm + { + /// + /// 报警地址 + /// + [Name("寄存器地址")] + public string PLCAdress { get; set; } + /// + /// 报警内容 + /// + [Name("报警信息")] + public string AlarmContent { get; set; } + /// + /// 报警代码 + /// + [Name("故障代码")] + public string AlarmCode { get; set; } + } +} diff --git a/JY.Inspection/Common/ByteUtil.cs b/JY.Inspection/Common/ByteUtil.cs new file mode 100644 index 0000000..b0ff902 --- /dev/null +++ b/JY.Inspection/Common/ByteUtil.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Inspection.Common +{ + public static class ByteUtil + { + public static byte[] ByteReverse(this byte[] Arrbyte) + { + byte[] ArrByte = Arrbyte.Select((x, i) => new { x, i }).GroupBy(x => x.i / 2).SelectMany(x => new byte[] { x.Last().x, x.First().x }).ToArray(); + return ArrByte; + } + } +} diff --git a/JY.Inspection/Common/CSVHelper.cs b/JY.Inspection/Common/CSVHelper.cs new file mode 100644 index 0000000..008bfdc --- /dev/null +++ b/JY.Inspection/Common/CSVHelper.cs @@ -0,0 +1,100 @@ +using CsvHelper; +using JY.Utility; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace JY.Inspection +{ + public class CSVHelper + { + /// + /// 读取CSV文件 + /// + /// csv文件名 + /// + public static List ReadCSV(string fileName, string strSeparator = "\t") + { + if (!File.Exists(fileName)) return null; + //Nuget获取CsvHelper + using (var reader = new StreamReader(fileName)) + { + var cfg = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.InvariantCulture) + { + Mode = CsvMode.Escape, + Escape = '\\', + Delimiter = strSeparator//设置分隔符号 + }; + using (var csv = new CsvReader(reader, cfg)) + { + var list = csv.GetRecords().ToList(); + return list; + } + } + } + + /// + /// 写入数据到csv文件 + /// + /// 所需存储文件夹路径(取系统所设定值,不带日期文件夹) + /// 数据源 + /// 1进站,2出站,3智能电表.csv,4预警 + /// + public static bool WriteCSV(string filePath, List data, int flag) + { + if (string.IsNullOrEmpty(filePath)) + { + filePath = Application.StartupPath + "\\localData\\" + DateTime.Now.ToString("yyyyMMdd"); + } + else + { + filePath = filePath + "\\" + DateTime.Now.ToString("yyyyMMdd"); + } + if (!Directory.Exists(filePath)) + { + Directory.CreateDirectory(filePath); + } + switch (flag) + { + case 1: + filePath = filePath + "\\" + DateTime.Now.ToString("yyyyMMdd") + "进站.csv"; + break; + case 2: + filePath = filePath + "\\" + DateTime.Now.ToString("yyyyMMdd") + "出站.csv"; + break; + case 3: + filePath = filePath + "\\" + DateTime.Now.ToString("yyyyMMdd") + "智能电表.csv"; + break; + default: + filePath = filePath + "\\" + DateTime.Now.ToString("yyyyMMdd") + "报警.csv"; + break; + } + try + { + var cfg = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.InvariantCulture); + if (File.Exists(filePath)) + { + cfg.HasHeaderRecord = false;//是否将第一行作为标题 + } + using (var writer = new StreamWriter(filePath, true, Encoding.GetEncoding("GB2312"))) + { + using (var csv = new CsvWriter(writer, cfg)) + { + csv.WriteRecords(data); + } + } + return true; + } + catch (Exception ex) + { + LogHelper.Error(ex.ToString()); + return false; + } + } + } +} diff --git a/JY.Inspection/Common/CollectionUtil.cs b/JY.Inspection/Common/CollectionUtil.cs new file mode 100644 index 0000000..0713077 --- /dev/null +++ b/JY.Inspection/Common/CollectionUtil.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Inspection.Common +{ + public class CollectionUtil + { + /// + /// 生成ushort List集合 + /// + /// + /// + public static List GetListUShort(int Num) + { + List list = new List(); + for (int i = 0; i < Num; i++) + { + list.Add(1); + } + return list; + } + } +} diff --git a/JY.Inspection/Common/ConnectionClient.cs b/JY.Inspection/Common/ConnectionClient.cs new file mode 100644 index 0000000..8a3e9dd --- /dev/null +++ b/JY.Inspection/Common/ConnectionClient.cs @@ -0,0 +1,131 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace JY.Inspection +{ + /// + /// 与客户端的 连接通信类(包含了一个 与客户端 通信的 套接字,和线程) + /// + public class ConnectionClient + { + Socket sokMsg; + DGShowMsg dgShowMsg;//负责 向主窗体文本框显示消息的方法委托 + DGShowMsg dgRemoveConnection;// 负责 从主窗体 中移除 当前连接 + Thread threadMsg; + + #region 构造函数 + /// + /// + /// + /// 通信套接字 + /// 向主窗体文本框显示消息的方法委托 + public ConnectionClient(Socket sokMsg, DGShowMsg dgShowMsg, DGShowMsg dgRemoveConnection) + { + this.sokMsg = sokMsg; + this.dgShowMsg = dgShowMsg; + this.dgRemoveConnection = dgRemoveConnection; + + this.threadMsg = new Thread(RecMsg); + this.threadMsg.IsBackground = true; + this.threadMsg.Start(); + } + #endregion + + bool isRec = true; + #region 02负责监听客户端发送来的消息 + void RecMsg() + { + while (isRec) + { + try + { + byte[] arrMsg = new byte[1024 * 1024 * 2]; + //接收 对应 客户端发来的消息 + int length = sokMsg.Receive(arrMsg); + //将接收到的消息数组里真实消息转成字符串 + string strMsg = System.Text.Encoding.UTF8.GetString(arrMsg, 0, length); + //通过委托 显示消息到 窗体的文本框 + dgShowMsg(strMsg); + } + catch (Exception ex) + { + isRec = false; + //从主窗体中 移除 下拉框中对应的客户端选择项,同时 移除 集合中对应的 ConnectionClient对象 + dgRemoveConnection(sokMsg.RemoteEndPoint.ToString()); + } + } + } + #endregion + + #region 03向客户端发送消息 + /// + /// 向客户端发送消息 + /// + /// + public void Send(string strMsg) + { + byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg); + byte[] arrMsgFinal = new byte[arrMsg.Length + 1]; + + arrMsgFinal[0] = 0;//设置 数据标识位等于0,代表 发送的是 文字 + arrMsg.CopyTo(arrMsgFinal, 0); + + sokMsg.Send(arrMsgFinal); + } + #endregion + + #region 04向客户端发送文件数据 +void SendFile(string strPath) + /// + /// 04向客户端发送文件数据 + /// + /// 文件路径 + public void SendFile(string strPath) + { + //通过文件流 读取文件内容 + using (FileStream fs = new FileStream(strPath, FileMode.OpenOrCreate)) + { + byte[] arrFile = new byte[1024 * 1024 * 2]; + //读取文件内容到字节数组,并 获得 实际文件大小 + int length = fs.Read(arrFile, 0, arrFile.Length); + //定义一个 新数组,长度为文件实际长度 +1 + byte[] arrFileFina = new byte[length + 1]; + arrFileFina[0] = 1;//设置 数据标识位等于1,代表 发送的是文件 + //将 文件数据数组 复制到 新数组中,下标从1开始 + //arrFile.CopyTo(arrFileFina, 1); + Buffer.BlockCopy(arrFile, 0, arrFileFina, 1, length); + //发送文件数据 + sokMsg.Send(arrFileFina);//, 0, length + 1, SocketFlags.None); + } + } + #endregion + + #region 05向客户端发送闪屏 + /// + /// 向客户端发送闪屏 + /// + /// + public void SendShake() + { + byte[] arrMsgFinal = new byte[1]; + arrMsgFinal[0] = 2; + sokMsg.Send(arrMsgFinal); + } + #endregion + + #region 06关闭与客户端连接 + /// + /// 关闭与客户端连接 + /// + public void CloseConnection() + { + isRec = false; + } + #endregion + } +} diff --git a/JY.Inspection/Common/DGShowMsg.cs b/JY.Inspection/Common/DGShowMsg.cs new file mode 100644 index 0000000..608cec6 --- /dev/null +++ b/JY.Inspection/Common/DGShowMsg.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Inspection +{ + public delegate void DGShowMsg(string strMsg); +} diff --git a/JY.Inspection/Common/DateTimeSynchronization.cs b/JY.Inspection/Common/DateTimeSynchronization.cs new file mode 100644 index 0000000..c29afab --- /dev/null +++ b/JY.Inspection/Common/DateTimeSynchronization.cs @@ -0,0 +1,127 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Inspection +{ + /// + /// 设置电脑时间 + /// + public class DateTimeSynchronization + { + [StructLayout(LayoutKind.Sequential)] + private struct Systemtime + { + public short year; + public short month; + public short dayOfWeek; + public short day; + public short hour; + public short minute; + public short second; + public short milliseconds; + } + + [DllImport("kernel32.dll")] + private static extern bool SetLocalTime(ref Systemtime time); + + private static uint swapEndian(ulong x) + { + return (uint)(((x & 0x000000ff) << 24) + + ((x & 0x0000ff00) << 8) + + ((x & 0x00ff0000) >> 8) + + ((x & 0xff000000) >> 24)); + } + + /// + /// 手动设置系统时间 + /// + /// 需要设置的时间 + /// 返回系统时间设置状态,true为成功,false为失败 + public static bool SetLocalDateTime(DateTime dt) + { + Systemtime st; + st.year = (short)dt.Year; + st.month = (short)dt.Month; + st.dayOfWeek = (short)dt.DayOfWeek; + st.day = (short)dt.Day; + st.hour = (short)dt.Hour; + st.minute = (short)dt.Minute; + st.second = (short)dt.Second; + st.milliseconds = (short)dt.Millisecond; + bool rt = SetLocalTime(ref st); + return rt; + } + + + private static IPAddress iPAddress = null; + /// + /// 从NTP获取时间更新本地时间 + /// + /// + /// + /// + /// + public static bool Synchronization(string host, out DateTime syncDateTime, out string message) + { + syncDateTime = DateTime.Now; + try + { + message = ""; + if (iPAddress == null) + { + var iphostinfo = Dns.GetHostEntry(host); + var ntpServer = iphostinfo.AddressList[0]; + iPAddress = ntpServer; + } + DateTime dtStart = DateTime.Now; + //NTP消息大小摘要是16字节 (RFC 2030) + byte[] ntpData = new byte[48]; + //设置跳跃指示器、版本号和模式值 + // LI = 0 (no warning), VN = 3 (IPv4 only), Mode = 3 (Client Mode) + ntpData[0] = 0x1B; + IPAddress ip = iPAddress; + // NTP服务给UDP分配的端口号是123 + IPEndPoint ipEndPoint = new IPEndPoint(ip, 123); + // 使用UTP进行通讯 + Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + socket.Connect(ipEndPoint); + socket.ReceiveTimeout = 3000; + socket.Send(ntpData); + socket.Receive(ntpData); + socket?.Close(); + socket?.Dispose(); + DateTime dtEnd = DateTime.Now; + //传输时间戳字段偏移量,以64位时间戳格式,应答离开客户端服务器的时间 + const byte serverReplyTime = 40; + // 获得秒的部分 + ulong intPart = BitConverter.ToUInt32(ntpData, serverReplyTime); + //获取秒的部分 + ulong fractPart = BitConverter.ToUInt32(ntpData, serverReplyTime + 4); + //由big-endian 到 little-endian的转换 + intPart = swapEndian(intPart); + fractPart = swapEndian(fractPart); + ulong milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000UL); + // UTC时间 + DateTime webTime = (new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddMilliseconds(milliseconds); + //本地时间 + DateTime dt = webTime.ToLocalTime(); + bool isSuccess = SetLocalDateTime(dt); + syncDateTime = dt; + + } + catch (Exception ex) + { + message = ex.Message; + return false; + } + return true; + + } + } +} diff --git a/JY.Inspection/Common/DeleteLog.cs b/JY.Inspection/Common/DeleteLog.cs new file mode 100644 index 0000000..a651084 --- /dev/null +++ b/JY.Inspection/Common/DeleteLog.cs @@ -0,0 +1,120 @@ +using System; +using System.IO; +using System.Text; +using System.Threading; +using System.Collections.Generic; +using System.Runtime.InteropServices; + +namespace JY.Inspection +{ + public class ServiceLog + { + public void Start() + { + Thread thread = new Thread(Init); + thread.IsBackground = true; + thread.Start(); + } + + private void Init() + { + while (true) + { + try + { + DeleteFile(System.Environment.CurrentDirectory + @"\Logs\", 30); //删除该目录下 超过 30天的文件 + } + catch (Exception err) + { + Console.WriteLine(err.Message, err.StackTrace); + } + finally + { + Thread.Sleep(100000); + } + } + } + private void DeleteFile(string fileDirect, int saveDay) + { + try + { + DateTime nowTime = DateTime.Now; + string[] files = Directory.GetFiles(fileDirect, "*.txt", SearchOption.AllDirectories); //获取该目录下所有 .txt文件 + foreach (string file in files) + { + FileInfo fileInfo = new FileInfo(file); + TimeSpan t = DateTime.Now - fileInfo.CreationTime; //当前时间 减去 文件创建时间 + int day = t.Days; + if (day > saveDay) //保存的时间,单位:天 + { + if (IsOccupy(fileInfo.FullName)) //判断文件是否被占用 + { + System.IO.File.Delete(fileInfo.FullName); //删除文件 + } + else + { + + Log4Helper.WriteLog("文件被占用,无法操作!","错误提示"); + + } + } + } + } + catch (Exception err) + { + Log4Helper.WriteLog("文件被占用,无法操作!",err); + } + + } + + [DllImport("kernel32.dll")] + public static extern IntPtr _lopen(string lpPathName, int iReadWrite); + + [DllImport("kernel32.dll")] + public static extern bool CloseHandle(IntPtr hObject); + + public const int OF_READWRITE = 2; + public const int OF_SHARE_DENY_NONE = 0x40; + public readonly IntPtr HFILE_ERROR = new IntPtr(-1); + + /// + /// 判断文件是否被占用 + /// + /// + /// + private bool IsOccupy(string file) + { + bool result = true; //默认状态此文件未被占用 + try + { + //string vFileName = @"c:\temp\temp.bmp"; + string vFileName = file; + if (!System.IO.File.Exists(vFileName)) + { + //Logger.Info("文件都不存在!"); + result = false; + } + IntPtr vHandle = _lopen(vFileName, OF_READWRITE | OF_SHARE_DENY_NONE); + if (vHandle == HFILE_ERROR) + { + + Log4Helper.WriteLog("文件被占用!", "错误提示"); + result = false; + } + CloseHandle(vHandle); + Log4Helper.WriteLog("没有被占用!", "错误提示"); + + + } + catch (Exception err) + { + result = false; + Log4Helper.WriteLog("判断文件是否被占用", err); + + + } + return result; + } + + } +} \ No newline at end of file diff --git a/JY.Inspection/Common/ExcelToSQL.cs b/JY.Inspection/Common/ExcelToSQL.cs new file mode 100644 index 0000000..c109a3f --- /dev/null +++ b/JY.Inspection/Common/ExcelToSQL.cs @@ -0,0 +1,157 @@ +using System; +using System.Data; +using System.Data.OleDb; +using System.Windows.Forms; + +namespace JY.Infrastructure.Common +{ + public class ExcelToSQL + { + //DBUnti _db = new DBUnti(); + + + public bool ExcelToSql(ref string strErr) + { + try + { + OpenFileDialog fd = new OpenFileDialog(); + fd.Filter = "导入SQL数据库|*.xlsx;*.xls";//打开文件对话框筛选器 + if (fd.ShowDialog() == DialogResult.OK) + { + bool b= TransferData(fd.FileName, "tb_hxconfigbase", ref strErr); //数据库表中名称 + if (b) + { + return true; + } + } + } + catch (Exception ex) + { + strErr = ex.Message; + } + return false; + } + + + /// + /// Excel导入到Mysql + /// + /// + /// + public bool ExcelToStandardSQL(ref string strErr) + { + try + { + strErr = ""; + OpenFileDialog fd = new OpenFileDialog(); + fd.Filter = "导入SQL数据库|*.xlsx;*.xls";//打开文件对话框筛选器 + if (fd.ShowDialog() == DialogResult.OK) + { + DataTable dt = GetExcelDatatable(fd.FileName, "mapTable"); + bool b = OpDataBase.InsetMySqlData(dt,ref strErr); + if (strErr=="") + { + return true; + } + //TransferData(fd.FileName, "tb_hxconfigbase", _db.connstr,ref strErr); //数据库表中名称 + } + strErr = "取消导入"; + } + catch (Exception ex) + { + strErr = ex.Message; + } + return false; + } + + + /// + /// Excel导入到SQLSERVER + /// + /// + /// + /// + /// + public bool TransferData(string excelFile, string sheetName, ref string strErr) + { + strErr = ""; + DataSet ds = new DataSet(); + try + { + string strConn = ""; + strConn = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source=" + excelFile + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'"; + strConn = "Provider = Microsoft.ACE.OLEDB.12.0;Data Source=" + excelFile + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1'"; + OleDbConnection conn = new OleDbConnection(strConn); + conn.Open(); + string strExcel = ""; + OleDbDataAdapter myCommand; + strExcel = string.Format("select * from [{0}$]", sheetName); + myCommand = new OleDbDataAdapter(strExcel, strConn); + myCommand.Fill(ds, sheetName); + bool b= OpDataBase.InsetSqlData(ds, sheetName,ref strErr); + if (strErr=="") + { + return true; + } + #region 屏蔽 + ////列出ds内存表内所有数据,通过For循环把ModelType项数据添加到List集合 + //List Mlist = new List(); + //for (int i=0;i typeSet = new HashSet(Mlist);//去除List集合重复项 + //foreach(var item in typeSet) + //{ + // _sqldb.AddModelType(item, ref strErr); + //} + #endregion + + //如果目标表不存在则创建,excel文件的第一行为列标题,从第二行开始全部都是数据记录 + } + catch (Exception ex) + { + strErr = ex.Message; + } + return false; + } + + public DataTable GetExcelDatatable(string fileUrl, string table) + { + //office2007之前 仅支持.xls + //const string cmdText = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;IMEX=1';"; + //支持.xls和.xlsx,即包括office2010等版本的 HDR=Yes代表第一行是标题,不是数据; + const string cmdText = "Provider=Microsoft.Ace.OleDb.12.0;Data Source={0};Extended Properties='Excel 12.0; HDR=Yes; IMEX=1'"; + DataTable dt = null; + //建立连接 + OleDbConnection conn = new OleDbConnection(string.Format(cmdText, fileUrl)); + try + { + //打开连接 + if (conn.State == ConnectionState.Broken || conn.State == ConnectionState.Closed) + { + conn.Open(); + } + System.Data.DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); + //获取Excel的第一个Sheet名称 + string sheetName = schemaTable.Rows[0]["TABLE_NAME"].ToString().Trim(); + //查询sheet中的数据 + string strSql = "select * from [" + sheetName + "]"; + OleDbDataAdapter da = new OleDbDataAdapter(strSql, conn); + DataSet ds = new DataSet(); + da.Fill(ds, table); + dt = ds.Tables[0]; + return dt; + } + catch (Exception exc) + { + throw exc; + } + finally + { + conn.Close(); + conn.Dispose(); + } + } + } +} diff --git a/JY.Inspection/Common/ExportXls.cs b/JY.Inspection/Common/ExportXls.cs new file mode 100644 index 0000000..75aa6cc --- /dev/null +++ b/JY.Inspection/Common/ExportXls.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NPOI; +using NPOI.HPSF; +using NPOI.HSSF; +using NPOI.HSSF.UserModel; +using NPOI.SS.UserModel; +using NPOI.POIFS; +using NPOI.Util; +using System.IO; +using System.Data; +using System.Threading.Tasks; + +namespace JY.Infrastructure.Common +{ + class ExportXls + { + /// + /// 由DataTable导出Excel + /// + /// 要导出数据的DataTable + /// Excel工作表 + public void ExportDataTableToExcel(DataTable sourceTable, string sheetName, string filepath) + { + + FileStream file = new FileStream(filepath, FileMode.Create); + HSSFWorkbook workbook = new HSSFWorkbook(); + // MemoryStream ms = new MemoryStream(); + ISheet sheet = workbook.CreateSheet(sheetName); + IRow headerRow = sheet.CreateRow(0); + // handling header. + foreach (DataColumn column in sourceTable.Columns) + + headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName); + // handling value. + int rowIndex = 1; + + foreach (DataRow row in sourceTable.Rows) + { + IRow dataRow = sheet.CreateRow(rowIndex); + foreach (DataColumn column in sourceTable.Columns) + { + dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString()); + } + rowIndex++; + } + + workbook.Write(file); + file.Close(); + sheet = null; + headerRow = null; + workbook = null; + } + + } +} diff --git a/JY.Inspection/Common/Global.cs b/JY.Inspection/Common/Global.cs new file mode 100644 index 0000000..83f5087 --- /dev/null +++ b/JY.Inspection/Common/Global.cs @@ -0,0 +1,40 @@ +using JY.Model; +using System.Collections.Generic; +using System.IO; + +namespace JY.Inspection +{ + public class Global + { + /// + /// 错误日志路径 + /// + public static string strErrorLogspath = System.Windows.Forms.Application.StartupPath + "\\Logs\\ErrorLogs"; + + public static string strSystemLogspath = System.Windows.Forms.Application.StartupPath + "\\Logs\\SystemLogs"; + /// + /// MES路径日志 + /// + public static string strMesLogspath = System.Windows.Forms.Application.StartupPath + "\\Logs\\MesLogs"; + /// + /// PLC读取寄存器配置文件路径 + /// + public static string ConfigPath = Path.Combine(System.Windows.Forms.Application.StartupPath, "ini\\PlcConfig.ini"); + /// + /// 系统程序配置文件路径 + /// + public static string iniFilePath = Path.Combine(System.Windows.Forms.Application.StartupPath, "ini\\Configure.ini"); + + public static string CollectItemCfgPath = Path.Combine(System.Windows.Forms.Application.StartupPath, @"Config/采集项参照表.xlsx"); + + + public static SystemConfig systemConfig = new SystemConfig(); + + + public static List Instructions = new List(); + + + + + } +} diff --git a/JY.Inspection/Common/Log4Helper.cs b/JY.Inspection/Common/Log4Helper.cs new file mode 100644 index 0000000..63374fd --- /dev/null +++ b/JY.Inspection/Common/Log4Helper.cs @@ -0,0 +1,32 @@ +using log4net; +using System; + +namespace JY.Inspection +{ + internal class Log4Helper + { + public static void WriteLog(Type t, Exception ex) + { + ILog log = LogManager.GetLogger(t); + log.Error(ex); + } + + public static void WriteLog(Type t, string msg) + { + ILog log = LogManager.GetLogger(t); + log.Info(msg); + } + + public static void WriteLog(string className, Exception ex) + { + ILog log = LogManager.GetLogger(className); + log.Error(ex); + } + + public static void WriteLog(string className, string msg) + { + ILog log = LogManager.GetLogger(className); + log.Info(msg); + } + } +} diff --git a/JY.Inspection/Common/MessageBoxTimeOut.cs b/JY.Inspection/Common/MessageBoxTimeOut.cs new file mode 100644 index 0000000..be3c3dd --- /dev/null +++ b/JY.Inspection/Common/MessageBoxTimeOut.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace JY.Inspection +{ + public class MessageBoxTimeOut + { + private string _caption; + //public void Alert(string msg, FrmAlert.enmType type) + //{ + // FrmAlert frm = new FrmAlert(); + // frm.ShowAlert(msg, type); + //} + public void Show(string text, FrmAlert.enmType type) + { + this._caption = "信息提示"; + StartTimer(3000); + //Alert(text, type); + + MessageBox.Show(text,"信息提示"); + } + private void StartTimer(int interval) + { + Timer timer = new Timer(); + timer.Interval = interval; + timer.Tick += new EventHandler(Timer_Tick); + timer.Enabled = true; + } + private void Timer_Tick(object sender, EventArgs e) + { + KillMessageBox(); + //停止计时器 + ((Timer)sender).Enabled = false; + } + [DllImport("User32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)] + private extern static IntPtr FindWindow(string lpClassName, string lpWindowName); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern int PostMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); + public const int WM_CLOSE = 0x10; + private void KillMessageBox() + { + //查找MessageBox的弹出窗口,注意对应标题 + IntPtr ptr = FindWindow(null, this._caption); + if (ptr != IntPtr.Zero) + { + //查找到窗口则关闭 + PostMessage(ptr, WM_CLOSE, IntPtr.Zero, IntPtr.Zero); + } + } + } +} diff --git a/JY.Inspection/Common/MessageTip.cs b/JY.Inspection/Common/MessageTip.cs new file mode 100644 index 0000000..f4dbf30 --- /dev/null +++ b/JY.Inspection/Common/MessageTip.cs @@ -0,0 +1,443 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.IO; +using System.Threading; +using System.Windows.Forms; + +namespace JY.Inspection +{ + + public enum Logstype//枚举类型 + { + Message, + Warning, + Error + } + + + /// + /// 轻快型消息提示类 + /// + public static class MessageTip + { + static readonly Image _iconOk; + static readonly Image _iconWarning; + static readonly Image _iconError; + + /// + /// 全局停留时长(毫秒),影响后续弹出的tip。默认500 + /// + public static int DefaultDelay { get; set; } + + /// + /// 是否允许上浮动画。默认true + /// + public static bool AllowFloating { get; set; } + + static MessageTip() + { + DefaultDelay = 500; + AllowFloating = true; + + Bitmap spriteImage; + using (var ms = new MemoryStream(Convert.FromBase64String(DefaultIconData))) + { + //不能直接用Img.FromMs得到的对象,怀疑因该方法得到的对象与源ms有瓜葛 + //ms释放后会导致莫名问题,比如下面的Clone会引发内存不足异常 + //而new Bitmap(Image)相当于基于Image重造了一个全新的bmp + spriteImage = new Bitmap(Image.FromStream(ms)); + } + + _iconOk = spriteImage.Clone(new Rectangle(0, 0, 32, 32), spriteImage.PixelFormat); + _iconWarning = spriteImage.Clone(new RectangleF(32, 0, 32, 32), spriteImage.PixelFormat); + _iconError = spriteImage.Clone(new RectangleF(64, 0, 32, 32), spriteImage.PixelFormat); + } + + /// + /// 显示良好消息,图标为绿勾 √ + /// + /// 消息文本 + /// 消息停留时长(毫秒)。指定负数则使用 DefaultDelay + public static void ShowOk(string text = null, int delay = -1) + { + Show(text, _iconOk, Color.SeaGreen, Color.White, delay); + } + + /// + /// 显示警告消息,图标为黄色感叹号 ! + /// + /// 消息文本 + /// 消息停留时长(毫秒)。指定负数则使用 DefaultDelay + public static void ShowWarning(string text = null, int delay = -1) + { + Show(text, _iconWarning, Color.DarkOrange, Color.Black, delay); + } + + /// + /// 显示出错消息,图标为红叉 X + /// + /// 消息文本 + /// 消息停留时长(毫秒)。指定负数则使用 DefaultDelay + public static void ShowError(string text = null, int delay = -1) + { + Show(text, _iconError, Color.Red, Color.White, delay); + } + + /// + /// 显示消息 + /// + /// 消息文本 + /// 图标。不会进行缩放 + /// 消息停留时长(毫秒)。指定负数则使用 DefaultDelay + public static void Show(string text, Image icon, Color bkColor, Color textColor, int delay = -1) + { + ThreadPool.QueueUserWorkItem(obj => new TipForm + { + TipText = text, + TipIcon = icon, + Delay = delay < 0 ? DefaultDelay : delay, + Floating = AllowFloating, + BkColor = bkColor, + TextColor= textColor, + BasePoint = Control.MousePosition //在鼠标点击的附近弹出 + }.ShowDialog()); ;//要让创建浮动窗体的线程具有消息循环,所以要用ShowDialog + } + + /// + /// 内置图标数据:√ ! X + /// + const string DefaultIconData = @"R0lGODlhYAAgANUAAOrcJ9LORebm5tJKShPLJLczM/z3s/XrkNfSOhS2JKaYMezeaMoREfhwcNS3 +t7IREVSkWpWQZjCpPfz8+zS4RN3PZdTU1EjLWG9uaO/w7/Dke1HVYfHsx5UzM8Q8PLjYuqmmn8bl +yeO3txsbD+fck9DAUeDaVV1cHuHXMDGTOO3iSeHy4+BYWDvGTPn25O/hN5PIl8K1Pbfhu/z78nW/ +fPb39lbeZ5/WpIAzM2HpcqITExGiIjV/N8S9luLbqf///yH5BAAAAAAALAAAAABgACAAAAb/wJ9w +SCwaj8ikcslsOp/QKFNUEEGpVqm2OQtUZlJqo+oUk7fHFUWmJWk0pKi4Mc4qxaw6uli7bNZRMxUG +BhUuT3gseWdIc4p6e0I0Fzk5EmxPboQHcU2Jiot2RZ+PjFs3LTk2G5aYTC6DBweFh0wFDaC5kERi +Ayy+v4oFeyEUNqsbrJdNmm8GcJ63A9PUA7s/VL/V0yymUWobNhfj4xsSTByxb7MVHNEN29xn2fG+ +3lB9F+LkfstLFbMWaBAoq0KZWx4SJhzgoZuIbB4YLox4DwqNFuJaaGxxgQIMdIM0RMCAIYKGQu6a +OCjAQqHLAQUKSHSZsOKTG8YubNRIgUYT/4AHFpAkqaHghIMtPRRQuhAm06VQHSiRAQhJCAl/JCSQ +wJUChBogDQgcimHBggPtnqyEGbOt27c2hciQYMNfkRUSOu7Yu1fCVyYTAA5cMJKk2aJfEHVgC9et +UqlJqNowZlfIBAgULvDtK2FFEx+DzArFcCKCaLQ+rixVCpd1B1FG5k6mQNnVDxoUNmzewTUElxIH +BhMeMeJEiQBeFpQAo7YDa9YPdEiP+0M27evmMN2QQCNBgs0SbjgBHXSBCQQniJ9AjnxBhU4H2Uqf +L/21ErrXrydoIeHD1Q3e7eDdVh814QJwGpjAngLEKcBeeyWA5cli9FVYH2xEzPUHBS0MuP+fBClc +4KGA3B3FTAUaBICAigEocMIJCqy4ohcBwHeHczpEZyF99iGhIQUeetfCH0H6lYETByaIwJJLxvBi +DEwyaUIJtSThQAcFPBCdljl2uWV0PR7xQV4EDFhmAmWe6R0EnjlRQQULRLmkCW+cJ6eCBiUhApZa +9unnn312AJmYErRAwKFopplmAin45gQHJWgg56SUTpmSEVcyAKiWHXSwKaeDGjGmooeWemgKHzwR +mAkmoODqqygwOIICsL66Yp6j4KDpA7vuKuiVWu7KK6hJfJCCqcimUOCjJSxQ66vEEffsqyVcKoQD +umqqrbY4QJYprwxs+4CgxR6LLAEp+KT/agkmqAArANBG+yy8KARQgok/YBvuvvx2S4S+4PLLgL9I +GIvsDhDg+1kM7gLgMLwPR0BcBA8/jMLDMaQmRLYCh0vwvxx3jIMSBiMKwZGqxmDCCxW3rIIsKrTc +MgIxmKivyKGC3PHAOf8wQQ0ZZCAACObyYIEAQWdQw9ITNH2EDwzLLPXUFWc8xM37fnwE1h73/APQ +AlggNgg88NCD2EcLgLTSThtB6wsqvCD33HIDwDLLVDsc678dZO11EZl2jcTPQattuNpJK11D020T +MUEPCkQu+eSUV255DwrrS65Kum4eyRJNAy304aSXXrriTk8wOgg4gIB22okbjjbrICC9E/jnuEcR ++uiHB73076KT7rvTQQAAOw=="; + + /// + /// 浮动消息层 + /// + private class TipForm : Form + { + /// + /// 图标和文本之间的间距(像素) + /// + const int IconTextSpacing = 3; + + /// + /// 基准点。用于指导本窗体显示位置 + /// + public Point BasePoint { get; set; } + /// + /// 显示文字 + /// + string _tipText; + /// + /// 背景色 + /// + Color _bkColor = Color.SeaGreen; + /// + /// 文字颜色 + /// + Color _textColor=Color.Black; + /// + /// 提示图标 + /// + public Image TipIcon { get; set; } + + /// + /// 提示文本 + /// + public string TipText + { + get { return _tipText ?? string.Empty; } + set { _tipText = value; } + } + + /// + /// 文字显示颜色 + /// + //[DefaultValue(500)] + public Color TextColor + { + get { return _textColor; } + set + { + _textColor = value; + this.ForeColor = _textColor; + } + } + + /// + /// 停留时长(毫秒) + /// + [DefaultValue(500)] + public int Delay { get; set; } + + /// + /// 停留时长(毫秒) + /// + //[DefaultValue(Color.White)] + public Color BkColor + { + get { return _bkColor; } + set + { + _bkColor = value; + this.BackColor = _bkColor; + } + } + /// + /// 是否允许浮动 + /// + [DefaultValue(true)] + public bool Floating { get; set; } + + //显示后不激活,即不抢焦点 + protected override bool ShowWithoutActivation + { + get { return true; } + } + + public TipForm() + { + //双缓冲。有必要 + SetStyle(ControlStyles.UserPaint, true); + DoubleBuffered = true; + + InitializeComponent(); + + Delay = 500; + Floating = true; + BkColor = Color.White; + this._timer.Tick += timer_Tick; + this.Load += TipForm_Load; + this.Shown += TipForm_Shown; + this.FormClosing += TipForm_FormClosing; + } + + /// + /// 根据图标和文字处理窗体尺寸 + /// + private void ProcessClientSize() + { + Size size = Size.Empty; + if (TipIcon != null) + { + size += TipIcon.Size; + } + if (TipText.Length != 0) + { + if (TipIcon != null) + { + size.Width += IconTextSpacing;//图标与文字的间距 + } + var textSize = TextRenderer.MeasureText(TipText, this.Font); + size.Width += textSize.Width; + if (size.Height < textSize.Height) { size.Height = textSize.Height; } + } + this.ClientSize = size + Padding.Size; + } + private int x, y; //显示的坐标变量 + /// + /// 根据基准点处理窗体显示位置 + /// + private void ProcessLocation() + { + + #region 弹窗显示在屏幕中间 + this.y = (Screen.PrimaryScreen.Bounds.Height - 30 - this.Height) / 2; + this.x = (Screen.PrimaryScreen.Bounds.Width - 10 - this.Width) / 2; + this.Location = new Point(this.x, this.y); + #endregion + + #region 弹窗显示在屏幕右下角 + //this.x = Screen.PrimaryScreen.WorkingArea.Width - this.Width + 15; + //this.y = Screen.PrimaryScreen.WorkingArea.Height - this.Height * i - 5 * i; + //this.Location = new Point(this.x, this.y); + #endregion + + #region 弹窗跟随鼠标位置 + //var p = BasePoint; + //p.X -= Screen.PrimaryScreen.WorkingArea.Width - this.Width - 1000;//Screen.PrimaryScreen.WorkingArea.Width-this.Width / 2; + + ////横向处理。距离屏幕左右两边太近时的处理 + //int screenWidth; + //if (p.X < 10) + //{ + // p.X = 10; + //} + //else if (p.X + this.Width > (screenWidth = Screen.PrimaryScreen.Bounds.Width) - 10) + //{ + // p.X = screenWidth - 10 - this.Width; + //} + + ////纵向处理。在鼠标上方显示 + //p.Y -= this.Height + 20; + + //this.Location = p; + #endregion + } + + void TipForm_Load(object sender, EventArgs e) + { + ProcessClientSize(); + ProcessLocation(); + + //上浮窗体动画。采用异步,以不阻塞透明渐变动画的进行 + if (Floating) + { + ThreadPool.QueueUserWorkItem(obj => + { + while (this.IsHandleCreated) + { + this.BeginInvoke(new Action(arg => + { + this.Top--; + Application.DoEvents(); + }), (object)null); + + Thread.Sleep(30); + } + }); + } + + //透明渐入动画。之所以不用异步是为了在完全显示后再开始Delay的计时 + //不然如果Delay设置过低,还没等看清就渐隐了 + this.Opacity = 0; + while (this.Opacity < 1) + { + this.Opacity += 0.1; + Application.DoEvents(); + Thread.Sleep(10); + } + } + + void TipForm_Shown(object sender, EventArgs e) + { + //因为timer.Interval不能为0 + if (Delay > 0) + { + _timer.Interval = Delay; + _timer.Start(); + } + else + { + this.Close(); + } + } + + void timer_Tick(object sender, EventArgs e) + { + _timer.Stop(); + this.Close(); + } + + void TipForm_FormClosing(object sender, FormClosingEventArgs e) + { + //透明渐隐动画 + while (this.Opacity > 0) + { + this.Opacity -= 0.1; + Application.DoEvents(); + Thread.Sleep(20); + } + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + var clip = GetPaddedRectangle();//得到作图区域 + var g = e.Graphics; + //g.DrawRectangle(Pens.Red, clip);//debug + + //画图标 + if (TipIcon != null) + { + g.DrawImageUnscaled(TipIcon, clip.Location); + } + //画文本 + if (TipText.Length != 0) + { + if (TipIcon != null) + { + clip.X += TipIcon.Width + IconTextSpacing; + } + TextRenderer.DrawText(g, TipText, this.Font, clip, this.ForeColor, TextFormatFlags.VerticalCenter); + } + } + + protected override void OnPaintBackground(PaintEventArgs e) + { + base.OnPaintBackground(e); + + //画边框 + ControlPaint.DrawBorder(e.Graphics, this.ClientRectangle, SystemColors.ControlDark, ButtonBorderStyle.Solid); + } + + /// + /// 获取刨去Padding的内容区 + /// + private Rectangle GetPaddedRectangle() + { + Rectangle r = this.ClientRectangle; + r.X += this.Padding.Left; + r.Y += this.Padding.Top; + r.Width -= this.Padding.Horizontal; + r.Height -= this.Padding.Vertical; + return r; + } + + #region 设计器内容 + + protected override void Dispose(bool disposing) + { + if (disposing) + { + _timer.Dispose();//这货必须显示释放 + } + base.Dispose(disposing); + } + + private void InitializeComponent() + { + this._timer = new System.Windows.Forms.Timer(); + this.SuspendLayout(); + + this.AutoScaleMode = AutoScaleMode.None; + //this.ClientSize = new System.Drawing.Size(100, 100); + this.BackColor = Color.White; + this.Font = new Font(SystemFonts.MessageBoxFont.FontFamily, 12); + this.FormBorderStyle = FormBorderStyle.None; + this.Padding = new Padding(20, 10, 20, 10); + this.Name = "TipForm"; + this.ShowInTaskbar = false; + + this.ResumeLayout(false); + } + + private System.Windows.Forms.Timer _timer; + + #endregion + } + + } +} diff --git a/JY.Inspection/Common/PLCAlarmParse.cs b/JY.Inspection/Common/PLCAlarmParse.cs new file mode 100644 index 0000000..1572f78 --- /dev/null +++ b/JY.Inspection/Common/PLCAlarmParse.cs @@ -0,0 +1,193 @@ +using JY.Inspection.Entity; +using System.Collections.Generic; +using System.Linq; + +namespace JY.Inspection.Common +{ + public static class PLCAlarmParse + { + + /// + /// 三菱将报警地址值转成报警List + /// + /// PLC地址值,如100 + /// PLC读取出来的值 + /// PLC地址类型,默认值R + /// + public static List MelsecByte2Status(int plcAddrSuffix, byte[] byteData, char plcAddrPrefix = 'R') + { + var listAlarmStatus = new List(); + // byte[]转为二进制字符串表示 + string strResult = ""; + for (int i = 0; i < byteData.Length; i++) + { + string strTemp = System.Convert.ToString(byteData[i], 2); + strTemp = strTemp.PadLeft(8, '0').StrReverse(); + strResult += strTemp; + } + + for (int i = 0; i < strResult.Length; i++) + { + var plcByte = i % 16; + //如果是16的倍数地址+1 + if (plcByte % 16 == 0 && i != 0) + { + plcAddrSuffix++; + } + //将地址和状态添加到结果集 + listAlarmStatus.Add(new AlarmStatus() + { + PLCAdress = $"{plcAddrPrefix}{plcAddrSuffix}.{plcByte.ToString("X")}", + Status = strResult[i] == '1' + }); + //if (strResult[i] == '1') + // Console.WriteLine($"{plcAddrPrefix}{plcAddrSuffix}.{plcByte.ToString("X")}:{strResult[i]}"); + } + + return listAlarmStatus; + } + + + /// + /// 欧姆龙NX系列Ethernet/IP通讯时将报警地址值转成报警List {直接读取标签地址/无需高低位互换} + /// + /// PLC地址值,如100 + /// PLC读取出来的值 + /// PLC地址类型,默认值R + /// + public static List OmronEIPByte2Status(int plcAddrSuffix, List byteData, char plcAddrPrefix = 'W') + { + var listAlarmStatus = new List(); + // byte[]转为二进制字符串表示 + string strResult = ""; + for (int i = 0; i < byteData.Count; i++) + { + string strTemp = System.Convert.ToString(byteData[i], 2); + strTemp = strTemp.PadLeft(8, '0').StrReverse(); + strResult += strTemp; + } + + for (int i = 0; i < strResult.Length; i++) + { + var plcByte = i % 16; + //如果是16的倍数地址+1 + if (plcByte % 16 == 0 && i != 0) + { + plcAddrSuffix++; + } + //将地址和状态添加到结果集 + listAlarmStatus.Add(new AlarmStatus() + { + PLCAdress = $"{plcAddrPrefix}6100[{plcAddrSuffix}].B[{plcByte.ToString()}]", + Status = strResult[i] == '1' + }); + + //if (strResult[i] == '1') + // Console.WriteLine($"{plcAddrPrefix}{plcAddrSuffix}.{plcByte.ToString("X")}:{strResult[i]}"); + } + + return listAlarmStatus; + } + + + /// + /// 欧姆龙FINS通讯读取EM数据寄存器是时将报警地址值转成报警List + /// + /// PLC地址值,如100 + /// PLC读取出来的值 + /// PLC地址类型,默认值W + /// + public static List OmronFinsByte2Status(int plcAddrSuffix, byte[] byteData, char plcAddrPrefix = 'E') + { + var listAlarmStatus = new List(); + // byte[]转为二进制字符串表示 + byte[] revBytes = SWAPbyte(byteData); //字节高低位互换 + string strResult = ""; + for (int i = 0; i < revBytes.Length; i++) + { + string strTemp = System.Convert.ToString(revBytes[i], 2); + strTemp = strTemp.PadLeft(8, '0').StrReverse(); + strResult += strTemp; + } + + for (int i = 0; i < strResult.Length; i++) + { + var plcByte = i % 16; + //如果是16的倍数地址+1 + if (plcByte % 16 == 0 && i != 0) + { + plcAddrSuffix++; + } + //将地址和状态添加到结果集 + listAlarmStatus.Add(new AlarmStatus() + { + PLCAdress = $"{plcAddrPrefix}{plcAddrSuffix}.{plcByte.ToString("X")}", + Status = strResult[i] == '1' + }); + //if (strResult[i] == '1') + // Console.WriteLine($"{plcAddrPrefix}{plcAddrSuffix}.{plcByte.ToString("X")}:{strResult[i]}"); + } + + return listAlarmStatus; + + } + /// + /// 欧姆龙FINS通讯读取W数据寄存器是时将报警地址值转成报警List + /// + /// PLC地址值,如100 + /// PLC读取出来的值 + /// PLC地址类型,默认值W + /// + //public static List OmronByte2Status(int plcAddrSuffix, byte[] byteData, char plcAddrPrefix = 'W') + //{ + // var listAlarmStatus = new List(); + + // var addrCount = byteData.Length / 2; + // // byte[]每个地址保存的都是bool值,只取双数index位 + // for (int i = 0; i < addrCount; i++) + // { + // //将地址和状态添加到结果集 + // listAlarmStatus.Add(new AlarmStatus() + // { + // PLCAdress = $"{plcAddrPrefix}{plcAddrSuffix + i}", + // Status = byteData[i * 2 + 1] == 1 + + // }); + // //if (byteData[i * 2 + 1] == 1) + // // Console.WriteLine($"原始数据 PLC地址:{plcAddrPrefix}{plcAddrSuffix + i} 报警值:{byteData[i * 2 + 1]}"); + // } + + // return listAlarmStatus; + //} + + + + + /// + /// 字符串反转 + /// + /// 需要反转字符串.Reverse() + /// + public static string StrReverse(this string str) + { + return new string(str.Reverse().ToArray()); + } + + + /// + ///byte字节高低位互换 + /// + /// + /// + public static byte[] SWAPbyte(byte[] data) + { + byte[] data2 = new byte[data.Length]; + for (int i = 0; i < data.Length; i += 2) + { + data2[i] = data[i + 1]; + data2[i + 1] = data[i]; + } + return data2; + } + } +} diff --git a/JY.Inspection/Common/StrUtil.cs b/JY.Inspection/Common/StrUtil.cs new file mode 100644 index 0000000..b024faa --- /dev/null +++ b/JY.Inspection/Common/StrUtil.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Inspection.Common +{ + public class StrUtil + { + /// + /// 前端字节补0 + /// + /// + /// + /// + public static string GetStartString(string str, int count) + { + string strRes = str; + int strCount = str.Length; + + if (strCount != count) + { + strRes = str.PadLeft(count, '0'); + + } + return strRes; + } + + /// + /// 增加结尾字节长度 + /// + /// + /// + /// + public static string GetEndString(string str, int count) + { + string strRes = str; + int strCount = str.Length; + + if (strCount != count) + { + + strRes = str.PadRight(count, ' '); + + } + return strRes; + } + + /// + /// 生成字符串List集合 + /// + /// + /// + public static List GetListString(int Num, string str) + { + List list = new List(); + for (int i = 0; i < Num; i++) + { + list.Add(str); + } + return list; + } + } +} diff --git a/JY.Inspection/Common/TxtHelper.cs b/JY.Inspection/Common/TxtHelper.cs new file mode 100644 index 0000000..045bdae --- /dev/null +++ b/JY.Inspection/Common/TxtHelper.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace JY.Common.Helper +{ + public class TxtHelper + { + static ReaderWriterLockSlim sucessLogWriteLockSlim = new ReaderWriterLockSlim(); + + /// + /// 写入TEXT文本 + /// + /// 文件名 + /// 内容 + /// 保存结果 + public static bool WriteTxt(string fullName, string content) + { + FileStream fs = null; + StreamWriter sw = null; + + try + { + string directory = fullName.Substring(0, fullName.LastIndexOf('\\')); + if (!Directory.Exists(directory)) + { + Directory.CreateDirectory(directory); + } + + sucessLogWriteLockSlim.EnterWriteLock();//加锁防止抢占 + if (!File.Exists(fullName)) + { + fs = new FileStream(fullName, FileMode.Create, FileAccess.Write); + sw = new StreamWriter(fs, Encoding.UTF8); + } + else + { + fs = new FileStream(fullName, FileMode.Append, FileAccess.Write); + sw = new StreamWriter(fs, Encoding.UTF8); + } + + sw.WriteLine(content); + + sw.Close(); + fs.Close(); + + return true; + } + catch (Exception ex) + { + sw?.Close(); + fs?.Close(); + + } + finally + { + sucessLogWriteLockSlim.ExitWriteLock(); + } + + return false; + } + + } +} diff --git a/JY.Inspection/Common/UserHelper.cs b/JY.Inspection/Common/UserHelper.cs new file mode 100644 index 0000000..9576ff6 --- /dev/null +++ b/JY.Inspection/Common/UserHelper.cs @@ -0,0 +1,296 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.IO; +using System.Linq; +using System.Runtime.Serialization.Formatters.Binary; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Inspection.Common +{ + public class CurrentInfo + { + public static Autuority autuority = Autuority.Empty; + public static bool LoginOut = false; + } + + [Serializable] + public class User + { + /// + /// 序号 + /// + /// + [Display(Name = "序号")] + public int Index { get; set; } + /// + /// 用户名 + /// + /// + [Display(Name = "用户名")] + public string UserName { get; set; } + /// + /// 密码 + /// + /// + [Display(Name = "密码")] + public string PassWord { get; set; } + /// + /// 权限 + /// + /// + [Display(Name = "权限")] + public Autuority Level { get; set; } + } + + /// + /// 权限枚举 + /// + public enum Autuority + { + 管理员,//管理员 + 工程师,//工程师 + 操作员,//操作员 + Empty, + } + + public class UserHelper + { + private string filePath = string.Empty; + public UserHelper(string path) + { + filePath = path; + } + + /// + /// 序列化到文件 + /// + /// + /// + /// + public bool SerializedUser(string path, List listUser) + { + if (listUser == null) + { + return false; + } + BinaryFormatter format = new BinaryFormatter(); + using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write)) + { + format.Serialize(fs, listUser); + return true; + } + } + + /// + /// 反序列化到文件 + /// + /// + /// + public List DeSerializedUser(string path) + { + BinaryFormatter format = new BinaryFormatter(); + try + { + using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) + { + object o = format.Deserialize(fs); + return o as List; + } + } + catch (Exception) + { + return null; + } + + } + + /// + /// 创建超级用户 + /// + /// + /// + public void CheckSupperUser(string path, List listUser) + { + if (!File.Exists(path)) + { + User user = new User() + { + Index = 0, + UserName = "Admin", + PassWord = "Admin", + Level = Autuority.管理员 + }; + listUser.Add(user); + SerializedUser(path, listUser); + } + } + + /// + /// 检查重复性 + /// + /// + /// + /// + public bool CheckContainUser(List listUser, string userNmae) + { + var user = from item in listUser + where item.UserName == userNmae + select item; + if (user.Count() > 0) + { + return true; + } + return false; + } + + /// + /// 添加用户 + /// + /// + /// + /// + /// + public bool AddUser(string path, List listUser, User user) + { + try + { + if (user == null) + { + return false; + } + if (CheckContainUser(listUser, user.UserName)) + { + return false; + } + listUser.Add(user); + SerializedUser(path, listUser); + return true; + } + catch + { + return true; + } + } + + /// + /// 删除 + /// + /// + /// + /// + /// + public bool DeleteUser(string path, List listUser, string userNmae) + { + try + { + if (listUser == null) + { + return false; + } + int index = 0; + foreach (var item in listUser) + { + if (item.UserName == userNmae) + { + break; + } + index++; + } + if (index == 0) + { + return false; + } + listUser.RemoveAt(index); + SerializedUser(path, listUser); + return true; + } + catch + { + return false; + } + } + + /// + /// 修改用户 + /// + /// + /// + /// + /// + public bool EditUser(string path, List listUser, User user) + { + try + { + if (listUser == null) + { + return false; + } + foreach (var item in listUser) + { + if (item.UserName == user.UserName) + { + item.PassWord = user.PassWord; + item.Level = user.Level; + SerializedUser(path, listUser); + return true; + } + } + return false; + } + catch + { + return false; + } + } + + public User CheckUserLogin(string path, string userName, string passWord, ref string strErr) + { + if (!File.Exists(path)) + { + return null; + } + + List list = DeSerializedUser(path); + if (list == null) + { + return null; + } + User user = new User(); + if (string.IsNullOrEmpty(userName)) + { + var res1 = from item in list + where item.PassWord == passWord + select item; + if (res1.Count() == 0) + { + return null; + } + foreach (var item in res1) + { + user.UserName = item.UserName; + user.PassWord = item.PassWord; + user.Level = item.Level; + } + } + else + { + var res = from item in list + where item.PassWord == passWord && item.UserName == userName + select item; + if (res.Count() == 0) + { + return null; + } + foreach (var item in res) + { + user.UserName = item.UserName; + user.PassWord = item.PassWord; + user.Level = item.Level; + } + } + return user; + } + } +} diff --git a/JY.Inspection/Config/ComConfig.ini b/JY.Inspection/Config/ComConfig.ini new file mode 100644 index 0000000..314c468 --- /dev/null +++ b/JY.Inspection/Config/ComConfig.ini @@ -0,0 +1,66 @@ +[SystemConfig] +ComCount=2 + +[1#COMMUNICATION_SETTING] +Tgr_Count=1 +Auto_Connect=True +Connect_Typt=2 +Endsymbol=1 +HeartBeat=False +HeartText=3000 +HeartTime=1000 +TCP_IP=127.0.0.1 +TCP_Port=7321 +COM_Port=COM3 +COM_BaudRate=38400 +COM_Parity=None +COM_DataBit=8 +COM_StopBit=1 + +[2#COMMUNICATION_SETTING] +Tgr_Count=1 +Auto_Connect=True +Connect_Typt=2 +Endsymbol=0 +HeartBeat=False +HeartText=3000 +HeartTime=1000 +TCP_IP=127.0.0.1 +TCP_Port=8321 +COM_Port=COM1 +COM_BaudRate=9600 +COM_Parity=None +COM_DataBit=8 +COM_StopBit=1 + +[3#COMMUNICATION_SETTING] +Tgr_Count=3 +Auto_Connect=True +Connect_Typt=3 +Endsymbol=0 +HeartBeat=False +HeartText=3000 +HeartTime=1000 +TCP_IP=127.0.0.3 +TCP_Port=60000 +COM_Port=COM1 +COM_BaudRate=9600 +COM_Parity=None +COM_DataBit=8 +COM_StopBit=1 + +[4#COMMUNICATION_SETTING] +Tgr_Count=4 +Auto_Connect=True +Connect_Typt=3 +Endsymbol=0 +HeartBeat=False +HeartText=3000 +HeartTime=1000 +TCP_IP=127.0.0.4 +TCP_Port=60000 +COM_Port=COM1 +COM_BaudRate=9600 +COM_Parity=None +COM_DataBit=8 +COM_StopBit=1 diff --git a/JY.Inspection/Config/Configure.ini b/JY.Inspection/Config/Configure.ini new file mode 100644 index 0000000..fd73962 --- /dev/null +++ b/JY.Inspection/Config/Configure.ini @@ -0,0 +1,58 @@ +[SYSTEM_CONFIGURE] +Company_Name=Íâ¹۷ֵµϵͳ +Project_Name=Íâ¹۷ֵµϵͳ +Project_FlowingText=Íâ¹۷ֵµϵͳ +IsMesUP=1 +IsSK=0 +Worker_code=123 +portName=COM2 +baudRate=9600 +ClassShift=2 +No=0 +TCP_IP=192.168.2.253 +TCP_Port=1030 + +[MESÅäÖÃ] +siteCode=18J +lineCode=18J-BZ-181 +equipCode=EVEDL18BZWGJ02 +materialCode=81035332 +productType=test +GradingMesUrl=http://10.22.167.141/core/api/public/eve/pm/eqm/new/grading +ResultProcessMesUrl=http://10.22.167.2/core/api/public/product/process/param/new/result +StationArrivalUrl=http://10.22.167.2/core/api/public/formation/section/arrival/bz +StationExitUrl=http://10.22.167.2/core/api/public/eve/pm/formation-section/bz +NGMessage=²»·ÖÀà,ÕýÃæ(2D/3D),·´Ãæ(2D/3D),×ó²àÃæ(2D/3D),ÓҲàÃæ(2D/3D),¶¥Ãæ(2D/3D),µ×Ãæ(2D/3D),µ×WE2,µ×WE2,µ×WE3,µ×WE4,ÖÐME1,ÖÐME2,ÖÐME3,ÖÐME1,¼«Öù(POS/NEG),·À±¬·§(PRO),ɨÂëNG,·ֵµNG,ÆäËû +CCDResultMessage=²»·ÖÀà,NG,OK +Grading1=K77 +Grading2=K77 +Grading3=K77 +Grading4=K77 +Grading5=K77 +Grading6=K77 +TensionStrap1=5 +TensionStrap2=6 +TensionStrap3=7 +TensionStrapCCDReslut1=1 +TensionStrapCCDReslut2=1 +TensionStrapCCDReslut3=1 +TensionStrapCCDReslut4=1 +StartNGFL=0 +Grading=1 +MesRequestTime=2 +LoginTime=10 + +[ͳ¼ƼÆÊý] +ProdAllQty=0 +ProdOKQty=0 +ProdSanNgQty=0 +ProdVolNgQty=0 +ProdImpNgty=0 +ProdBvolNgQty=0 +ProdKvalueNgty=0 +ProdLenthNgty=0 +ProdWideNgty=0 +ProdLMDNgty=0 +ProdLCDNgty=0 +ProdThinessNgty=0 +ProdMESNgty=0 diff --git a/JY.Inspection/Config/PlcConfig.ini b/JY.Inspection/Config/PlcConfig.ini new file mode 100644 index 0000000..9e3b147 --- /dev/null +++ b/JY.Inspection/Config/PlcConfig.ini @@ -0,0 +1,59 @@ +[SystemConfig] +ComCount=1 + +[1#PLCParameter] +Index=1 +IP=192.168.2.50 +Port=44818 +JobCount=3 +HeartBeat=True +HeartAddr=W100 +ScanTime=50 +Solt=0 + +1#ThreadName=ÉÏÁÏ +1#RecvAddr=W2000 +1#RecvType=Short +1#WriteAddr=W2020 +1#WriteType=Short +1#TriggerCmd=1 +1#IsRead=True +1#ReadAddr=W2010 +1#ReadType=Byte +1#ReadLength=80 + +2#ThreadName=ÏÂÁÏ +2#RecvAddr=W3000 +2#RecvType=Short +2#WriteAddr=W3020 +2#WriteType=Short +2#TriggerCmd=1 +2#IsRead=True +2#ReadAddr=W3010 +2#ReadType=Byte +2#ReadLength=118 + +3#ThreadName=±¨¾¯ +3#RecvAddr=W6000 +3#RecvType=Short +3#WriteAddr=W2006 +3#WriteType=Short +3#TriggerCmd=1 +3#IsRead=True +3#ReadAddr=W6100 +3#ReadType=Byte +3#ReadLength=1 + +4#ThreadName=Ò쳣²¥±¨ +4#RecvAddr=W7000 +4#RecvType=Short +4#WriteAddr=W7100 +4#WriteType=Short +4#TriggerCmd=1 +4#IsRead=True +4#ReadAddr=W7010 +4#ReadType=Byte +4#ReadLength=1 + + + diff --git a/JY.Inspection/Config/采集项参照表.xlsx b/JY.Inspection/Config/采集项参照表.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3c0a6c0c151e70889bfa6af4814e1459c961f415 GIT binary patch literal 10278 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 literal 0 HcmV?d00001 diff --git a/JY.Inspection/EmailTemplate/Model.xls b/JY.Inspection/EmailTemplate/Model.xls new file mode 100644 index 0000000000000000000000000000000000000000..28bbb169560cc78a8b56fdc4441a781090bf1347 GIT binary patch literal 27136 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 Z&CU*_dIKuogHohNAbHty`$rmx@;_M{4zvIO literal 0 HcmV?d00001 diff --git a/JY.Inspection/Entity/AlarmStatus.cs b/JY.Inspection/Entity/AlarmStatus.cs new file mode 100644 index 0000000..274b3e3 --- /dev/null +++ b/JY.Inspection/Entity/AlarmStatus.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Inspection.Entity +{ + public class AlarmStatus + { + /// + /// 报警地址 + /// + public string PLCAdress { get; set; } + + /// + /// 报警状态 + /// + public bool Status { get; set; } + } +} diff --git a/JY.Inspection/Frm/FormMesDataSet.cs b/JY.Inspection/Frm/FormMesDataSet.cs new file mode 100644 index 0000000..6675e8d --- /dev/null +++ b/JY.Inspection/Frm/FormMesDataSet.cs @@ -0,0 +1,107 @@ +using JY.Inspection.Common; +using JY.Inspection.ViewModel; +using JY.Utility; +using JYControl; +using MetroFramework.Forms; +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 JY.Inspection.Frm +{ + public partial class FormMesDataSet : MetroForm + { + private FrmMesSettingVM _viewModel = null; + public FormMesDataSet() + { + InitializeComponent(); + + _viewModel = new FrmMesSettingVM(); + SetDataBindings(); + } + + #region 数据绑定 + private void SetDataBindings() + { + bindingSource1.DataSource = _viewModel; + + tb_productType.DataBindings.Add(new Binding("Text", bindingSource1, "ProductType", true, DataSourceUpdateMode.OnPropertyChanged)); + tb_StationArrival.DataBindings.Add(new Binding("Text", bindingSource1, "StationArrivalUrl", true, DataSourceUpdateMode.OnPropertyChanged)); + tb_stationExit.DataBindings.Add(new Binding("Text", bindingSource1, "StationExitUrl", true, DataSourceUpdateMode.OnPropertyChanged)); + } + #endregion + + /// + /// 加载MES配置文件 + /// + /// + /// + private void FormMesDataSet_Load(object sender, EventArgs e) + { + + txtsiteCode.Text = IniFileHelper.ReadIniData("MES配置", "siteCode"); + txtlineCode.Text = IniFileHelper.ReadIniData("MES配置", "lineCode"); + txtequipCode.Text = IniFileHelper.ReadIniData("MES配置", "equipCode"); + txtmaterialCode.Text = IniFileHelper.ReadIniData("MES配置", "materialCode"); + _viewModel.ProductType = IniFileHelper.ReadIniData("MES配置", "productType"); + + txtGradingMesUrl.Text = IniFileHelper.ReadIniData("MES配置", "GradingMesUrl"); + txtResultProcessMesUrl.Text = IniFileHelper.ReadIniData("MES配置", "ResultProcessMesUrl"); + _viewModel.StationArrivalUrl = IniFileHelper.ReadIniData("MES配置", "StationArrivalUrl"); + _viewModel.StationExitUrl = IniFileHelper.ReadIniData("MES配置", "StationExitUrl"); + + LoginTime.Text = IniFileHelper.ReadIniData("MES配置", "LoginTime"); + txtMesRequestTime.Text = IniFileHelper.ReadIniData("MES配置", "MesRequestTime"); + + ckStartZNDB.Checked = IniFileHelper.ReadIniData("MES配置", "StartZNDB") == "1" ? true : false; + chkIsMesUP.Checked = IniFileHelper.ReadIniData("SYSTEM_CONFIGURE", "IsMesUP") == "1" ? true : false; + } + + /// + /// 保存MES配置文件信息 + /// + /// + /// + private void btnSave_Click(object sender, EventArgs e) + { + IniFileHelper.WriteIniData("MES配置", "siteCode", txtsiteCode.Text.Trim()); + IniFileHelper.WriteIniData("MES配置", "lineCode", txtlineCode.Text.Trim()); + IniFileHelper.WriteIniData("MES配置", "equipCode", txtequipCode.Text.Trim()); + IniFileHelper.WriteIniData("MES配置", "materialCode", txtmaterialCode.Text.Trim()); + IniFileHelper.WriteIniData("MES配置", "productType", _viewModel.ProductType.Trim()); + + IniFileHelper.WriteIniData("MES配置", "GradingMesUrl", txtGradingMesUrl.Text.Trim()); + IniFileHelper.WriteIniData("MES配置", "ResultProcessMesUrl", txtResultProcessMesUrl.Text.Trim()); + IniFileHelper.WriteIniData("MES配置", "StationArrivalUrl", _viewModel.StationArrivalUrl.Trim()); + IniFileHelper.WriteIniData("MES配置", "StationExitUrl", _viewModel.StationExitUrl.Trim()); + + IniFileHelper.WriteIniData("MES配置", "LoginTime", LoginTime.Text.Trim()); + LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}]设置权限超时时间[{LoginTime.Text.Trim()}]", LogAddtype.local, Logtype.Warning); + IniFileHelper.WriteIniData("MES配置", "MesRequestTime", txtMesRequestTime.Text.Trim()); + + IniFileHelper.WriteIniData("MES配置", "StartZNDB", ckStartZNDB.Checked ? "1" : "0"); + //是否启用MES + IniFileHelper.WriteIniData("SYSTEM_CONFIGURE", "IsMesUP", chkIsMesUP.Checked ? "1" : "2"); + MessageBox.Show("参数保存成功!", "系统提示"); + this.DialogResult = DialogResult.OK; + + } + + private void btnExit_Click(object sender, EventArgs e) + { + this.Close(); + } + + private void linkLabel_editCollectItemCfg_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + System.Diagnostics.Process.Start(Global.CollectItemCfgPath); + } + } +} diff --git a/JY.Inspection/Frm/FormMesDataSet.designer.cs b/JY.Inspection/Frm/FormMesDataSet.designer.cs new file mode 100644 index 0000000..0fc93d0 --- /dev/null +++ b/JY.Inspection/Frm/FormMesDataSet.designer.cs @@ -0,0 +1,713 @@ + +namespace JY.Inspection.Frm +{ + partial class FormMesDataSet + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormMesDataSet)); + this.btnExit = new MetroFramework.Controls.MetroButton(); + this.metroLabel1 = new MetroFramework.Controls.MetroLabel(); + this.txtlineCode = new MetroFramework.Controls.MetroTextBox(); + this.btnSave = new MetroFramework.Controls.MetroButton(); + this.metroLabel3 = new MetroFramework.Controls.MetroLabel(); + this.txtequipCode = new MetroFramework.Controls.MetroTextBox(); + this.txtsiteCode = new MetroFramework.Controls.MetroTextBox(); + this.metroLabel2 = new MetroFramework.Controls.MetroLabel(); + this.ckStartZNDB = new System.Windows.Forms.CheckBox(); + this.txtmaterialCode = new MetroFramework.Controls.MetroTextBox(); + this.metroLabel4 = new MetroFramework.Controls.MetroLabel(); + this.txtGradingMesUrl = new MetroFramework.Controls.MetroTextBox(); + this.metroLabel5 = new MetroFramework.Controls.MetroLabel(); + this.txtResultProcessMesUrl = new MetroFramework.Controls.MetroTextBox(); + this.metroLabel6 = new MetroFramework.Controls.MetroLabel(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.linkLabel_editCollectItemCfg = new System.Windows.Forms.LinkLabel(); + this.metroLabel21 = new MetroFramework.Controls.MetroLabel(); + this.LoginTime = new System.Windows.Forms.NumericUpDown(); + this.metroLabel22 = new MetroFramework.Controls.MetroLabel(); + this.metroLabel18 = new MetroFramework.Controls.MetroLabel(); + this.txtMesRequestTime = new System.Windows.Forms.NumericUpDown(); + this.metroLabel20 = new MetroFramework.Controls.MetroLabel(); + this.chkIsMesUP = new System.Windows.Forms.CheckBox(); + this.metroLabel7 = new MetroFramework.Controls.MetroLabel(); + this.tb_productType = new MetroFramework.Controls.MetroTextBox(); + this.metroPanel_top = new MetroFramework.Controls.MetroPanel(); + this.metroPanel_mid = new MetroFramework.Controls.MetroPanel(); + this.metroPanel_bottom = new MetroFramework.Controls.MetroPanel(); + this.metroLabel8 = new MetroFramework.Controls.MetroLabel(); + this.tb_StationArrival = new MetroFramework.Controls.MetroTextBox(); + this.metroLabel9 = new MetroFramework.Controls.MetroLabel(); + this.tb_stationExit = new MetroFramework.Controls.MetroTextBox(); + this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components); + this.groupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.LoginTime)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtMesRequestTime)).BeginInit(); + this.metroPanel_top.SuspendLayout(); + this.metroPanel_mid.SuspendLayout(); + this.metroPanel_bottom.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).BeginInit(); + this.SuspendLayout(); + // + // btnExit + // + this.btnExit.Location = new System.Drawing.Point(484, 40); + this.btnExit.Name = "btnExit"; + this.btnExit.Size = new System.Drawing.Size(103, 37); + this.btnExit.TabIndex = 13; + this.btnExit.Text = "退出"; + this.btnExit.UseSelectable = true; + this.btnExit.Click += new System.EventHandler(this.btnExit_Click); + // + // metroLabel1 + // + this.metroLabel1.AutoSize = true; + this.metroLabel1.Location = new System.Drawing.Point(33, 53); + this.metroLabel1.Name = "metroLabel1"; + this.metroLabel1.Size = new System.Drawing.Size(79, 19); + this.metroLabel1.TabIndex = 12; + this.metroLabel1.Text = "产线名称:"; + // + // txtlineCode + // + // + // + // + this.txtlineCode.CustomButton.Image = null; + this.txtlineCode.CustomButton.Location = new System.Drawing.Point(123, 1); + this.txtlineCode.CustomButton.Name = ""; + this.txtlineCode.CustomButton.Size = new System.Drawing.Size(16, 17); + this.txtlineCode.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.txtlineCode.CustomButton.TabIndex = 1; + this.txtlineCode.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.txtlineCode.CustomButton.UseSelectable = true; + this.txtlineCode.CustomButton.Visible = false; + this.txtlineCode.Lines = new string[0]; + this.txtlineCode.Location = new System.Drawing.Point(118, 53); + this.txtlineCode.MaxLength = 32767; + this.txtlineCode.Name = "txtlineCode"; + this.txtlineCode.PasswordChar = '\0'; + this.txtlineCode.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.txtlineCode.SelectedText = ""; + this.txtlineCode.SelectionLength = 0; + this.txtlineCode.SelectionStart = 0; + this.txtlineCode.ShortcutsEnabled = true; + this.txtlineCode.Size = new System.Drawing.Size(186, 23); + this.txtlineCode.TabIndex = 11; + this.txtlineCode.UseSelectable = true; + this.txtlineCode.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.txtlineCode.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // btnSave + // + this.btnSave.Location = new System.Drawing.Point(68, 40); + this.btnSave.Name = "btnSave"; + this.btnSave.Size = new System.Drawing.Size(112, 37); + this.btnSave.TabIndex = 10; + this.btnSave.Text = "保存"; + this.btnSave.UseSelectable = true; + this.btnSave.Click += new System.EventHandler(this.btnSave_Click); + // + // metroLabel3 + // + this.metroLabel3.AutoSize = true; + this.metroLabel3.Location = new System.Drawing.Point(33, 92); + this.metroLabel3.Name = "metroLabel3"; + this.metroLabel3.Size = new System.Drawing.Size(79, 19); + this.metroLabel3.TabIndex = 25; + this.metroLabel3.Text = "设备编码:"; + // + // txtequipCode + // + // + // + // + this.txtequipCode.CustomButton.Image = null; + this.txtequipCode.CustomButton.Location = new System.Drawing.Point(123, 1); + this.txtequipCode.CustomButton.Name = ""; + this.txtequipCode.CustomButton.Size = new System.Drawing.Size(16, 17); + this.txtequipCode.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.txtequipCode.CustomButton.TabIndex = 1; + this.txtequipCode.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.txtequipCode.CustomButton.UseSelectable = true; + this.txtequipCode.CustomButton.Visible = false; + this.txtequipCode.Lines = new string[0]; + this.txtequipCode.Location = new System.Drawing.Point(118, 88); + this.txtequipCode.MaxLength = 32767; + this.txtequipCode.Name = "txtequipCode"; + this.txtequipCode.PasswordChar = '\0'; + this.txtequipCode.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.txtequipCode.SelectedText = ""; + this.txtequipCode.SelectionLength = 0; + this.txtequipCode.SelectionStart = 0; + this.txtequipCode.ShortcutsEnabled = true; + this.txtequipCode.Size = new System.Drawing.Size(186, 23); + this.txtequipCode.TabIndex = 26; + this.txtequipCode.UseSelectable = true; + this.txtequipCode.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.txtequipCode.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // txtsiteCode + // + // + // + // + this.txtsiteCode.CustomButton.Image = null; + this.txtsiteCode.CustomButton.Location = new System.Drawing.Point(123, 1); + this.txtsiteCode.CustomButton.Name = ""; + this.txtsiteCode.CustomButton.Size = new System.Drawing.Size(16, 17); + this.txtsiteCode.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.txtsiteCode.CustomButton.TabIndex = 1; + this.txtsiteCode.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.txtsiteCode.CustomButton.UseSelectable = true; + this.txtsiteCode.CustomButton.Visible = false; + this.txtsiteCode.Lines = new string[0]; + this.txtsiteCode.Location = new System.Drawing.Point(118, 15); + this.txtsiteCode.MaxLength = 32767; + this.txtsiteCode.Name = "txtsiteCode"; + this.txtsiteCode.PasswordChar = '\0'; + this.txtsiteCode.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.txtsiteCode.SelectedText = ""; + this.txtsiteCode.SelectionLength = 0; + this.txtsiteCode.SelectionStart = 0; + this.txtsiteCode.ShortcutsEnabled = true; + this.txtsiteCode.Size = new System.Drawing.Size(186, 23); + this.txtsiteCode.TabIndex = 28; + this.txtsiteCode.UseSelectable = true; + this.txtsiteCode.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.txtsiteCode.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // metroLabel2 + // + this.metroLabel2.AutoSize = true; + this.metroLabel2.Location = new System.Drawing.Point(33, 15); + this.metroLabel2.Name = "metroLabel2"; + this.metroLabel2.Size = new System.Drawing.Size(79, 19); + this.metroLabel2.TabIndex = 27; + this.metroLabel2.Text = "工厂代码:"; + // + // ckStartZNDB + // + this.ckStartZNDB.AutoSize = true; + this.ckStartZNDB.Location = new System.Drawing.Point(68, 6); + this.ckStartZNDB.Name = "ckStartZNDB"; + this.ckStartZNDB.Size = new System.Drawing.Size(96, 16); + this.ckStartZNDB.TabIndex = 29; + this.ckStartZNDB.Text = "开启智能电表"; + this.ckStartZNDB.UseVisualStyleBackColor = true; + // + // txtmaterialCode + // + // + // + // + this.txtmaterialCode.CustomButton.Image = null; + this.txtmaterialCode.CustomButton.Location = new System.Drawing.Point(123, 1); + this.txtmaterialCode.CustomButton.Name = ""; + this.txtmaterialCode.CustomButton.Size = new System.Drawing.Size(16, 17); + this.txtmaterialCode.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.txtmaterialCode.CustomButton.TabIndex = 1; + this.txtmaterialCode.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.txtmaterialCode.CustomButton.UseSelectable = true; + this.txtmaterialCode.CustomButton.Visible = false; + this.txtmaterialCode.Lines = new string[0]; + this.txtmaterialCode.Location = new System.Drawing.Point(118, 129); + this.txtmaterialCode.MaxLength = 32767; + this.txtmaterialCode.Name = "txtmaterialCode"; + this.txtmaterialCode.PasswordChar = '\0'; + this.txtmaterialCode.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.txtmaterialCode.SelectedText = ""; + this.txtmaterialCode.SelectionLength = 0; + this.txtmaterialCode.SelectionStart = 0; + this.txtmaterialCode.ShortcutsEnabled = true; + this.txtmaterialCode.Size = new System.Drawing.Size(186, 23); + this.txtmaterialCode.TabIndex = 31; + this.txtmaterialCode.UseSelectable = true; + this.txtmaterialCode.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.txtmaterialCode.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // metroLabel4 + // + this.metroLabel4.AutoSize = true; + this.metroLabel4.Location = new System.Drawing.Point(33, 127); + this.metroLabel4.Name = "metroLabel4"; + this.metroLabel4.Size = new System.Drawing.Size(79, 19); + this.metroLabel4.TabIndex = 30; + this.metroLabel4.Text = "物料编码:"; + // + // txtGradingMesUrl + // + // + // + // + this.txtGradingMesUrl.CustomButton.Image = null; + this.txtGradingMesUrl.CustomButton.Location = new System.Drawing.Point(376, 1); + this.txtGradingMesUrl.CustomButton.Name = ""; + this.txtGradingMesUrl.CustomButton.Size = new System.Drawing.Size(16, 17); + this.txtGradingMesUrl.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.txtGradingMesUrl.CustomButton.TabIndex = 1; + this.txtGradingMesUrl.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.txtGradingMesUrl.CustomButton.UseSelectable = true; + this.txtGradingMesUrl.CustomButton.Visible = false; + this.txtGradingMesUrl.Lines = new string[0]; + this.txtGradingMesUrl.Location = new System.Drawing.Point(176, 177); + this.txtGradingMesUrl.MaxLength = 32767; + this.txtGradingMesUrl.Name = "txtGradingMesUrl"; + this.txtGradingMesUrl.PasswordChar = '\0'; + this.txtGradingMesUrl.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.txtGradingMesUrl.SelectedText = ""; + this.txtGradingMesUrl.SelectionLength = 0; + this.txtGradingMesUrl.SelectionStart = 0; + this.txtGradingMesUrl.ShortcutsEnabled = true; + this.txtGradingMesUrl.Size = new System.Drawing.Size(524, 23); + this.txtGradingMesUrl.TabIndex = 33; + this.txtGradingMesUrl.UseSelectable = true; + this.txtGradingMesUrl.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.txtGradingMesUrl.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // metroLabel5 + // + this.metroLabel5.AutoSize = true; + this.metroLabel5.Location = new System.Drawing.Point(29, 177); + this.metroLabel5.Name = "metroLabel5"; + this.metroLabel5.Size = new System.Drawing.Size(135, 19); + this.metroLabel5.TabIndex = 32; + this.metroLabel5.Text = "分档查询接口地址:"; + // + // txtResultProcessMesUrl + // + // + // + // + this.txtResultProcessMesUrl.CustomButton.Image = null; + this.txtResultProcessMesUrl.CustomButton.Location = new System.Drawing.Point(376, 1); + this.txtResultProcessMesUrl.CustomButton.Name = ""; + this.txtResultProcessMesUrl.CustomButton.Size = new System.Drawing.Size(16, 17); + this.txtResultProcessMesUrl.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.txtResultProcessMesUrl.CustomButton.TabIndex = 1; + this.txtResultProcessMesUrl.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.txtResultProcessMesUrl.CustomButton.UseSelectable = true; + this.txtResultProcessMesUrl.CustomButton.Visible = false; + this.txtResultProcessMesUrl.Lines = new string[0]; + this.txtResultProcessMesUrl.Location = new System.Drawing.Point(176, 214); + this.txtResultProcessMesUrl.MaxLength = 32767; + this.txtResultProcessMesUrl.Name = "txtResultProcessMesUrl"; + this.txtResultProcessMesUrl.PasswordChar = '\0'; + this.txtResultProcessMesUrl.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.txtResultProcessMesUrl.SelectedText = ""; + this.txtResultProcessMesUrl.SelectionLength = 0; + this.txtResultProcessMesUrl.SelectionStart = 0; + this.txtResultProcessMesUrl.ShortcutsEnabled = true; + this.txtResultProcessMesUrl.Size = new System.Drawing.Size(524, 23); + this.txtResultProcessMesUrl.TabIndex = 35; + this.txtResultProcessMesUrl.UseSelectable = true; + this.txtResultProcessMesUrl.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.txtResultProcessMesUrl.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // metroLabel6 + // + this.metroLabel6.AutoSize = true; + this.metroLabel6.Location = new System.Drawing.Point(3, 214); + this.metroLabel6.Name = "metroLabel6"; + this.metroLabel6.Size = new System.Drawing.Size(163, 19); + this.metroLabel6.TabIndex = 34; + this.metroLabel6.Text = "结果加工参数接口地址:"; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.metroPanel_top); + this.groupBox1.Controls.Add(this.metroPanel_mid); + this.groupBox1.Controls.Add(this.metroPanel_bottom); + this.groupBox1.Location = new System.Drawing.Point(23, 63); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(719, 492); + this.groupBox1.TabIndex = 36; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "MES配置"; + // + // linkLabel_editCollectItemCfg + // + this.linkLabel_editCollectItemCfg.AutoSize = true; + this.linkLabel_editCollectItemCfg.Location = new System.Drawing.Point(482, 7); + this.linkLabel_editCollectItemCfg.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.linkLabel_editCollectItemCfg.Name = "linkLabel_editCollectItemCfg"; + this.linkLabel_editCollectItemCfg.Size = new System.Drawing.Size(101, 12); + this.linkLabel_editCollectItemCfg.TabIndex = 182; + this.linkLabel_editCollectItemCfg.TabStop = true; + this.linkLabel_editCollectItemCfg.Text = "配置采集项参照表"; + this.linkLabel_editCollectItemCfg.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel_editCollectItemCfg_LinkClicked); + // + // metroLabel21 + // + this.metroLabel21.AutoSize = true; + this.metroLabel21.Location = new System.Drawing.Point(573, 127); + this.metroLabel21.Name = "metroLabel21"; + this.metroLabel21.Size = new System.Drawing.Size(31, 19); + this.metroLabel21.TabIndex = 180; + this.metroLabel21.Text = "min"; + this.metroLabel21.Visible = false; + // + // LoginTime + // + this.LoginTime.Location = new System.Drawing.Point(491, 127); + this.LoginTime.Maximum = new decimal(new int[] { + 1000, + 0, + 0, + 0}); + this.LoginTime.Name = "LoginTime"; + this.LoginTime.Size = new System.Drawing.Size(76, 21); + this.LoginTime.TabIndex = 179; + this.LoginTime.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.LoginTime.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.LoginTime.Visible = false; + // + // metroLabel22 + // + this.metroLabel22.AutoSize = true; + this.metroLabel22.Location = new System.Drawing.Point(378, 127); + this.metroLabel22.Name = "metroLabel22"; + this.metroLabel22.Size = new System.Drawing.Size(107, 19); + this.metroLabel22.TabIndex = 176; + this.metroLabel22.Text = "权限登录时长:"; + this.metroLabel22.Visible = false; + // + // metroLabel18 + // + this.metroLabel18.AutoSize = true; + this.metroLabel18.Location = new System.Drawing.Point(573, 53); + this.metroLabel18.Name = "metroLabel18"; + this.metroLabel18.Size = new System.Drawing.Size(14, 19); + this.metroLabel18.TabIndex = 97; + this.metroLabel18.Text = "s"; + // + // txtMesRequestTime + // + this.txtMesRequestTime.DecimalPlaces = 1; + this.txtMesRequestTime.Increment = new decimal(new int[] { + 5, + 0, + 0, + 65536}); + this.txtMesRequestTime.Location = new System.Drawing.Point(491, 53); + this.txtMesRequestTime.Maximum = new decimal(new int[] { + 1000, + 0, + 0, + 0}); + this.txtMesRequestTime.Minimum = new decimal(new int[] { + 5, + 0, + 0, + 65536}); + this.txtMesRequestTime.Name = "txtMesRequestTime"; + this.txtMesRequestTime.Size = new System.Drawing.Size(76, 21); + this.txtMesRequestTime.TabIndex = 96; + this.txtMesRequestTime.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.txtMesRequestTime.Value = new decimal(new int[] { + 5, + 0, + 0, + 65536}); + // + // metroLabel20 + // + this.metroLabel20.AutoSize = true; + this.metroLabel20.Location = new System.Drawing.Point(352, 53); + this.metroLabel20.Name = "metroLabel20"; + this.metroLabel20.Size = new System.Drawing.Size(133, 19); + this.metroLabel20.TabIndex = 49; + this.metroLabel20.Text = "请求MES超时时长:"; + // + // chkIsMesUP + // + this.chkIsMesUP.AutoSize = true; + this.chkIsMesUP.Enabled = false; + this.chkIsMesUP.Location = new System.Drawing.Point(279, 6); + this.chkIsMesUP.Name = "chkIsMesUP"; + this.chkIsMesUP.Size = new System.Drawing.Size(90, 16); + this.chkIsMesUP.TabIndex = 36; + this.chkIsMesUP.Text = "开启MES模式"; + this.chkIsMesUP.UseVisualStyleBackColor = true; + // + // metroLabel7 + // + this.metroLabel7.AutoSize = true; + this.metroLabel7.Location = new System.Drawing.Point(406, 15); + this.metroLabel7.Name = "metroLabel7"; + this.metroLabel7.Size = new System.Drawing.Size(79, 19); + this.metroLabel7.TabIndex = 183; + this.metroLabel7.Text = "产品类型:"; + // + // tb_productType + // + // + // + // + this.tb_productType.CustomButton.Image = null; + this.tb_productType.CustomButton.Location = new System.Drawing.Point(164, 1); + this.tb_productType.CustomButton.Name = ""; + this.tb_productType.CustomButton.Size = new System.Drawing.Size(21, 21); + this.tb_productType.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.tb_productType.CustomButton.TabIndex = 1; + this.tb_productType.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.tb_productType.CustomButton.UseSelectable = true; + this.tb_productType.CustomButton.Visible = false; + this.tb_productType.Lines = new string[0]; + this.tb_productType.Location = new System.Drawing.Point(491, 15); + this.tb_productType.MaxLength = 32767; + this.tb_productType.Name = "tb_productType"; + this.tb_productType.PasswordChar = '\0'; + this.tb_productType.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.tb_productType.SelectedText = ""; + this.tb_productType.SelectionLength = 0; + this.tb_productType.SelectionStart = 0; + this.tb_productType.ShortcutsEnabled = true; + this.tb_productType.Size = new System.Drawing.Size(186, 23); + this.tb_productType.TabIndex = 184; + this.tb_productType.UseSelectable = true; + this.tb_productType.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.tb_productType.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // metroPanel_top + // + this.metroPanel_top.Controls.Add(this.tb_productType); + this.metroPanel_top.Controls.Add(this.metroLabel18); + this.metroPanel_top.Controls.Add(this.metroLabel21); + this.metroPanel_top.Controls.Add(this.metroLabel7); + this.metroPanel_top.Controls.Add(this.LoginTime); + this.metroPanel_top.Controls.Add(this.txtMesRequestTime); + this.metroPanel_top.Controls.Add(this.metroLabel2); + this.metroPanel_top.Controls.Add(this.metroLabel22); + this.metroPanel_top.Controls.Add(this.metroLabel1); + this.metroPanel_top.Controls.Add(this.metroLabel3); + this.metroPanel_top.Controls.Add(this.metroLabel4); + this.metroPanel_top.Controls.Add(this.metroLabel20); + this.metroPanel_top.Controls.Add(this.txtsiteCode); + this.metroPanel_top.Controls.Add(this.txtlineCode); + this.metroPanel_top.Controls.Add(this.txtequipCode); + this.metroPanel_top.Controls.Add(this.txtmaterialCode); + this.metroPanel_top.Dock = System.Windows.Forms.DockStyle.Top; + this.metroPanel_top.HorizontalScrollbarBarColor = true; + this.metroPanel_top.HorizontalScrollbarHighlightOnWheel = false; + this.metroPanel_top.HorizontalScrollbarSize = 10; + this.metroPanel_top.Location = new System.Drawing.Point(3, 17); + this.metroPanel_top.Name = "metroPanel_top"; + this.metroPanel_top.Size = new System.Drawing.Size(713, 163); + this.metroPanel_top.TabIndex = 185; + this.metroPanel_top.VerticalScrollbarBarColor = true; + this.metroPanel_top.VerticalScrollbarHighlightOnWheel = false; + this.metroPanel_top.VerticalScrollbarSize = 10; + // + // metroPanel_mid + // + this.metroPanel_mid.Controls.Add(this.tb_stationExit); + this.metroPanel_mid.Controls.Add(this.metroLabel9); + this.metroPanel_mid.Controls.Add(this.tb_StationArrival); + this.metroPanel_mid.Controls.Add(this.metroLabel8); + this.metroPanel_mid.Controls.Add(this.txtResultProcessMesUrl); + this.metroPanel_mid.Controls.Add(this.txtGradingMesUrl); + this.metroPanel_mid.Controls.Add(this.metroLabel6); + this.metroPanel_mid.Controls.Add(this.metroLabel5); + this.metroPanel_mid.Dock = System.Windows.Forms.DockStyle.Fill; + this.metroPanel_mid.HorizontalScrollbarBarColor = true; + this.metroPanel_mid.HorizontalScrollbarHighlightOnWheel = false; + this.metroPanel_mid.HorizontalScrollbarSize = 10; + this.metroPanel_mid.Location = new System.Drawing.Point(3, 17); + this.metroPanel_mid.Name = "metroPanel_mid"; + this.metroPanel_mid.Size = new System.Drawing.Size(713, 379); + this.metroPanel_mid.TabIndex = 186; + this.metroPanel_mid.VerticalScrollbarBarColor = true; + this.metroPanel_mid.VerticalScrollbarHighlightOnWheel = false; + this.metroPanel_mid.VerticalScrollbarSize = 10; + // + // metroPanel_bottom + // + this.metroPanel_bottom.Controls.Add(this.linkLabel_editCollectItemCfg); + this.metroPanel_bottom.Controls.Add(this.ckStartZNDB); + this.metroPanel_bottom.Controls.Add(this.chkIsMesUP); + this.metroPanel_bottom.Controls.Add(this.btnSave); + this.metroPanel_bottom.Controls.Add(this.btnExit); + this.metroPanel_bottom.Dock = System.Windows.Forms.DockStyle.Bottom; + this.metroPanel_bottom.HorizontalScrollbarBarColor = true; + this.metroPanel_bottom.HorizontalScrollbarHighlightOnWheel = false; + this.metroPanel_bottom.HorizontalScrollbarSize = 10; + this.metroPanel_bottom.Location = new System.Drawing.Point(3, 396); + this.metroPanel_bottom.Name = "metroPanel_bottom"; + this.metroPanel_bottom.Size = new System.Drawing.Size(713, 93); + this.metroPanel_bottom.TabIndex = 187; + this.metroPanel_bottom.VerticalScrollbarBarColor = true; + this.metroPanel_bottom.VerticalScrollbarHighlightOnWheel = false; + this.metroPanel_bottom.VerticalScrollbarSize = 10; + // + // metroLabel8 + // + this.metroLabel8.AutoSize = true; + this.metroLabel8.Location = new System.Drawing.Point(29, 250); + this.metroLabel8.Name = "metroLabel8"; + this.metroLabel8.Size = new System.Drawing.Size(135, 19); + this.metroLabel8.TabIndex = 36; + this.metroLabel8.Text = "产品进站接口地址:"; + // + // tb_StationArrival + // + // + // + // + this.tb_StationArrival.CustomButton.Image = null; + this.tb_StationArrival.CustomButton.Location = new System.Drawing.Point(502, 1); + this.tb_StationArrival.CustomButton.Name = ""; + this.tb_StationArrival.CustomButton.Size = new System.Drawing.Size(21, 21); + this.tb_StationArrival.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.tb_StationArrival.CustomButton.TabIndex = 1; + this.tb_StationArrival.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.tb_StationArrival.CustomButton.UseSelectable = true; + this.tb_StationArrival.CustomButton.Visible = false; + this.tb_StationArrival.Lines = new string[0]; + this.tb_StationArrival.Location = new System.Drawing.Point(176, 250); + this.tb_StationArrival.MaxLength = 32767; + this.tb_StationArrival.Name = "tb_StationArrival"; + this.tb_StationArrival.PasswordChar = '\0'; + this.tb_StationArrival.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.tb_StationArrival.SelectedText = ""; + this.tb_StationArrival.SelectionLength = 0; + this.tb_StationArrival.SelectionStart = 0; + this.tb_StationArrival.ShortcutsEnabled = true; + this.tb_StationArrival.Size = new System.Drawing.Size(524, 23); + this.tb_StationArrival.TabIndex = 37; + this.tb_StationArrival.UseSelectable = true; + this.tb_StationArrival.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.tb_StationArrival.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // metroLabel9 + // + this.metroLabel9.AutoSize = true; + this.metroLabel9.Location = new System.Drawing.Point(29, 283); + this.metroLabel9.Name = "metroLabel9"; + this.metroLabel9.Size = new System.Drawing.Size(135, 19); + this.metroLabel9.TabIndex = 38; + this.metroLabel9.Text = "产品出站接口地址:"; + // + // tb_stationExit + // + // + // + // + this.tb_stationExit.CustomButton.Image = null; + this.tb_stationExit.CustomButton.Location = new System.Drawing.Point(502, 1); + this.tb_stationExit.CustomButton.Name = ""; + this.tb_stationExit.CustomButton.Size = new System.Drawing.Size(21, 21); + this.tb_stationExit.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.tb_stationExit.CustomButton.TabIndex = 1; + this.tb_stationExit.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.tb_stationExit.CustomButton.UseSelectable = true; + this.tb_stationExit.CustomButton.Visible = false; + this.tb_stationExit.Lines = new string[0]; + this.tb_stationExit.Location = new System.Drawing.Point(176, 283); + this.tb_stationExit.MaxLength = 32767; + this.tb_stationExit.Name = "tb_stationExit"; + this.tb_stationExit.PasswordChar = '\0'; + this.tb_stationExit.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.tb_stationExit.SelectedText = ""; + this.tb_stationExit.SelectionLength = 0; + this.tb_stationExit.SelectionStart = 0; + this.tb_stationExit.ShortcutsEnabled = true; + this.tb_stationExit.Size = new System.Drawing.Size(524, 23); + this.tb_stationExit.TabIndex = 39; + this.tb_stationExit.UseSelectable = true; + this.tb_stationExit.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.tb_stationExit.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // FormMesDataSet + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(763, 578); + this.Controls.Add(this.groupBox1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FormMesDataSet"; + this.Resizable = false; + this.Text = "系统参数设置"; + this.Load += new System.EventHandler(this.FormMesDataSet_Load); + this.groupBox1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.LoginTime)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtMesRequestTime)).EndInit(); + this.metroPanel_top.ResumeLayout(false); + this.metroPanel_top.PerformLayout(); + this.metroPanel_mid.ResumeLayout(false); + this.metroPanel_mid.PerformLayout(); + this.metroPanel_bottom.ResumeLayout(false); + this.metroPanel_bottom.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + private MetroFramework.Controls.MetroButton btnExit; + private MetroFramework.Controls.MetroLabel metroLabel1; + private MetroFramework.Controls.MetroTextBox txtlineCode; + private MetroFramework.Controls.MetroButton btnSave; + private MetroFramework.Controls.MetroLabel metroLabel3; + private MetroFramework.Controls.MetroTextBox txtequipCode; + private MetroFramework.Controls.MetroTextBox txtsiteCode; + private MetroFramework.Controls.MetroLabel metroLabel2; + private System.Windows.Forms.CheckBox ckStartZNDB; + private MetroFramework.Controls.MetroTextBox txtmaterialCode; + private MetroFramework.Controls.MetroLabel metroLabel4; + private MetroFramework.Controls.MetroTextBox txtGradingMesUrl; + private MetroFramework.Controls.MetroLabel metroLabel5; + private MetroFramework.Controls.MetroTextBox txtResultProcessMesUrl; + private MetroFramework.Controls.MetroLabel metroLabel6; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.CheckBox chkIsMesUP; + private MetroFramework.Controls.MetroLabel metroLabel20; + private MetroFramework.Controls.MetroLabel metroLabel21; + private System.Windows.Forms.NumericUpDown LoginTime; + private MetroFramework.Controls.MetroLabel metroLabel22; + private MetroFramework.Controls.MetroLabel metroLabel18; + private System.Windows.Forms.NumericUpDown txtMesRequestTime; + private System.Windows.Forms.LinkLabel linkLabel_editCollectItemCfg; + private MetroFramework.Controls.MetroLabel metroLabel7; + private MetroFramework.Controls.MetroTextBox tb_productType; + private MetroFramework.Controls.MetroPanel metroPanel_bottom; + private MetroFramework.Controls.MetroPanel metroPanel_mid; + private MetroFramework.Controls.MetroPanel metroPanel_top; + private MetroFramework.Controls.MetroTextBox tb_stationExit; + private MetroFramework.Controls.MetroLabel metroLabel9; + private MetroFramework.Controls.MetroTextBox tb_StationArrival; + private MetroFramework.Controls.MetroLabel metroLabel8; + private System.Windows.Forms.BindingSource bindingSource1; + } +} \ No newline at end of file diff --git a/JY.Inspection/Frm/FormMesDataSet.resx b/JY.Inspection/Frm/FormMesDataSet.resx new file mode 100644 index 0000000..f2290db --- /dev/null +++ b/JY.Inspection/Frm/FormMesDataSet.resx @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlN + UABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAWU1QAFpNUABZTVASWU1QH1lNUB9ZTVAfWU1QH1lN + UB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUBJaTVAAWU1QAFlN + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXE5OAFlNUABZTVAFWU1QaFlLUM1YS0/gWEtQ4FhL + UOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS0/gWUtQzVlN + UGhZTVAFWU1QAFxOTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWS1EAWU1QAFlNUE5ZTlD0YGxY/2eH + Xv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eH + Xv9gbFj/WU5Q9FlNUE5ZTVAAVktRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhNUABaTVAAWUtQkl1c + VP9xtWn/dchu/3TIbf90yG3/dMht/3TIbf90yG3/dMht/3THbf91yG7/dMht/3TIbf90yG3/dMht/3TI + bf90yG3/dchu/3G1af9dXFT/WUtQklpNUABYTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNH + UAFYS0+fX2RW/3K+a/9zxm3/c8Vs/3PFbP9zxWz/c8Vs/3PFbP90xm3/b7Fo/3G6av90xm3/c8Vs/3PF + bf90xm3/dMZt/3TGbf90xm3/c79s/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYTFAAU0dQAVhKT59gZVf/fsp1/4HVd/+B1Hf/gdR3/4HUd/+B1Hf/gdR3/4HWd/9tnWX/Z4lf/3/S + dv+B1Hf/fdF1/3fJb/90xm3/dMZt/3TGbf9zvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+T4Yb/mfCL/5nvi/+Z74v/me+L/5nvi/+Z74v/lu2J/3Cg + aP9cV1L/gr92/5nwi/+Y7or/keaF/3/Sdv90xm3/dMZt/3O+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nvi/+Z74v/me+L/5nv + i/+T6ob/bp5l/09ZYv9ieGL/keCD/5rwjP+a8Iv/leuI/3zPdP90xm3/c75r/19kVv9YS0+fU0dQAVhM + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nwi/+Z74v/me+L/5nv + i/+Z74v/mvCM/4/lg/9tmmH/OXuO/zp6jf92nmn/mO6K/5nvi/+a8Iz/jOCA/3XHbf9zvmv/X2RW/1hL + T59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+U4ob/mfCL/5nv + i/+Z74v/me+L/5nvi/+U64f/gtl5/2yYX/82gJT/ELXe/1Nsaf+HyXn/mvGM/5nvi/+T6Ib/d8pw/3K+ + a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Ti + hv+Z8Iv/me+L/5nvi/+T6ob/hdZ6/3W0av9pj17/XGtb/y+Ko/8Az///J5Ox/2iAYf+T5Yb/mvCM/5Tq + h/95y3H/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhK + T59kaFr/lOKG/5nwi/+Z8Iv/idZ9/22aZf9ed1//SnB0/zCHoP8Xq9D/Bcb0/wDP//8Fx/b/P3aE/3uq + bv+Z8Iv/leqH/3nMcf9yvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhM + UABTR1ABWEpPn2RoWv+U4ob/mfCL/5rxjP+Kzn3/WWJe/yGau/8GxPL/AM///wDR//8Az///BMf3/w63 + 4v8wgpz/X2VY/4zVf/+V64j/ecxx/3K+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5jtiv9wjmj/JZWz/wDQ//8Azv//FLHX/zCI + oP9GdX7/XHZp/26MaP9+r3L/kd+E/5XriP95zHH/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nwi/+Z74v/mvGM/4vKe/9McnX/CMHv/wLL + +/9AdoP/dpRk/4vJe/+T4YX/mO6K/5rxjP+a8Iz/lOqH/3nMcf9yvmv/X2RW/1hLT59TR1ABWExQAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+U4ob/mfCL/5nvi/+Z74v/mOyK/2+K + Z/8jmLn/CMDt/1Nzbv+Q2oH/m/OM/5nwi/+Z74v/me+L/5nvi/+V6of/ecxx/3K+a/9fZFb/WEtPn1NH + UAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nv + i/+a8Yz/isZ6/0h1fP8cocX/ZoBo/5fpiP+Z74v/me+L/5nvi/+Z74v/me+L/5Xqh/95zHH/cr5r/19k + Vv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nw + i/+Z74v/me+L/5nvi/+Y64n/bIlq/0Nmdv91mW3/mvCL/5nvi/+Z74v/me+L/5nvi/+Z74v/leqH/3nM + cf9yvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2Ro + Wv+U4ob/mfCL/5nvi/+Z74v/me+L/5rxjP+Iwnv/XVZT/4K2dv+a8oz/me+L/5nvi/+Z74v/me+L/5nv + i/+V6of/ecxx/3K+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNH + UAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nvi/+Z74v/me+L/5fpif9yi2f/jM9//5rxjP+Z74v/me+L/5nv + i/+Z74v/me+L/5Xqh/95zHH/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYTFAAUkdQAFhKT55kaFr/leSH/5ryjP+a8Yz/mvGM/5rxjP+a8Yz/mvKM/5DYg/+W6Ij/mvKM/5rx + jP+a8Yz/mvGM/5rxjP+a8oz/leyI/3nNcf9zwGz/X2RW/1hKT55SR1AAWExQAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhMUABXSVABWEtPoWFhV/+FvHj/icd8/4nGfP+Jxnz/icZ8/4nGfP+Jxnz/icd8/4nH + fP+Jxnz/icZ8/4nGfP+Jxnz/icZ8/4nHfP+Gw3n/caxp/2yiZP9dXlT/WUtQoVdJUAFYTFAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWUxQAFlLUAJZTVCnWk5R/1xTU/9cU1L/XFNS/1xTUv9cU1L/XFNS/1xT + Uv9cU1L/XFNS/1xTUv9cU1L/XFNS/1xTUv9cU1L/XFNS/1tTUv9aUlH/WlJR/1lOUP9ZTVCnWUtQAllM + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAW05QAFlMUJldUlT/gYF8/42Qif+MkIj/jJCI/4yQ + iP+MkIj/jJCI/4yQiP+MkIj/jJCI/4yQiP+MkIj/jJCI/4yQiP+MkIj/jJCI/42Qif+BgXz/XVJU/1lM + UJlbTlEAWU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFtGTQBZTVAAWU1QVFpOUfdtZ2b/fn15/35+ + ef9+fnn/fn55/39+ef9+fnn/fn55/35+ef9+fnn/fn55/35+ef9/fnn/fn55/35+ef9+fnn/fn15/21n + Zv9aTlH3WU1QVFlNUABbRk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVlNTAFlNUABZTVAHWU1Qb1hM + T9JXS07lV0tO5FdLTuVYS074WExP/1pOUf9aTlH/Wk5R/1pOUf9aTlH/Wk5R/1hMT/9YS074V0tO5VdL + TuRXS07lWExP0llNUG9ZTVAGWU1QAFZTUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWU1QAFlN + UABbTk8AWU1QFllNUCNZTVAjWU1QKVhMT8JiV1n/fHN2/311d/99dXf/fXV3/311d/98dHb/Ylda/1hM + T8JZTVApWU1QI1lNUCNZTVAVXE5QAFlNUABZTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAWU1QAFlNUABZTVAAWU1QAFlNUABWSlAAWExPpV5TVv9yaGr/c2ps/3NqbP9zamz/c2ps/3Jo + av9eU1b/WExPpVZKUQFZTVAAWU1QAFlNUABYTVAAWU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVklRAFlNUABZTVA7WU1QwlhMT+BYTE/gWExP4FhM + T+BYTE/gWExP4FlNUMJZTVA7WU1QAFZKUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFEAWE1QAFlNUABZTVAPWU1QH1lN + UB9ZTVAfWU1QH1lNUB9ZTVAfWU1QD1lNUABYTFEAWExRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAWE1QAFlN + UABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA+AAAH/AAAA/gAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH8AAAD/gAAB//gAH//4AB///AA/8= + + + \ No newline at end of file diff --git a/JY.Inspection/Frm/FormMesGradingSet.Designer.cs b/JY.Inspection/Frm/FormMesGradingSet.Designer.cs new file mode 100644 index 0000000..d8e3079 --- /dev/null +++ b/JY.Inspection/Frm/FormMesGradingSet.Designer.cs @@ -0,0 +1,488 @@ +namespace JY.Inspection.Frm +{ + partial class FormMesGradingSet + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.chkStartNGFL = new System.Windows.Forms.CheckBox(); + this.cmbTensionStrap2 = new MetroFramework.Controls.MetroComboBox(); + this.cmbTensionStrap1 = new MetroFramework.Controls.MetroComboBox(); + this.metroLabel6 = new MetroFramework.Controls.MetroLabel(); + this.metroLabel5 = new MetroFramework.Controls.MetroLabel(); + this.txtgrading4 = new MetroFramework.Controls.MetroTextBox(); + this.metroLabel4 = new MetroFramework.Controls.MetroLabel(); + this.txtgrading2 = new MetroFramework.Controls.MetroTextBox(); + this.metroLabel3 = new MetroFramework.Controls.MetroLabel(); + this.txtgrading1 = new MetroFramework.Controls.MetroTextBox(); + this.metroLabel2 = new MetroFramework.Controls.MetroLabel(); + this.txtgrading3 = new MetroFramework.Controls.MetroTextBox(); + this.metroLabel1 = new MetroFramework.Controls.MetroLabel(); + this.btnExit = new MetroFramework.Controls.MetroButton(); + this.btnSave = new MetroFramework.Controls.MetroButton(); + this.cmbTensionStrap3 = new MetroFramework.Controls.MetroComboBox(); + this.metroLabel7 = new MetroFramework.Controls.MetroLabel(); + this.chkCkGrading = new System.Windows.Forms.CheckBox(); + this.cmbTensionStrapCCD1 = new MetroFramework.Controls.MetroComboBox(); + this.cmbTensionStrapCCD2 = new MetroFramework.Controls.MetroComboBox(); + this.cmbTensionStrapCCD3 = new MetroFramework.Controls.MetroComboBox(); + this.cmbTensionStrapCCD4 = new MetroFramework.Controls.MetroComboBox(); + this.metroLabel8 = new MetroFramework.Controls.MetroLabel(); + this.metroLabel9 = new MetroFramework.Controls.MetroLabel(); + this.metroLabel10 = new MetroFramework.Controls.MetroLabel(); + this.metroLabel11 = new MetroFramework.Controls.MetroLabel(); + this.metroLabel12 = new MetroFramework.Controls.MetroLabel(); + this.metroLabel13 = new MetroFramework.Controls.MetroLabel(); + this.SuspendLayout(); + // + // chkStartNGFL + // + this.chkStartNGFL.AutoSize = true; + this.chkStartNGFL.Location = new System.Drawing.Point(210, 399); + this.chkStartNGFL.Name = "chkStartNGFL"; + this.chkStartNGFL.Size = new System.Drawing.Size(120, 16); + this.chkStartNGFL.TabIndex = 178; + this.chkStartNGFL.Text = "NG电池不分类排出"; + this.chkStartNGFL.UseVisualStyleBackColor = true; + this.chkStartNGFL.Click += new System.EventHandler(this.chkStartNGFL_Click); + // + // cmbTensionStrap2 + // + this.cmbTensionStrap2.FormattingEnabled = true; + this.cmbTensionStrap2.ItemHeight = 23; + this.cmbTensionStrap2.Location = new System.Drawing.Point(143, 293); + this.cmbTensionStrap2.Name = "cmbTensionStrap2"; + this.cmbTensionStrap2.Size = new System.Drawing.Size(186, 29); + this.cmbTensionStrap2.TabIndex = 176; + this.cmbTensionStrap2.UseSelectable = true; + this.cmbTensionStrap2.DropDownClosed += new System.EventHandler(this.cmbTensionStrap2_DropDownClosed); + // + // cmbTensionStrap1 + // + this.cmbTensionStrap1.FormattingEnabled = true; + this.cmbTensionStrap1.ItemHeight = 23; + this.cmbTensionStrap1.Location = new System.Drawing.Point(143, 251); + this.cmbTensionStrap1.Name = "cmbTensionStrap1"; + this.cmbTensionStrap1.Size = new System.Drawing.Size(186, 29); + this.cmbTensionStrap1.TabIndex = 177; + this.cmbTensionStrap1.UseSelectable = true; + this.cmbTensionStrap1.DropDownClosed += new System.EventHandler(this.cmbTensionStrap1_DropDownClosed); + // + // metroLabel6 + // + this.metroLabel6.AutoSize = true; + this.metroLabel6.Location = new System.Drawing.Point(47, 298); + this.metroLabel6.Name = "metroLabel6"; + this.metroLabel6.Size = new System.Drawing.Size(85, 19); + this.metroLabel6.TabIndex = 173; + this.metroLabel6.Text = "NG拉带(6):"; + // + // metroLabel5 + // + this.metroLabel5.AutoSize = true; + this.metroLabel5.Location = new System.Drawing.Point(47, 255); + this.metroLabel5.Name = "metroLabel5"; + this.metroLabel5.Size = new System.Drawing.Size(85, 19); + this.metroLabel5.TabIndex = 174; + this.metroLabel5.Text = "NG拉带(5):"; + // + // txtgrading4 + // + // + // + // + this.txtgrading4.CustomButton.Image = null; + this.txtgrading4.CustomButton.Location = new System.Drawing.Point(60, 1); + this.txtgrading4.CustomButton.Name = ""; + this.txtgrading4.CustomButton.Size = new System.Drawing.Size(21, 21); + this.txtgrading4.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.txtgrading4.CustomButton.TabIndex = 1; + this.txtgrading4.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.txtgrading4.CustomButton.UseSelectable = true; + this.txtgrading4.CustomButton.Visible = false; + this.txtgrading4.FontSize = MetroFramework.MetroTextBoxSize.Medium; + this.txtgrading4.Lines = new string[0]; + this.txtgrading4.Location = new System.Drawing.Point(144, 200); + this.txtgrading4.MaxLength = 32767; + this.txtgrading4.Name = "txtgrading4"; + this.txtgrading4.PasswordChar = '\0'; + this.txtgrading4.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.txtgrading4.SelectedText = ""; + this.txtgrading4.SelectionLength = 0; + this.txtgrading4.SelectionStart = 0; + this.txtgrading4.ShortcutsEnabled = true; + this.txtgrading4.Size = new System.Drawing.Size(70, 28); + this.txtgrading4.TabIndex = 172; + this.txtgrading4.UseSelectable = true; + this.txtgrading4.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.txtgrading4.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // metroLabel4 + // + this.metroLabel4.AutoSize = true; + this.metroLabel4.Location = new System.Drawing.Point(47, 202); + this.metroLabel4.Name = "metroLabel4"; + this.metroLabel4.Size = new System.Drawing.Size(84, 19); + this.metroLabel4.TabIndex = 175; + this.metroLabel4.Text = "OK拉带(4):"; + // + // txtgrading2 + // + // + // + // + this.txtgrading2.CustomButton.Image = null; + this.txtgrading2.CustomButton.Location = new System.Drawing.Point(60, 1); + this.txtgrading2.CustomButton.Name = ""; + this.txtgrading2.CustomButton.Size = new System.Drawing.Size(21, 21); + this.txtgrading2.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.txtgrading2.CustomButton.TabIndex = 1; + this.txtgrading2.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.txtgrading2.CustomButton.UseSelectable = true; + this.txtgrading2.CustomButton.Visible = false; + this.txtgrading2.FontSize = MetroFramework.MetroTextBoxSize.Medium; + this.txtgrading2.Lines = new string[0]; + this.txtgrading2.Location = new System.Drawing.Point(144, 136); + this.txtgrading2.MaxLength = 32767; + this.txtgrading2.Name = "txtgrading2"; + this.txtgrading2.PasswordChar = '\0'; + this.txtgrading2.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.txtgrading2.SelectedText = ""; + this.txtgrading2.SelectionLength = 0; + this.txtgrading2.SelectionStart = 0; + this.txtgrading2.ShortcutsEnabled = true; + this.txtgrading2.Size = new System.Drawing.Size(70, 28); + this.txtgrading2.TabIndex = 171; + this.txtgrading2.UseSelectable = true; + this.txtgrading2.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.txtgrading2.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // metroLabel3 + // + this.metroLabel3.AutoSize = true; + this.metroLabel3.Location = new System.Drawing.Point(47, 139); + this.metroLabel3.Name = "metroLabel3"; + this.metroLabel3.Size = new System.Drawing.Size(84, 19); + this.metroLabel3.TabIndex = 170; + this.metroLabel3.Text = "OK拉带(2):"; + // + // txtgrading1 + // + // + // + // + this.txtgrading1.CustomButton.Image = null; + this.txtgrading1.CustomButton.Location = new System.Drawing.Point(56, 2); + this.txtgrading1.CustomButton.Name = ""; + this.txtgrading1.CustomButton.Size = new System.Drawing.Size(23, 23); + this.txtgrading1.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.txtgrading1.CustomButton.TabIndex = 1; + this.txtgrading1.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.txtgrading1.CustomButton.UseSelectable = true; + this.txtgrading1.CustomButton.Visible = false; + this.txtgrading1.FontSize = MetroFramework.MetroTextBoxSize.Medium; + this.txtgrading1.Lines = new string[0]; + this.txtgrading1.Location = new System.Drawing.Point(144, 103); + this.txtgrading1.MaxLength = 32767; + this.txtgrading1.Name = "txtgrading1"; + this.txtgrading1.PasswordChar = '\0'; + this.txtgrading1.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.txtgrading1.SelectedText = ""; + this.txtgrading1.SelectionLength = 0; + this.txtgrading1.SelectionStart = 0; + this.txtgrading1.ShortcutsEnabled = true; + this.txtgrading1.Size = new System.Drawing.Size(70, 28); + this.txtgrading1.TabIndex = 168; + this.txtgrading1.UseSelectable = true; + this.txtgrading1.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.txtgrading1.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // metroLabel2 + // + this.metroLabel2.AutoSize = true; + this.metroLabel2.Location = new System.Drawing.Point(47, 106); + this.metroLabel2.Name = "metroLabel2"; + this.metroLabel2.Size = new System.Drawing.Size(82, 19); + this.metroLabel2.TabIndex = 169; + this.metroLabel2.Text = "OK拉带(1):"; + // + // txtgrading3 + // + // + // + // + this.txtgrading3.CustomButton.Image = null; + this.txtgrading3.CustomButton.Location = new System.Drawing.Point(60, 1); + this.txtgrading3.CustomButton.Name = ""; + this.txtgrading3.CustomButton.Size = new System.Drawing.Size(21, 21); + this.txtgrading3.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.txtgrading3.CustomButton.TabIndex = 1; + this.txtgrading3.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.txtgrading3.CustomButton.UseSelectable = true; + this.txtgrading3.CustomButton.Visible = false; + this.txtgrading3.FontSize = MetroFramework.MetroTextBoxSize.Medium; + this.txtgrading3.Lines = new string[0]; + this.txtgrading3.Location = new System.Drawing.Point(144, 168); + this.txtgrading3.MaxLength = 32767; + this.txtgrading3.Name = "txtgrading3"; + this.txtgrading3.PasswordChar = '\0'; + this.txtgrading3.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.txtgrading3.SelectedText = ""; + this.txtgrading3.SelectionLength = 0; + this.txtgrading3.SelectionStart = 0; + this.txtgrading3.ShortcutsEnabled = true; + this.txtgrading3.Size = new System.Drawing.Size(70, 28); + this.txtgrading3.TabIndex = 166; + this.txtgrading3.UseSelectable = true; + this.txtgrading3.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.txtgrading3.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // metroLabel1 + // + this.metroLabel1.AutoSize = true; + this.metroLabel1.Location = new System.Drawing.Point(47, 172); + this.metroLabel1.Name = "metroLabel1"; + this.metroLabel1.Size = new System.Drawing.Size(84, 19); + this.metroLabel1.TabIndex = 167; + this.metroLabel1.Text = "OK拉带(3):"; + // + // btnExit + // + this.btnExit.Location = new System.Drawing.Point(227, 438); + this.btnExit.Name = "btnExit"; + this.btnExit.Size = new System.Drawing.Size(103, 37); + this.btnExit.TabIndex = 165; + this.btnExit.Text = "退出"; + this.btnExit.UseSelectable = true; + this.btnExit.Click += new System.EventHandler(this.btnExit_Click); + // + // btnSave + // + this.btnSave.Location = new System.Drawing.Point(41, 438); + this.btnSave.Name = "btnSave"; + this.btnSave.Size = new System.Drawing.Size(112, 37); + this.btnSave.TabIndex = 164; + this.btnSave.Text = "保存"; + this.btnSave.UseSelectable = true; + this.btnSave.Click += new System.EventHandler(this.btnSave_Click); + // + // cmbTensionStrap3 + // + this.cmbTensionStrap3.FormattingEnabled = true; + this.cmbTensionStrap3.ItemHeight = 23; + this.cmbTensionStrap3.Location = new System.Drawing.Point(144, 334); + this.cmbTensionStrap3.Name = "cmbTensionStrap3"; + this.cmbTensionStrap3.Size = new System.Drawing.Size(186, 29); + this.cmbTensionStrap3.TabIndex = 180; + this.cmbTensionStrap3.UseSelectable = true; + this.cmbTensionStrap3.DropDownClosed += new System.EventHandler(this.cmbTensionStrap3_DropDownClosed); + // + // metroLabel7 + // + this.metroLabel7.AutoSize = true; + this.metroLabel7.Location = new System.Drawing.Point(47, 340); + this.metroLabel7.Name = "metroLabel7"; + this.metroLabel7.Size = new System.Drawing.Size(85, 19); + this.metroLabel7.TabIndex = 179; + this.metroLabel7.Text = "NG拉带(7):"; + // + // chkCkGrading + // + this.chkCkGrading.AutoSize = true; + this.chkCkGrading.Location = new System.Drawing.Point(47, 399); + this.chkCkGrading.Name = "chkCkGrading"; + this.chkCkGrading.Size = new System.Drawing.Size(96, 16); + this.chkCkGrading.TabIndex = 181; + this.chkCkGrading.Text = "是否启用分档"; + this.chkCkGrading.UseVisualStyleBackColor = true; + // + // cmbTensionStrapCCD1 + // + this.cmbTensionStrapCCD1.FormattingEnabled = true; + this.cmbTensionStrapCCD1.ItemHeight = 23; + this.cmbTensionStrapCCD1.Location = new System.Drawing.Point(260, 102); + this.cmbTensionStrapCCD1.Name = "cmbTensionStrapCCD1"; + this.cmbTensionStrapCCD1.Size = new System.Drawing.Size(70, 29); + this.cmbTensionStrapCCD1.TabIndex = 182; + this.cmbTensionStrapCCD1.UseSelectable = true; + // + // cmbTensionStrapCCD2 + // + this.cmbTensionStrapCCD2.FormattingEnabled = true; + this.cmbTensionStrapCCD2.ItemHeight = 23; + this.cmbTensionStrapCCD2.Location = new System.Drawing.Point(260, 133); + this.cmbTensionStrapCCD2.Name = "cmbTensionStrapCCD2"; + this.cmbTensionStrapCCD2.Size = new System.Drawing.Size(70, 29); + this.cmbTensionStrapCCD2.TabIndex = 183; + this.cmbTensionStrapCCD2.UseSelectable = true; + // + // cmbTensionStrapCCD3 + // + this.cmbTensionStrapCCD3.FormattingEnabled = true; + this.cmbTensionStrapCCD3.ItemHeight = 23; + this.cmbTensionStrapCCD3.Location = new System.Drawing.Point(260, 165); + this.cmbTensionStrapCCD3.Name = "cmbTensionStrapCCD3"; + this.cmbTensionStrapCCD3.Size = new System.Drawing.Size(70, 29); + this.cmbTensionStrapCCD3.TabIndex = 184; + this.cmbTensionStrapCCD3.UseSelectable = true; + // + // cmbTensionStrapCCD4 + // + this.cmbTensionStrapCCD4.FormattingEnabled = true; + this.cmbTensionStrapCCD4.ItemHeight = 23; + this.cmbTensionStrapCCD4.Location = new System.Drawing.Point(260, 198); + this.cmbTensionStrapCCD4.Name = "cmbTensionStrapCCD4"; + this.cmbTensionStrapCCD4.Size = new System.Drawing.Size(70, 29); + this.cmbTensionStrapCCD4.TabIndex = 185; + this.cmbTensionStrapCCD4.UseSelectable = true; + // + // metroLabel8 + // + this.metroLabel8.AutoSize = true; + this.metroLabel8.Location = new System.Drawing.Point(229, 106); + this.metroLabel8.Name = "metroLabel8"; + this.metroLabel8.Size = new System.Drawing.Size(15, 19); + this.metroLabel8.TabIndex = 186; + this.metroLabel8.Text = "-"; + // + // metroLabel9 + // + this.metroLabel9.AutoSize = true; + this.metroLabel9.Location = new System.Drawing.Point(230, 139); + this.metroLabel9.Name = "metroLabel9"; + this.metroLabel9.Size = new System.Drawing.Size(15, 19); + this.metroLabel9.TabIndex = 187; + this.metroLabel9.Text = "-"; + // + // metroLabel10 + // + this.metroLabel10.AutoSize = true; + this.metroLabel10.Location = new System.Drawing.Point(230, 171); + this.metroLabel10.Name = "metroLabel10"; + this.metroLabel10.Size = new System.Drawing.Size(15, 19); + this.metroLabel10.TabIndex = 188; + this.metroLabel10.Text = "-"; + // + // metroLabel11 + // + this.metroLabel11.AutoSize = true; + this.metroLabel11.Location = new System.Drawing.Point(230, 203); + this.metroLabel11.Name = "metroLabel11"; + this.metroLabel11.Size = new System.Drawing.Size(15, 19); + this.metroLabel11.TabIndex = 189; + this.metroLabel11.Text = "-"; + // + // metroLabel12 + // + this.metroLabel12.AutoSize = true; + this.metroLabel12.Location = new System.Drawing.Point(261, 71); + this.metroLabel12.Name = "metroLabel12"; + this.metroLabel12.Size = new System.Drawing.Size(63, 19); + this.metroLabel12.TabIndex = 190; + this.metroLabel12.Text = "CCD结果"; + // + // metroLabel13 + // + this.metroLabel13.AutoSize = true; + this.metroLabel13.Location = new System.Drawing.Point(155, 71); + this.metroLabel13.Name = "metroLabel13"; + this.metroLabel13.Size = new System.Drawing.Size(37, 19); + this.metroLabel13.TabIndex = 191; + this.metroLabel13.Text = "档位"; + // + // FormMesGradingSet + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(394, 529); + this.Controls.Add(this.metroLabel13); + this.Controls.Add(this.metroLabel12); + this.Controls.Add(this.txtgrading4); + this.Controls.Add(this.cmbTensionStrapCCD4); + this.Controls.Add(this.txtgrading3); + this.Controls.Add(this.cmbTensionStrapCCD3); + this.Controls.Add(this.txtgrading2); + this.Controls.Add(this.cmbTensionStrapCCD2); + this.Controls.Add(this.txtgrading1); + this.Controls.Add(this.cmbTensionStrapCCD1); + this.Controls.Add(this.metroLabel11); + this.Controls.Add(this.metroLabel10); + this.Controls.Add(this.metroLabel9); + this.Controls.Add(this.metroLabel8); + this.Controls.Add(this.chkCkGrading); + this.Controls.Add(this.cmbTensionStrap3); + this.Controls.Add(this.metroLabel7); + this.Controls.Add(this.chkStartNGFL); + this.Controls.Add(this.cmbTensionStrap2); + this.Controls.Add(this.cmbTensionStrap1); + this.Controls.Add(this.metroLabel6); + this.Controls.Add(this.metroLabel5); + this.Controls.Add(this.metroLabel4); + this.Controls.Add(this.metroLabel3); + this.Controls.Add(this.metroLabel2); + this.Controls.Add(this.metroLabel1); + this.Controls.Add(this.btnExit); + this.Controls.Add(this.btnSave); + this.Name = "FormMesGradingSet"; + this.Text = "MES档位设置"; + this.Load += new System.EventHandler(this.FormMesGradingSet_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.CheckBox chkStartNGFL; + private MetroFramework.Controls.MetroComboBox cmbTensionStrap2; + private MetroFramework.Controls.MetroComboBox cmbTensionStrap1; + private MetroFramework.Controls.MetroLabel metroLabel6; + private MetroFramework.Controls.MetroLabel metroLabel5; + private MetroFramework.Controls.MetroTextBox txtgrading4; + private MetroFramework.Controls.MetroLabel metroLabel4; + private MetroFramework.Controls.MetroTextBox txtgrading2; + private MetroFramework.Controls.MetroLabel metroLabel3; + private MetroFramework.Controls.MetroTextBox txtgrading1; + private MetroFramework.Controls.MetroLabel metroLabel2; + private MetroFramework.Controls.MetroTextBox txtgrading3; + private MetroFramework.Controls.MetroLabel metroLabel1; + private MetroFramework.Controls.MetroButton btnExit; + private MetroFramework.Controls.MetroButton btnSave; + private MetroFramework.Controls.MetroComboBox cmbTensionStrap3; + private MetroFramework.Controls.MetroLabel metroLabel7; + private System.Windows.Forms.CheckBox chkCkGrading; + private MetroFramework.Controls.MetroComboBox cmbTensionStrapCCD1; + private MetroFramework.Controls.MetroComboBox cmbTensionStrapCCD2; + private MetroFramework.Controls.MetroComboBox cmbTensionStrapCCD3; + private MetroFramework.Controls.MetroComboBox cmbTensionStrapCCD4; + private MetroFramework.Controls.MetroLabel metroLabel8; + private MetroFramework.Controls.MetroLabel metroLabel9; + private MetroFramework.Controls.MetroLabel metroLabel10; + private MetroFramework.Controls.MetroLabel metroLabel11; + private MetroFramework.Controls.MetroLabel metroLabel12; + private MetroFramework.Controls.MetroLabel metroLabel13; + } +} \ No newline at end of file diff --git a/JY.Inspection/Frm/FormMesGradingSet.cs b/JY.Inspection/Frm/FormMesGradingSet.cs new file mode 100644 index 0000000..85f78a1 --- /dev/null +++ b/JY.Inspection/Frm/FormMesGradingSet.cs @@ -0,0 +1,402 @@ +using JY.Utility; +using JYControl; +using PLCCommunication; +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 JY.Inspection.Frm +{ + public partial class FormMesGradingSet : MetroFramework.Forms.MetroForm + { + private FrmOmronPLCCom MelsecPLCCom; + public short[] MESGradingSet = new short[] { (short)1, (short)1, (short)1, (short)1 }; + public FormMesGradingSet(FrmOmronPLCCom plcccom) + { + InitializeComponent(); + MelsecPLCCom = plcccom; + } + + private void FormMesGradingSet_Load(object sender, EventArgs e) + { + if (Global.systemConfig.isUpMes) + { + chkCkGrading.Visible = true; + } + else + { + chkCkGrading.Visible = false; + } + + + BangDingcmb(); + BangDingcmbCCD(); + txtgrading1.Text = IniFileHelper.ReadIniData("MES配置", "Grading1"); + txtgrading2.Text = IniFileHelper.ReadIniData("MES配置", "Grading2"); + txtgrading3.Text = IniFileHelper.ReadIniData("MES配置", "Grading3"); + txtgrading4.Text = IniFileHelper.ReadIniData("MES配置", "Grading4"); + cmbTensionStrap1.SelectedIndex = Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrap1")); + cmbTensionStrap2.SelectedIndex = Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrap2")); + cmbTensionStrap3.SelectedIndex = Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrap3")); + cmbTensionStrapCCD1.SelectedIndex = Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrapCCDReslut1")); + cmbTensionStrapCCD2.SelectedIndex = Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrapCCDReslut2")); + cmbTensionStrapCCD3.SelectedIndex = Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrapCCDReslut3")); + cmbTensionStrapCCD4.SelectedIndex = Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrapCCDReslut4")); + //不分类 + chkStartNGFL.Checked = IniFileHelper.ReadIniData("MES配置", "StartNGFL") == "1" ? true : false; + //是否启用分档 + chkCkGrading.Checked = IniFileHelper.ReadIniData("MES配置", "Grading") == "1" ? true : false; + } + + public void BangDingcmb() + { + string[] bound = IniFileHelper.ReadIniData("MES配置", "NGMessage").Split(','); + List cmbls = new List(); + List cmbls2 = new List(); + List cmbls3 = new List(); + for (int i = 0; i < bound.Length; i++) + { + cmb _cmb = new cmb(); + _cmb.Key = i.ToString(); + _cmb.Value = bound[i]; + cmbls.Add(_cmb); + cmbls2.Add(_cmb); + cmbls3.Add(_cmb); + } + cmbTensionStrap1.DataSource = cmbls; + cmbTensionStrap1.DisplayMember = "Value"; + cmbTensionStrap2.DataSource = cmbls2; + cmbTensionStrap2.DisplayMember = "Value"; + cmbTensionStrap3.DataSource = cmbls3; + cmbTensionStrap3.DisplayMember = "Value"; + } + + public void BangDingcmbCCD() + { + string[] bound = IniFileHelper.ReadIniData("MES配置", "CCDResultMessage").Split(','); + List cmbls = new List(); + List cmbls2 = new List(); + List cmbls3 = new List(); + List cmbls4 = new List(); + for (int i = 0; i < bound.Length; i++) + { + cmb _cmb = new cmb(); + _cmb.Key = i.ToString(); + _cmb.Value = bound[i]; + cmbls.Add(_cmb); + cmbls2.Add(_cmb); + cmbls3.Add(_cmb); + cmbls4.Add(_cmb); + } + cmbTensionStrapCCD1.DataSource = cmbls; + cmbTensionStrapCCD1.DisplayMember = "Value"; + cmbTensionStrapCCD2.DataSource = cmbls2; + cmbTensionStrapCCD2.DisplayMember = "Value"; + cmbTensionStrapCCD3.DataSource = cmbls3; + cmbTensionStrapCCD3.DisplayMember = "Value"; + cmbTensionStrapCCD4.DataSource = cmbls4; + cmbTensionStrapCCD4.DisplayMember = "Value"; + } + + public class cmb + { + public string Key { get; set; } + public string Value { get; set; } + } + + /// + /// 保存MES配置文件信息 + /// + /// + /// + private void btnSave_Click(object sender, EventArgs e) + { + if (txtgrading1.Text.Trim().Equals("")) + { + MessageBox.Show("MES参数保存失败,一档(OK拉带1)对应档位不可为空!", "系统提示"); + return; + } + if (txtgrading2.Text.Trim().Equals("")) + { + MessageBox.Show("MES参数保存失败,一档(OK拉带2)对应档位不可为空!", "系统提示"); + return; + } + if (txtgrading3.Text.Trim().Equals("")) + { + MessageBox.Show("MES参数保存失败,一档(OK拉带3)对应档位不可为空!", "系统提示"); + return; + } + if (txtgrading4.Text.Trim().Equals("")) + { + MessageBox.Show("MES参数保存失败,一档(OK拉带4)对应档位不可为空!", "系统提示"); + return; + } + if (chkStartNGFL.Checked && cmbTensionStrap1.SelectedIndex != 0 && cmbTensionStrap2.SelectedIndex != 0 && cmbTensionStrap3.SelectedIndex != 0) + { + MessageBox.Show("MES参数保存失败,NG电池不分类排出时NG拉带1和NG拉带2以及NG拉带3必须为不分类", "系统提示"); + return; + } + if (!chkStartNGFL.Checked && (cmbTensionStrap1.SelectedIndex == 0 || cmbTensionStrap2.SelectedIndex == 0 || cmbTensionStrap3.SelectedIndex == 0)) + { + MessageBox.Show("MES参数保存失败,NG电池分类排出时NG拉带1和NG拉带2以及NG拉带3,不能选择不分类", "系统提示"); + return; + } + + if (txtgrading1.Text.Trim().Equals(txtgrading2.Text.Trim())) + { + if (cmbTensionStrapCCD1.SelectedIndex == 0 || cmbTensionStrapCCD2.SelectedIndex == 0) + { + if (cmbTensionStrapCCD1.SelectedIndex == 1 || cmbTensionStrapCCD2.SelectedIndex == 1 || cmbTensionStrapCCD1.SelectedIndex == 2 || cmbTensionStrapCCD2.SelectedIndex == 2) + { + MessageBox.Show("同一档位(一档、二档)不允许同时选择“不分类”与“OK/NG”", "系统提示"); + return; + } + } + } + if (txtgrading1.Text.Trim().Equals(txtgrading3.Text.Trim())) + { + if (cmbTensionStrapCCD1.SelectedIndex == 0 || cmbTensionStrapCCD3.SelectedIndex == 0) + { + if (cmbTensionStrapCCD1.SelectedIndex == 1 || cmbTensionStrapCCD3.SelectedIndex == 1 || cmbTensionStrapCCD1.SelectedIndex == 2 || cmbTensionStrapCCD3.SelectedIndex == 2) + { + MessageBox.Show("同一档位(一档、三档)不允许同时选择“不分类”与“OK/NG”", "系统提示"); + return; + } + } + } + if (txtgrading1.Text.Trim().Equals(txtgrading4.Text.Trim())) + { + if (cmbTensionStrapCCD1.SelectedIndex == 0 || cmbTensionStrapCCD4.SelectedIndex == 0) + { + if (cmbTensionStrapCCD1.SelectedIndex == 1 || cmbTensionStrapCCD4.SelectedIndex == 1 || cmbTensionStrapCCD1.SelectedIndex == 2 || cmbTensionStrapCCD4.SelectedIndex == 2) + { + MessageBox.Show("同一档位(一档、四档)不允许同时选择“不分类”与“OK/NG”", "系统提示"); + return; + } + } + } + if (txtgrading2.Text.Trim().Equals(txtgrading3.Text.Trim())) + { + if (cmbTensionStrapCCD2.SelectedIndex == 0 || cmbTensionStrapCCD3.SelectedIndex == 0) + { + if (cmbTensionStrapCCD2.SelectedIndex == 1 || cmbTensionStrapCCD3.SelectedIndex == 1 || cmbTensionStrapCCD2.SelectedIndex == 2 || cmbTensionStrapCCD3.SelectedIndex == 2) + { + MessageBox.Show("同一档位(二档、三档)不允许同时选择“不分类”与“OK/NG”", "系统提示"); + return; + } + } + } + if (txtgrading2.Text.Trim().Equals(txtgrading4.Text.Trim())) + { + if (cmbTensionStrapCCD2.SelectedIndex == 0 || cmbTensionStrapCCD4.SelectedIndex == 0) + { + if (cmbTensionStrapCCD2.SelectedIndex == 1 || cmbTensionStrapCCD4.SelectedIndex == 1 || cmbTensionStrapCCD2.SelectedIndex == 2 || cmbTensionStrapCCD4.SelectedIndex == 2) + { + MessageBox.Show("同一档位(二档、四档)不允许同时选择“不分类”与“OK/NG”", "系统提示"); + return; + } + } + } + if (txtgrading3.Text.Trim().Equals(txtgrading4.Text.Trim())) + { + if (cmbTensionStrapCCD3.SelectedIndex == 0 || cmbTensionStrapCCD4.SelectedIndex == 0) + { + if (cmbTensionStrapCCD3.SelectedIndex == 1 || cmbTensionStrapCCD4.SelectedIndex == 1 || cmbTensionStrapCCD3.SelectedIndex == 2 || cmbTensionStrapCCD4.SelectedIndex == 2) + { + MessageBox.Show("同一档位(三档、四档)不允许同时选择“不分类”与“OK/NG”", "系统提示"); + return; + } + } + } + + #region plc中ccd屏蔽 + //开启了ccd屏蔽的,只能使用 ccd结果 不分类 + //关闭了ccd屏蔽的,只能使用 ccd结果 ng ok + //同ok档位 必须有一个选择ccd ok 或者不分类 + var listGradingCCD = new List(); + listGradingCCD.Add(txtgrading1.Text.Trim() + "-" + cmbTensionStrapCCD1.Text); + listGradingCCD.Add(txtgrading2.Text.Trim() + "-" + cmbTensionStrapCCD2.Text); + listGradingCCD.Add(txtgrading3.Text.Trim() + "-" + cmbTensionStrapCCD3.Text); + listGradingCCD.Add(txtgrading4.Text.Trim() + "-" + cmbTensionStrapCCD4.Text); + //读取plc地址W260。9 是开启屏蔽。1 是默认不开启。 反馈地址w261。 1 是正常不报警。 2 是报警。 + var int_IsMaskCCD = MelsecPLCCom.lstMcUI[0].ReadshortDReg("W260"); + + if (int_IsMaskCCD == 9) + { + var gradingCCD_NoClassCount = listGradingCCD.Count(x => x.Contains("不分类")); + if(gradingCCD_NoClassCount <=0) + { + MessageBox.Show($"已开启CCD结果屏蔽,全部档位设置CCD结果不分类", "系统提示"); + return; + } + } + else + { + //必须有一个OK ccd结果拉带 + var gradingCCD_OKCount = listGradingCCD.Count(x => x.Contains("OK")); + if(gradingCCD_OKCount <= 0) + { + MessageBox.Show($"已关闭CCD结果屏蔽,档位设置至少有一个CCD结果OK选择值", "系统提示"); + return; + } + var lstGradingCCD_NG = listGradingCCD.Where(x => x.Contains("NG")).Distinct().ToList(); + foreach (var item_NG in lstGradingCCD_NG) + { + var grading_array = item_NG.Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries); + var indexGrading = listGradingCCD.IndexOf(grading_array[0] + "-" + "OK"); + if (indexGrading < 0) + { + MessageBox.Show($"已关闭CCD结果屏蔽,OK拉带档位{item_NG},必须选一个{grading_array[0]}档位对应的CCD结果OK值", "系统提示"); + return; + } + } + } + #endregion + + IniFileHelper.WriteIniData("MES配置", "Grading1", txtgrading1.Text.Trim()); + IniFileHelper.WriteIniData("MES配置", "Grading2", txtgrading2.Text.Trim()); + IniFileHelper.WriteIniData("MES配置", "Grading3", txtgrading3.Text.Trim()); + IniFileHelper.WriteIniData("MES配置", "Grading4", txtgrading4.Text.Trim()); + IniFileHelper.WriteIniData("MES配置", "TensionStrapCCDReslut1", cmbTensionStrapCCD1.SelectedIndex.ToString()); + IniFileHelper.WriteIniData("MES配置", "TensionStrapCCDReslut2", cmbTensionStrapCCD2.SelectedIndex.ToString()); + IniFileHelper.WriteIniData("MES配置", "TensionStrapCCDReslut3", cmbTensionStrapCCD3.SelectedIndex.ToString()); + IniFileHelper.WriteIniData("MES配置", "TensionStrapCCDReslut4", cmbTensionStrapCCD4.SelectedIndex.ToString()); + IniFileHelper.WriteIniData("MES配置", "TensionStrap1", cmbTensionStrap1.SelectedIndex.ToString()); + IniFileHelper.WriteIniData("MES配置", "TensionStrap2", cmbTensionStrap2.SelectedIndex.ToString()); + IniFileHelper.WriteIniData("MES配置", "TensionStrap3", cmbTensionStrap3.SelectedIndex.ToString()); + + //不分类 + IniFileHelper.WriteIniData("MES配置", "StartNGFL", chkStartNGFL.Checked ? "1" : "0"); + //是否启用分档 + IniFileHelper.WriteIniData("MES配置", "Grading", chkCkGrading.Checked ? "1" : "2"); + + MESGradingSet[0] = (short)1; + if ((txtgrading2.Text.Trim()+ cmbTensionStrapCCD2.Text).Equals(txtgrading1.Text.Trim()+ cmbTensionStrapCCD1.Text)) + MESGradingSet[1] = MESGradingSet[0]; + else + MESGradingSet[1] = (short)(MESGradingSet[0] + 1); + + if ((txtgrading3.Text.Trim() + cmbTensionStrapCCD3.Text).Equals(txtgrading1.Text.Trim()+ cmbTensionStrapCCD1.Text)) + MESGradingSet[2] = MESGradingSet[0]; + else + { + if ((txtgrading3.Text.Trim() + cmbTensionStrapCCD3.Text).Equals(txtgrading2.Text.Trim() + cmbTensionStrapCCD2.Text)) + MESGradingSet[2] = MESGradingSet[1]; + else + MESGradingSet[2] = (short)(MESGradingSet[1] + 1); + } + + if ((txtgrading4.Text.Trim() + cmbTensionStrapCCD4.Text).Equals(txtgrading1.Text.Trim() + cmbTensionStrapCCD1.Text)) + MESGradingSet[3] = MESGradingSet[0]; + else + { + if ((txtgrading4.Text.Trim() + cmbTensionStrapCCD4.Text).Equals(txtgrading2.Text.Trim() + cmbTensionStrapCCD2.Text)) + MESGradingSet[3] = MESGradingSet[1]; + else + { + if ((txtgrading4.Text.Trim() + cmbTensionStrapCCD4.Text).Equals(txtgrading3.Text.Trim() + cmbTensionStrapCCD3.Text)) + MESGradingSet[3] = MESGradingSet[2]; + else + MESGradingSet[3] = (short)(MESGradingSet[2] + 1); + } + } + + int Grading = Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "Grading")); + + //告诉PLC当前OK与NG拉带设置挡位 + // + if(cmbTensionStrapCCD1.Text.ToUpper() =="NG") + { + MESGradingSet[0] = (short)(30 + MESGradingSet[0]); + } + if (cmbTensionStrapCCD2.Text.ToUpper() == "NG") + { + MESGradingSet[1] = (short)(30 + MESGradingSet[1]); + } + if (cmbTensionStrapCCD3.Text.ToUpper() == "NG") + { + MESGradingSet[2] = (short)(30 + MESGradingSet[2]); + } + if (cmbTensionStrapCCD4.Text.ToUpper() == "NG") + { + MESGradingSet[3] = (short)(30 + MESGradingSet[3]); + } + MelsecPLCCom.lstMcUI[0].WriteDReg("W241", MESGradingSet[0]); + MelsecPLCCom.lstMcUI[0].WriteDReg("W242", MESGradingSet[1]); + MelsecPLCCom.lstMcUI[0].WriteDReg("W243", MESGradingSet[2]); + MelsecPLCCom.lstMcUI[0].WriteDReg("W244", MESGradingSet[3]); + //+10 + //MelsecPLCCom.lstMcUI[0].WriteDReg("W245", (short)cmbTensionStrap1.SelectedIndex); + //MelsecPLCCom.lstMcUI[0].WriteDReg("W246", (short)cmbTensionStrap2.SelectedIndex); + //MelsecPLCCom.lstMcUI[0].WriteDReg("W247", (short)cmbTensionStrap3.SelectedIndex); + + MelsecPLCCom.lstMcUI[0].WriteDReg("W245", (short)(cmbTensionStrap1.SelectedIndex ==0 ? 99 : cmbTensionStrap1.SelectedIndex + 10)); + MelsecPLCCom.lstMcUI[0].WriteDReg("W246", (short)(cmbTensionStrap2.SelectedIndex == 0 ? 99 : cmbTensionStrap2.SelectedIndex + 10)); + MelsecPLCCom.lstMcUI[0].WriteDReg("W247", (short)(cmbTensionStrap3.SelectedIndex == 0 ? 99 : cmbTensionStrap3.SelectedIndex + 10)); + MelsecPLCCom.lstMcUI[0].WriteDReg("W248", (short)Grading); + + + LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}]设置一档,W241[值:{MESGradingSet[0]}-档位:{txtgrading1.Text.Trim()}{cmbTensionStrapCCD1.Text}]", LogAddtype.local, Logtype.Message); + LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}]设置二档,W242[值:{MESGradingSet[1]}-档位:{txtgrading2.Text.Trim()}{cmbTensionStrapCCD2.Text}]", LogAddtype.local, Logtype.Message); + LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}]设置三档,W243[值:{MESGradingSet[2]}-档位:{txtgrading3.Text.Trim()}{cmbTensionStrapCCD3.Text}]", LogAddtype.local, Logtype.Message); + LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}]设置四档,W244[值:{MESGradingSet[3]}-档位:{txtgrading4.Text.Trim()}{cmbTensionStrapCCD4.Text}]", LogAddtype.local, Logtype.Message); + + var ng1 = (short)(cmbTensionStrap1.SelectedIndex == 0 ? 99 : cmbTensionStrap1.SelectedIndex + 10); + var ng2 = (short)(cmbTensionStrap2.SelectedIndex == 0 ? 99 : cmbTensionStrap2.SelectedIndex + 10); + var ng3 = (short)(cmbTensionStrap3.SelectedIndex == 0 ? 99 : cmbTensionStrap3.SelectedIndex + 10); + + LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}]设置NG拉带1,W245[值:{ng1}-档位:{cmbTensionStrap1.Text.Trim()}]", LogAddtype.local, Logtype.Message); + LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}]设置NG拉带2,W246[值:{ng2}-档位:{cmbTensionStrap2.Text.Trim()}]", LogAddtype.local, Logtype.Message); + LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}]设置NG拉带3,W247[值:{ng3}-档位:{cmbTensionStrap3.Text.Trim()}]", LogAddtype.local, Logtype.Message); + if ((short)Grading == 1) + { + LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}],设置W248[值:{(short)Grading}-启用分档模式]", LogAddtype.local, Logtype.Message); + } + else + { + LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}],设置W248[值:{(short)Grading}-关闭分档模式]", LogAddtype.local, Logtype.Message); + } + MessageBox.Show("MES参数保存成功!", "系统提示"); + this.DialogResult = DialogResult.OK; + } + + private void btnExit_Click(object sender, EventArgs e) + { + this.Close(); + } + + private void cmbTensionStrap1_DropDownClosed(object sender, EventArgs e) + { + if (cmbTensionStrap1.SelectedIndex != cmbTensionStrap1.Items.Count - 1) + cmbTensionStrap2.SelectedIndex = cmbTensionStrap2.Items.Count - 1; + } + + private void cmbTensionStrap2_DropDownClosed(object sender, EventArgs e) + { + if (cmbTensionStrap2.SelectedIndex != cmbTensionStrap2.Items.Count - 1) + cmbTensionStrap3.SelectedIndex = cmbTensionStrap3.Items.Count - 1; + } + + private void cmbTensionStrap3_DropDownClosed(object sender, EventArgs e) + { + if (cmbTensionStrap3.SelectedIndex != cmbTensionStrap3.Items.Count - 1) + cmbTensionStrap1.SelectedIndex = cmbTensionStrap1.Items.Count - 1; + } + + private void chkStartNGFL_Click(object sender, EventArgs e) + { + if (chkStartNGFL.Checked) + { + cmbTensionStrap1.SelectedIndex = 0; + cmbTensionStrap2.SelectedIndex = 0; + cmbTensionStrap3.SelectedIndex = 0; + } + } + } +} diff --git a/JY.Inspection/Frm/FormMesGradingSet.resx b/JY.Inspection/Frm/FormMesGradingSet.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JY.Inspection/Frm/FormMesGradingSet.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmAbnormalVoice.Designer.cs b/JY.Inspection/Frm/FrmAbnormalVoice.Designer.cs new file mode 100644 index 0000000..26a7c48 --- /dev/null +++ b/JY.Inspection/Frm/FrmAbnormalVoice.Designer.cs @@ -0,0 +1,225 @@ + +namespace JY.Inspection.Frm +{ + partial class FrmAbnormalVoice + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.grdData = new System.Windows.Forms.DataGridView(); + this.metroLabel7 = new MetroFramework.Controls.MetroLabel(); + this.btnEdit = new MetroFramework.Controls.MetroButton(); + this.txtCode = new MetroFramework.Controls.MetroTextBox(); + this.btnDelete = new MetroFramework.Controls.MetroButton(); + this.metroLabel1 = new MetroFramework.Controls.MetroLabel(); + this.btnAdd = new MetroFramework.Controls.MetroButton(); + this.txtRemark = new MetroFramework.Controls.MetroTextBox(); + this.groupBox3.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.grdData)).BeginInit(); + this.SuspendLayout(); + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.grdData); + this.groupBox3.Controls.Add(this.metroLabel7); + this.groupBox3.Controls.Add(this.btnEdit); + this.groupBox3.Controls.Add(this.txtCode); + this.groupBox3.Controls.Add(this.btnDelete); + this.groupBox3.Controls.Add(this.metroLabel1); + this.groupBox3.Controls.Add(this.btnAdd); + this.groupBox3.Controls.Add(this.txtRemark); + this.groupBox3.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBox3.Location = new System.Drawing.Point(20, 30); + this.groupBox3.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.groupBox3.Size = new System.Drawing.Size(1039, 543); + this.groupBox3.TabIndex = 21; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "异常播报设置"; + // + // grdData + // + this.grdData.AllowUserToAddRows = false; + this.grdData.AllowUserToDeleteRows = false; + this.grdData.BackgroundColor = System.Drawing.Color.White; + this.grdData.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.grdData.Location = new System.Drawing.Point(9, 25); + this.grdData.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.grdData.Name = "grdData"; + this.grdData.ReadOnly = true; + this.grdData.RowHeadersWidth = 51; + this.grdData.RowTemplate.Height = 23; + this.grdData.Size = new System.Drawing.Size(679, 500); + this.grdData.TabIndex = 5; + // + // metroLabel7 + // + this.metroLabel7.AutoSize = true; + this.metroLabel7.Location = new System.Drawing.Point(696, 40); + this.metroLabel7.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.metroLabel7.Name = "metroLabel7"; + this.metroLabel7.Size = new System.Drawing.Size(84, 20); + this.metroLabel7.TabIndex = 16; + this.metroLabel7.Text = "工位编码:"; + // + // btnEdit + // + this.btnEdit.Location = new System.Drawing.Point(813, 231); + this.btnEdit.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.btnEdit.Name = "btnEdit"; + this.btnEdit.Size = new System.Drawing.Size(100, 28); + this.btnEdit.TabIndex = 4; + this.btnEdit.Text = "编 辑"; + this.btnEdit.UseSelectable = true; + // + // txtCode + // + // + // + // + this.txtCode.CustomButton.Image = null; + this.txtCode.CustomButton.Location = new System.Drawing.Point(192, 2); + this.txtCode.CustomButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.txtCode.CustomButton.Name = ""; + this.txtCode.CustomButton.Size = new System.Drawing.Size(23, 23); + this.txtCode.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.txtCode.CustomButton.TabIndex = 1; + this.txtCode.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.txtCode.CustomButton.UseSelectable = true; + this.txtCode.CustomButton.Visible = false; + this.txtCode.Lines = new string[0]; + this.txtCode.Location = new System.Drawing.Point(803, 36); + this.txtCode.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.txtCode.MaxLength = 10; + this.txtCode.Name = "txtCode"; + this.txtCode.PasswordChar = '\0'; + this.txtCode.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.txtCode.SelectedText = ""; + this.txtCode.SelectionLength = 0; + this.txtCode.SelectionStart = 0; + this.txtCode.ShortcutsEnabled = true; + this.txtCode.Size = new System.Drawing.Size(218, 28); + this.txtCode.TabIndex = 1; + this.txtCode.UseSelectable = true; + this.txtCode.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.txtCode.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // btnDelete + // + this.btnDelete.Location = new System.Drawing.Point(921, 231); + this.btnDelete.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.btnDelete.Name = "btnDelete"; + this.btnDelete.Size = new System.Drawing.Size(100, 28); + this.btnDelete.TabIndex = 5; + this.btnDelete.Text = "删 除"; + this.btnDelete.UseSelectable = true; + // + // metroLabel1 + // + this.metroLabel1.AutoSize = true; + this.metroLabel1.Location = new System.Drawing.Point(696, 76); + this.metroLabel1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.metroLabel1.Name = "metroLabel1"; + this.metroLabel1.Size = new System.Drawing.Size(84, 20); + this.metroLabel1.TabIndex = 4; + this.metroLabel1.Text = "播报内容:"; + // + // btnAdd + // + this.btnAdd.Location = new System.Drawing.Point(706, 231); + this.btnAdd.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.btnAdd.Name = "btnAdd"; + this.btnAdd.Size = new System.Drawing.Size(100, 28); + this.btnAdd.TabIndex = 3; + this.btnAdd.Text = "添 加"; + this.btnAdd.UseSelectable = true; + // + // txtRemark + // + // + // + // + this.txtRemark.CustomButton.Image = null; + this.txtRemark.CustomButton.Location = new System.Drawing.Point(80, 1); + this.txtRemark.CustomButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.txtRemark.CustomButton.Name = ""; + this.txtRemark.CustomButton.Size = new System.Drawing.Size(137, 137); + this.txtRemark.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.txtRemark.CustomButton.TabIndex = 1; + this.txtRemark.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.txtRemark.CustomButton.UseSelectable = true; + this.txtRemark.CustomButton.Visible = false; + this.txtRemark.Lines = new string[0]; + this.txtRemark.Location = new System.Drawing.Point(803, 76); + this.txtRemark.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.txtRemark.MaxLength = 100; + this.txtRemark.Multiline = true; + this.txtRemark.Name = "txtRemark"; + this.txtRemark.PasswordChar = '\0'; + this.txtRemark.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.txtRemark.SelectedText = ""; + this.txtRemark.SelectionLength = 0; + this.txtRemark.SelectionStart = 0; + this.txtRemark.ShortcutsEnabled = true; + this.txtRemark.Size = new System.Drawing.Size(218, 139); + this.txtRemark.TabIndex = 2; + this.txtRemark.UseSelectable = true; + this.txtRemark.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.txtRemark.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // FrmAbnormalVoice + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1079, 593); + this.Controls.Add(this.groupBox3); + this.DisplayHeader = false; + this.MaximizeBox = false; + this.Name = "FrmAbnormalVoice"; + this.Padding = new System.Windows.Forms.Padding(20, 30, 20, 20); + this.Resizable = false; + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.grdData)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.DataGridView grdData; + private MetroFramework.Controls.MetroLabel metroLabel7; + private MetroFramework.Controls.MetroButton btnEdit; + private MetroFramework.Controls.MetroTextBox txtCode; + private MetroFramework.Controls.MetroButton btnDelete; + private MetroFramework.Controls.MetroLabel metroLabel1; + private MetroFramework.Controls.MetroButton btnAdd; + private MetroFramework.Controls.MetroTextBox txtRemark; + } +} \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmAbnormalVoice.cs b/JY.Inspection/Frm/FrmAbnormalVoice.cs new file mode 100644 index 0000000..dd74ca0 --- /dev/null +++ b/JY.Inspection/Frm/FrmAbnormalVoice.cs @@ -0,0 +1,214 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Globalization; +using System.Linq; +using System.Speech.Synthesis; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using JY.DAL; +using JY.Model; + +namespace JY.Inspection.Frm +{ + public partial class FrmAbnormalVoice : MetroFramework.Forms.MetroForm + { + private DataTable _dt; + private SpeechSynthesizer _speech; + public FrmAbnormalVoice() + { + InitializeComponent(); + this.Load += FrmAbnormalVoice_Load; + this.FormClosing += FrmAbnormalVoice_FormClosing; + + btnAdd.Click += BtnAdd_Click; + btnEdit.Click += BtnEdit_Click; + btnDelete.Click += BtnDelete_Click; + grdData.SelectionChanged += GrdData_SelectionChanged; + grdData.CellContentClick += GrdData_CellContentClick; + } + + private void FrmAbnormalVoice_Load(object sender, EventArgs e) + { + try + { + BindGridStyle(); + LoadData(); + + _speech = new SpeechSynthesizer(); + _speech.Volume = 100; //音量 + CultureInfo keyboardCulture = InputLanguage.CurrentInputLanguage.Culture; + InstalledVoice neededVoice = _speech.GetInstalledVoices(keyboardCulture).FirstOrDefault(); + if (neededVoice != null) + { + _speech.SelectVoice(neededVoice.VoiceInfo.Name); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + } + } + private void LoadData() + { + _dt = SqlHelper.QueryTable("select *,'播放' as Operation from tb_AbnormalVoice"); + grdData.DataSource = _dt.DefaultView; + } + + private void BtnAdd_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(txtCode.Text.Trim())) + { + txtCode.Focus(); + MessageBox.Show("请输入工位编码"); + return; + } + if (string.IsNullOrEmpty(txtRemark.Text.Trim())) + { + txtRemark.Focus(); + MessageBox.Show("请输入播报内容"); + return; + } + try + { + string sql = $"insert tb_AbnormalVoice(Code,Remark) values('{txtCode.Text.Trim()}','{txtRemark.Text.Trim()}')"; + int result = SqlHelper.Execute(sql); + if (result > 0) + { + LoadData(); + MessageBox.Show("保存成功!"); + } + else + { + MessageBox.Show("保存失败!"); + } + } + catch (Exception ex) + { + MessageBox.Show("保存失败:" + ex.Message); + } + } + + private void BtnEdit_Click(object sender, EventArgs e) + { + try + { + string sql = $"update tb_AbnormalVoice set Code='{txtCode.Text.Trim()}',Remark='{txtRemark.Text.Trim()}' where id={grdData.CurrentRow.Cells["ID"].Value}"; + int result = SqlHelper.Execute(sql); + if (result > 0) + { + LoadData(); + MessageBox.Show("编辑成功!"); + } + else + { + MessageBox.Show("编辑失败!"); + } + } + catch (Exception ex) + { + MessageBox.Show("编辑失败:" + ex.Message); + } + } + + private void BtnDelete_Click(object sender, EventArgs e) + { + if (MessageBox.Show("确认删除当前选中记录吗?", "提示", MessageBoxButtons.YesNo) == DialogResult.No) + { + return; + } + try + { + string sql = $"delete tb_AbnormalVoice where id={grdData.CurrentRow.Cells["ID"].Value}"; + int result = SqlHelper.Execute(sql); + if (result > 0) + { + LoadData(); + MessageBox.Show("删除成功!"); + } + else + { + MessageBox.Show("删除失败!"); + } + } + catch (Exception ex) + { + MessageBox.Show("删除失败:" + ex.Message); + } + } + private void GrdData_SelectionChanged(object sender, EventArgs e) + { + DataGridViewRow row = grdData.CurrentRow; + txtCode.Text = row.Cells["Code"].Value.ToString(); + txtRemark.Text = row.Cells["Remark"].Value.ToString(); + } + + private void GrdData_CellContentClick(object sender, DataGridViewCellEventArgs e) + { + if (e.ColumnIndex == 3) + { + DataGridViewRow row = grdData.CurrentRow; + if (_speech != null) + { + _speech.SpeakAsync(row.Cells["Remark"].Value.ToString()); + } + } + } + private void FrmAbnormalVoice_FormClosing(object sender, FormClosingEventArgs e) + { + if (_speech != null) + { + if (_speech.State == SynthesizerState.Speaking) + { + _speech.Pause(); + _speech.Dispose(); + } + } + } + + private void BindGridStyle() + { + grdData.AlternatingRowsDefaultCellStyle.BackColor = System.Drawing.Color.WhiteSmoke;//FromArgb(((int)(((byte)(255)))), ((int)(((byte)(224)))), ((int)(((byte)(192))))); + //grdData.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + grdData.MultiSelect = false; + grdData.AllowUserToAddRows = false; + grdData.AutoGenerateColumns = false; + + DataGridViewTextBoxColumn col1 = new DataGridViewTextBoxColumn(); + col1.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; + col1.Name = "ID"; + col1.DataPropertyName = col1.Name; + col1.HeaderText = "ID"; + col1.Width = 50; + grdData.Columns.Add(col1); + + DataGridViewTextBoxColumn col2 = new DataGridViewTextBoxColumn(); + col2.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; + col2.Name = "Code"; + col2.DataPropertyName = col2.Name; + col2.HeaderText = "工位编码"; + col2.Width = 90; + grdData.Columns.Add(col2); + + DataGridViewTextBoxColumn col3 = new DataGridViewTextBoxColumn(); + col3.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft; + col3.Name = "Remark"; + col3.DataPropertyName = col3.Name; + col3.HeaderText = "播报内容"; + col3.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; + //col2.Width = 200; + grdData.Columns.Add(col3); + + DataGridViewLinkColumn col7 = new DataGridViewLinkColumn(); + col7.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; + col7.Name = "Operation"; + col7.DataPropertyName = col7.Name; + col7.HeaderText = ""; + col7.Width = 60; + grdData.Columns.Add(col7); + } + } +} diff --git a/JY.Inspection/Frm/FrmAbnormalVoice.resx b/JY.Inspection/Frm/FrmAbnormalVoice.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JY.Inspection/Frm/FrmAbnormalVoice.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmAlamQuery.cs b/JY.Inspection/Frm/FrmAlamQuery.cs new file mode 100644 index 0000000..c98d89d --- /dev/null +++ b/JY.Inspection/Frm/FrmAlamQuery.cs @@ -0,0 +1,110 @@ +using JY.DAL; +using JY.Model; +using MetroFramework.Forms; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace JY.Inspection.Frm +{ + public partial class FrmAlamQuery : MetroForm + { + public delegate void myDelegate(List dtt); + public delegate void PDelegate(); + Thread tSo; + + /// + /// 数据库访问接口 + /// + private IDbHelper dbHelper = new OpSqlDataBase(); + public FrmAlamQuery() + { + InitializeComponent(); + } + + private void FrmAlamQuery_Load(object sender, EventArgs e) + { + + } + /// + /// 查询报警日志 + /// + /// + /// + private void btnSelect_Click(object sender, EventArgs e) + { + //string strDate1 = dtStartTime.Value.ToString("yyyy-MM-dd HH:mm") + ":01"; + //string strDate2 = dtEndTime.Value.ToString("yyyy-MM-dd HH:mm") + ":59"; + + //var list = dbHelper.GetAlarmData(strDate1, strDate2); + + //if (list == null || list.Count == 0) + //{ + // MessageBox.Show("此时间段无数据或无此条码数据", "系统提示"); + // lblSelectStures.BeginInvoke(new PDelegate(bb)); + // return; + //} + //else + //{ + // dgvData.DataSource = list; + //} + //以下线程方法 + try + { + tSo = new Thread(new ThreadStart(ThreadWork)); + tSo.IsBackground = true; + tSo.Start(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message.ToString() + ",数据查询失败", "查询提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + } + + + private void ThreadWork() + { + lblSelectStures.BeginInvoke(new PDelegate(aa)); + string strDate1 = dtStartTime.Value.ToString("yyyy-MM-dd HH:mm") + ":01"; + string strDate2 = dtEndTime.Value.ToString("yyyy-MM-dd HH:mm") + ":59"; + if (dtEndTime.Value.Year != dtStartTime.Value.Year) + { + MessageBox.Show("请选择日期必须在同一年份内!"); + lblSelectStures.BeginInvoke(new PDelegate(bb)); + return; + } + + var result = dbHelper.GetAlarmData(strDate1, strDate2); + if (result == null || result.Count == 0) + { + MessageBox.Show("此时间段无数据或无此条码数据", "系统提示"); + lblSelectStures.BeginInvoke(new PDelegate(bb)); + return; + } + this.dgvData.BeginInvoke(new myDelegate(FillData), new object[] { result });//异步调用(来填充) + lblSelectStures.BeginInvoke(new PDelegate(bb)); + } + + private void FillData(List dt ) + { + this.dgvData.DataSource = dt; + } + + private void aa() + { + this.lblSelectStures.Text = "正在查询数据..."; + } + private void bb() + { + this.lblSelectStures.Text = "查询结束"; + } + } +} diff --git a/JY.Inspection/Frm/FrmAlamQuery.designer.cs b/JY.Inspection/Frm/FrmAlamQuery.designer.cs new file mode 100644 index 0000000..6ed442f --- /dev/null +++ b/JY.Inspection/Frm/FrmAlamQuery.designer.cs @@ -0,0 +1,319 @@ +namespace JY.Inspection.Frm +{ + partial class FrmAlamQuery + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmAlamQuery)); + this.btnSelect = new MetroFramework.Controls.MetroButton(); + this.metroLabel2 = new MetroFramework.Controls.MetroLabel(); + this.metroLabel1 = new MetroFramework.Controls.MetroLabel(); + this.lblSelectStures = new System.Windows.Forms.Label(); + this.dtEndTime = new System.Windows.Forms.DateTimePicker(); + this.dtStartTime = new System.Windows.Forms.DateTimePicker(); + this.dgvData = new MetroFramework.Controls.MetroGrid(); + this.AlarmType = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.AlarmGuid = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.PLCAdress = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.AlarmContent = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.AlarmCode = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.AlarmDesc = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.AlarmState = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.AlarmTime = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.BurningTime = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Flag = new System.Windows.Forms.DataGridViewTextBoxColumn(); + ((System.ComponentModel.ISupportInitialize)(this.dgvData)).BeginInit(); + this.SuspendLayout(); + // + // btnSelect + // + this.btnSelect.Location = new System.Drawing.Point(984, 38); + this.btnSelect.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnSelect.Name = "btnSelect"; + this.btnSelect.Size = new System.Drawing.Size(100, 29); + this.btnSelect.TabIndex = 12; + this.btnSelect.Text = "查询"; + this.btnSelect.UseSelectable = true; + this.btnSelect.Click += new System.EventHandler(this.btnSelect_Click); + // + // metroLabel2 + // + this.metroLabel2.AutoSize = true; + this.metroLabel2.Location = new System.Drawing.Point(688, 40); + this.metroLabel2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.metroLabel2.Name = "metroLabel2"; + this.metroLabel2.Size = new System.Drawing.Size(19, 20); + this.metroLabel2.TabIndex = 11; + this.metroLabel2.Text = "~"; + // + // metroLabel1 + // + this.metroLabel1.AutoSize = true; + this.metroLabel1.Location = new System.Drawing.Point(353, 40); + this.metroLabel1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.metroLabel1.Name = "metroLabel1"; + this.metroLabel1.Size = new System.Drawing.Size(84, 20); + this.metroLabel1.TabIndex = 10; + this.metroLabel1.Text = "查询时间:"; + // + // lblSelectStures + // + this.lblSelectStures.AutoSize = true; + this.lblSelectStures.Location = new System.Drawing.Point(1271, 40); + this.lblSelectStures.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblSelectStures.Name = "lblSelectStures"; + this.lblSelectStures.Size = new System.Drawing.Size(0, 15); + this.lblSelectStures.TabIndex = 14; + // + // dtEndTime + // + this.dtEndTime.CustomFormat = "yyyy-MM-dd HH:mm:ss"; + this.dtEndTime.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.dtEndTime.Format = System.Windows.Forms.DateTimePickerFormat.Custom; + this.dtEndTime.Location = new System.Drawing.Point(720, 36); + this.dtEndTime.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.dtEndTime.Name = "dtEndTime"; + this.dtEndTime.Size = new System.Drawing.Size(233, 31); + this.dtEndTime.TabIndex = 19; + // + // dtStartTime + // + this.dtStartTime.CalendarForeColor = System.Drawing.SystemColors.ControlLight; + this.dtStartTime.CustomFormat = "yyyy-MM-dd HH:mm:ss"; + this.dtStartTime.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.dtStartTime.Format = System.Windows.Forms.DateTimePickerFormat.Custom; + this.dtStartTime.Location = new System.Drawing.Point(448, 36); + this.dtStartTime.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.dtStartTime.Name = "dtStartTime"; + this.dtStartTime.Size = new System.Drawing.Size(233, 31); + this.dtStartTime.TabIndex = 18; + // + // dgvData + // + this.dgvData.AllowUserToAddRows = false; + this.dgvData.AllowUserToDeleteRows = false; + this.dgvData.AllowUserToResizeRows = false; + this.dgvData.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dgvData.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells; + this.dgvData.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.dgvData.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dgvData.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.None; + this.dgvData.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle1.BackColor = System.Drawing.Color.SkyBlue; + dataGridViewCellStyle1.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + dataGridViewCellStyle1.ForeColor = System.Drawing.Color.Black; + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(198)))), ((int)(((byte)(247))))); + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvData.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + this.dgvData.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dgvData.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.AlarmType, + this.AlarmGuid, + this.PLCAdress, + this.AlarmContent, + this.AlarmCode, + this.AlarmDesc, + this.AlarmState, + this.AlarmTime, + this.BurningTime, + this.Flag}); + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + dataGridViewCellStyle2.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + dataGridViewCellStyle2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(136)))), ((int)(((byte)(136)))), ((int)(((byte)(136))))); + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.Color.Silver; + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.Color.Black; + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvData.DefaultCellStyle = dataGridViewCellStyle2; + this.dgvData.EnableHeadersVisualStyles = false; + this.dgvData.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + this.dgvData.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.dgvData.Location = new System.Drawing.Point(7, 75); + this.dgvData.Margin = new System.Windows.Forms.Padding(4); + this.dgvData.Name = "dgvData"; + this.dgvData.ReadOnly = true; + this.dgvData.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None; + dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle3.BackColor = System.Drawing.Color.White; + dataGridViewCellStyle3.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + dataGridViewCellStyle3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + dataGridViewCellStyle3.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(198)))), ((int)(((byte)(247))))); + dataGridViewCellStyle3.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvData.RowHeadersDefaultCellStyle = dataGridViewCellStyle3; + this.dgvData.RowHeadersWidth = 51; + this.dgvData.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; + this.dgvData.RowTemplate.Height = 23; + this.dgvData.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgvData.Size = new System.Drawing.Size(1479, 808); + this.dgvData.TabIndex = 20; + // + // AlarmType + // + this.AlarmType.DataPropertyName = "AlarmType"; + this.AlarmType.HeaderText = "报警类型"; + this.AlarmType.MinimumWidth = 6; + this.AlarmType.Name = "AlarmType"; + this.AlarmType.ReadOnly = true; + this.AlarmType.Width = 86; + // + // AlarmGuid + // + this.AlarmGuid.DataPropertyName = "AlarmGuid"; + this.AlarmGuid.HeaderText = "报警GUID"; + this.AlarmGuid.MinimumWidth = 6; + this.AlarmGuid.Name = "AlarmGuid"; + this.AlarmGuid.ReadOnly = true; + this.AlarmGuid.Width = 87; + // + // PLCAdress + // + this.PLCAdress.DataPropertyName = "PLCAdress"; + this.PLCAdress.HeaderText = "PLC报警地址"; + this.PLCAdress.MinimumWidth = 6; + this.PLCAdress.Name = "PLCAdress"; + this.PLCAdress.ReadOnly = true; + this.PLCAdress.Width = 107; + // + // AlarmContent + // + this.AlarmContent.DataPropertyName = "AlarmContent"; + this.AlarmContent.HeaderText = "报警内容"; + this.AlarmContent.MinimumWidth = 6; + this.AlarmContent.Name = "AlarmContent"; + this.AlarmContent.ReadOnly = true; + this.AlarmContent.Width = 86; + // + // AlarmCode + // + this.AlarmCode.DataPropertyName = "AlarmCode"; + this.AlarmCode.HeaderText = "报警代码"; + this.AlarmCode.MinimumWidth = 6; + this.AlarmCode.Name = "AlarmCode"; + this.AlarmCode.ReadOnly = true; + this.AlarmCode.Width = 86; + // + // AlarmDesc + // + this.AlarmDesc.DataPropertyName = "AlarmDesc"; + this.AlarmDesc.HeaderText = "报警说明"; + this.AlarmDesc.MinimumWidth = 6; + this.AlarmDesc.Name = "AlarmDesc"; + this.AlarmDesc.ReadOnly = true; + this.AlarmDesc.Visible = false; + this.AlarmDesc.Width = 82; + // + // AlarmState + // + this.AlarmState.DataPropertyName = "AlarmState"; + this.AlarmState.HeaderText = "报警状态"; + this.AlarmState.MinimumWidth = 6; + this.AlarmState.Name = "AlarmState"; + this.AlarmState.ReadOnly = true; + this.AlarmState.Visible = false; + this.AlarmState.Width = 82; + // + // AlarmTime + // + this.AlarmTime.DataPropertyName = "StartTime"; + this.AlarmTime.HeaderText = "报警开始时间"; + this.AlarmTime.MinimumWidth = 6; + this.AlarmTime.Name = "AlarmTime"; + this.AlarmTime.ReadOnly = true; + this.AlarmTime.Width = 112; + // + // BurningTime + // + this.BurningTime.DataPropertyName = "EndTime"; + this.BurningTime.HeaderText = "报警结束时间"; + this.BurningTime.MinimumWidth = 6; + this.BurningTime.Name = "BurningTime"; + this.BurningTime.ReadOnly = true; + this.BurningTime.Width = 112; + // + // Flag + // + this.Flag.DataPropertyName = "Flag"; + this.Flag.HeaderText = "更新状态"; + this.Flag.MinimumWidth = 6; + this.Flag.Name = "Flag"; + this.Flag.ReadOnly = true; + this.Flag.Visible = false; + this.Flag.Width = 64; + // + // FrmAlamQuery + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1492, 925); + this.Controls.Add(this.dgvData); + this.Controls.Add(this.dtEndTime); + this.Controls.Add(this.dtStartTime); + this.Controls.Add(this.lblSelectStures); + this.Controls.Add(this.btnSelect); + this.Controls.Add(this.metroLabel2); + this.Controls.Add(this.metroLabel1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.Name = "FrmAlamQuery"; + this.Padding = new System.Windows.Forms.Padding(27, 75, 27, 25); + this.Text = "历史报警信息查询"; + this.Load += new System.EventHandler(this.FrmAlamQuery_Load); + ((System.ComponentModel.ISupportInitialize)(this.dgvData)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private MetroFramework.Controls.MetroButton btnSelect; + private MetroFramework.Controls.MetroLabel metroLabel2; + private MetroFramework.Controls.MetroLabel metroLabel1; + private System.Windows.Forms.Label lblSelectStures; + private System.Windows.Forms.DateTimePicker dtEndTime; + private System.Windows.Forms.DateTimePicker dtStartTime; + private MetroFramework.Controls.MetroGrid dgvData; + private System.Windows.Forms.DataGridViewTextBoxColumn AlarmType; + private System.Windows.Forms.DataGridViewTextBoxColumn AlarmGuid; + private System.Windows.Forms.DataGridViewTextBoxColumn PLCAdress; + private System.Windows.Forms.DataGridViewTextBoxColumn AlarmContent; + private System.Windows.Forms.DataGridViewTextBoxColumn AlarmCode; + private System.Windows.Forms.DataGridViewTextBoxColumn AlarmDesc; + private System.Windows.Forms.DataGridViewTextBoxColumn AlarmState; + private System.Windows.Forms.DataGridViewTextBoxColumn AlarmTime; + private System.Windows.Forms.DataGridViewTextBoxColumn BurningTime; + private System.Windows.Forms.DataGridViewTextBoxColumn Flag; + } +} \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmAlamQuery.resx b/JY.Inspection/Frm/FrmAlamQuery.resx new file mode 100644 index 0000000..4dff0fd --- /dev/null +++ b/JY.Inspection/Frm/FrmAlamQuery.resx @@ -0,0 +1,227 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + + + AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlN + UABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAWU1QAFpNUABZTVASWU1QH1lNUB9ZTVAfWU1QH1lN + UB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUBJaTVAAWU1QAFlN + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXE5OAFlNUABZTVAFWU1QaFlLUM1YS0/gWEtQ4FhL + UOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS0/gWUtQzVlN + UGhZTVAFWU1QAFxOTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWS1EAWU1QAFlNUE5ZTlD0YGxY/2eH + Xv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eH + Xv9gbFj/WU5Q9FlNUE5ZTVAAVktRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhNUABaTVAAWUtQkl1c + VP9xtWn/dchu/3TIbf90yG3/dMht/3TIbf90yG3/dMht/3THbf91yG7/dMht/3TIbf90yG3/dMht/3TI + bf90yG3/dchu/3G1af9dXFT/WUtQklpNUABYTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNH + UAFYS0+fX2RW/3K+a/9zxm3/c8Vs/3PFbP9zxWz/c8Vs/3PFbP90xm3/b7Fo/3G6av90xm3/c8Vs/3PF + bf90xm3/dMZt/3TGbf90xm3/c79s/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYTFAAU0dQAVhKT59gZVf/fsp1/4HVd/+B1Hf/gdR3/4HUd/+B1Hf/gdR3/4HWd/9tnWX/Z4lf/3/S + dv+B1Hf/fdF1/3fJb/90xm3/dMZt/3TGbf9zvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+T4Yb/mfCL/5nvi/+Z74v/me+L/5nvi/+Z74v/lu2J/3Cg + aP9cV1L/gr92/5nwi/+Y7or/keaF/3/Sdv90xm3/dMZt/3O+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nvi/+Z74v/me+L/5nv + i/+T6ob/bp5l/09ZYv9ieGL/keCD/5rwjP+a8Iv/leuI/3zPdP90xm3/c75r/19kVv9YS0+fU0dQAVhM + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nwi/+Z74v/me+L/5nv + i/+Z74v/mvCM/4/lg/9tmmH/OXuO/zp6jf92nmn/mO6K/5nvi/+a8Iz/jOCA/3XHbf9zvmv/X2RW/1hL + T59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+U4ob/mfCL/5nv + i/+Z74v/me+L/5nvi/+U64f/gtl5/2yYX/82gJT/ELXe/1Nsaf+HyXn/mvGM/5nvi/+T6Ib/d8pw/3K+ + a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Ti + hv+Z8Iv/me+L/5nvi/+T6ob/hdZ6/3W0av9pj17/XGtb/y+Ko/8Az///J5Ox/2iAYf+T5Yb/mvCM/5Tq + h/95y3H/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhK + T59kaFr/lOKG/5nwi/+Z8Iv/idZ9/22aZf9ed1//SnB0/zCHoP8Xq9D/Bcb0/wDP//8Fx/b/P3aE/3uq + bv+Z8Iv/leqH/3nMcf9yvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhM + UABTR1ABWEpPn2RoWv+U4ob/mfCL/5rxjP+Kzn3/WWJe/yGau/8GxPL/AM///wDR//8Az///BMf3/w63 + 4v8wgpz/X2VY/4zVf/+V64j/ecxx/3K+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5jtiv9wjmj/JZWz/wDQ//8Azv//FLHX/zCI + oP9GdX7/XHZp/26MaP9+r3L/kd+E/5XriP95zHH/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nwi/+Z74v/mvGM/4vKe/9McnX/CMHv/wLL + +/9AdoP/dpRk/4vJe/+T4YX/mO6K/5rxjP+a8Iz/lOqH/3nMcf9yvmv/X2RW/1hLT59TR1ABWExQAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+U4ob/mfCL/5nvi/+Z74v/mOyK/2+K + Z/8jmLn/CMDt/1Nzbv+Q2oH/m/OM/5nwi/+Z74v/me+L/5nvi/+V6of/ecxx/3K+a/9fZFb/WEtPn1NH + UAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nv + i/+a8Yz/isZ6/0h1fP8cocX/ZoBo/5fpiP+Z74v/me+L/5nvi/+Z74v/me+L/5Xqh/95zHH/cr5r/19k + Vv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nw + i/+Z74v/me+L/5nvi/+Y64n/bIlq/0Nmdv91mW3/mvCL/5nvi/+Z74v/me+L/5nvi/+Z74v/leqH/3nM + cf9yvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2Ro + Wv+U4ob/mfCL/5nvi/+Z74v/me+L/5rxjP+Iwnv/XVZT/4K2dv+a8oz/me+L/5nvi/+Z74v/me+L/5nv + i/+V6of/ecxx/3K+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNH + UAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nvi/+Z74v/me+L/5fpif9yi2f/jM9//5rxjP+Z74v/me+L/5nv + i/+Z74v/me+L/5Xqh/95zHH/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYTFAAUkdQAFhKT55kaFr/leSH/5ryjP+a8Yz/mvGM/5rxjP+a8Yz/mvKM/5DYg/+W6Ij/mvKM/5rx + jP+a8Yz/mvGM/5rxjP+a8oz/leyI/3nNcf9zwGz/X2RW/1hKT55SR1AAWExQAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhMUABXSVABWEtPoWFhV/+FvHj/icd8/4nGfP+Jxnz/icZ8/4nGfP+Jxnz/icd8/4nH + fP+Jxnz/icZ8/4nGfP+Jxnz/icZ8/4nHfP+Gw3n/caxp/2yiZP9dXlT/WUtQoVdJUAFYTFAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWUxQAFlLUAJZTVCnWk5R/1xTU/9cU1L/XFNS/1xTUv9cU1L/XFNS/1xT + Uv9cU1L/XFNS/1xTUv9cU1L/XFNS/1xTUv9cU1L/XFNS/1tTUv9aUlH/WlJR/1lOUP9ZTVCnWUtQAllM + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAW05QAFlMUJldUlT/gYF8/42Qif+MkIj/jJCI/4yQ + iP+MkIj/jJCI/4yQiP+MkIj/jJCI/4yQiP+MkIj/jJCI/4yQiP+MkIj/jJCI/42Qif+BgXz/XVJU/1lM + UJlbTlEAWU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFtGTQBZTVAAWU1QVFpOUfdtZ2b/fn15/35+ + ef9+fnn/fn55/39+ef9+fnn/fn55/35+ef9+fnn/fn55/35+ef9/fnn/fn55/35+ef9+fnn/fn15/21n + Zv9aTlH3WU1QVFlNUABbRk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVlNTAFlNUABZTVAHWU1Qb1hM + T9JXS07lV0tO5FdLTuVYS074WExP/1pOUf9aTlH/Wk5R/1pOUf9aTlH/Wk5R/1hMT/9YS074V0tO5VdL + TuRXS07lWExP0llNUG9ZTVAGWU1QAFZTUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWU1QAFlN + UABbTk8AWU1QFllNUCNZTVAjWU1QKVhMT8JiV1n/fHN2/311d/99dXf/fXV3/311d/98dHb/Ylda/1hM + T8JZTVApWU1QI1lNUCNZTVAVXE5QAFlNUABZTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAWU1QAFlNUABZTVAAWU1QAFlNUABWSlAAWExPpV5TVv9yaGr/c2ps/3NqbP9zamz/c2ps/3Jo + av9eU1b/WExPpVZKUQFZTVAAWU1QAFlNUABYTVAAWU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVklRAFlNUABZTVA7WU1QwlhMT+BYTE/gWExP4FhM + T+BYTE/gWExP4FlNUMJZTVA7WU1QAFZKUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFEAWE1QAFlNUABZTVAPWU1QH1lN + UB9ZTVAfWU1QH1lNUB9ZTVAfWU1QD1lNUABYTFEAWExRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAWE1QAFlN + UABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA+AAAH/AAAA/gAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH8AAAD/gAAB//gAH//4AB///AA/8= + + + \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmAlert.Designer.cs b/JY.Inspection/Frm/FrmAlert.Designer.cs new file mode 100644 index 0000000..993d169 --- /dev/null +++ b/JY.Inspection/Frm/FrmAlert.Designer.cs @@ -0,0 +1,101 @@ + +namespace JY.Inspection +{ + partial class FrmAlert + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.lblMsg = new System.Windows.Forms.Label(); + this.pictureBox2 = new System.Windows.Forms.PictureBox(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + + // + // lblMsg + // + this.lblMsg.AutoSize = true; + this.lblMsg.Font = new System.Drawing.Font("黑体", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblMsg.ForeColor = System.Drawing.Color.White; + this.lblMsg.Location = new System.Drawing.Point(79, 37); + this.lblMsg.Name = "lblMsg"; + this.lblMsg.Size = new System.Drawing.Size(91, 14); + this.lblMsg.TabIndex = 2; + this.lblMsg.Text = "Message Text"; + // + // pictureBox2 + // + this.pictureBox2.Image = global::JY.Inspection.Properties.Resources.白色X32; + this.pictureBox2.Location = new System.Drawing.Point(276, -1); + this.pictureBox2.Name = "pictureBox2"; + this.pictureBox2.Size = new System.Drawing.Size(33, 32); + this.pictureBox2.TabIndex = 1; + this.pictureBox2.TabStop = false; + // + // pictureBox1 + // + this.pictureBox1.Image = global::JY.Inspection.Properties.Resources.warning; + this.pictureBox1.Location = new System.Drawing.Point(12, 28); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(32, 32); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + // + // FrmAlert + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(120)))), ((int)(((byte)(215))))); + this.ClientSize = new System.Drawing.Size(310, 89); + this.Controls.Add(this.lblMsg); + this.Controls.Add(this.pictureBox2); + this.Controls.Add(this.pictureBox1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "FrmAlert"; + this.ShowIcon = false; + this.Text = "信息提示"; + this.TopMost = true; + + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Timer timer1; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.PictureBox pictureBox2; + private System.Windows.Forms.Label lblMsg; + } +} \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmAlert.cs b/JY.Inspection/Frm/FrmAlert.cs new file mode 100644 index 0000000..b741f64 --- /dev/null +++ b/JY.Inspection/Frm/FrmAlert.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace JY.Inspection +{ + public partial class FrmAlert : Form + { + + public FrmAlert() + { + InitializeComponent(); + } + + + private FrmAlert.enmAction action; //当前窗体状态变量 + private int x, y; //显示的坐标变量 + //定义窗体状态枚举 + private enum enmAction + { + wait, + start, + close + } + //定义弹窗类型枚举 + public enum enmType + { + Success, + Warning, + Error, + Info + } + //外部访问该函数实现窗体的实现 传入显示信息,弹窗类型 + public void ShowAlert(string msg, enmType type) + { + this.Opacity = 0.0; + this.StartPosition = FormStartPosition.Manual; + string fname; + + for (int i = 1; i < 10; i++) + { + fname = "alert" + i.ToString(); + FrmAlert frm = (FrmAlert)Application.OpenForms[fname]; + + if (frm == null) + { + this.Name = fname; + this.x = Screen.PrimaryScreen.WorkingArea.Width - this.Width + 15; + this.y = Screen.PrimaryScreen.WorkingArea.Height - this.Height * i - 5 * i; + this.Location = new Point(this.x, this.y); + + break; + + } + + } + this.x = Screen.PrimaryScreen.WorkingArea.Width - this.Width - 5; + + switch (type) + { + case enmType.Success: + this.pictureBox1.Image = JY.Inspection.Properties.Resources.success; + this.BackColor = Color.SeaGreen; + break; + case enmType.Error: + this.pictureBox1.Image = JY.Inspection.Properties.Resources.error; + this.BackColor = Color.DarkRed; + break; + case enmType.Info: + this.pictureBox1.Image = JY.Inspection.Properties.Resources.info; + this.BackColor = Color.RoyalBlue; + break; + case enmType.Warning: + this.pictureBox1.Image = JY.Inspection.Properties.Resources.warning; + this.BackColor = Color.DarkOrange; + break; + } + + + this.lblMsg.Text = msg; + + this.Show(); + //this.action = enmAction.start; + this.timer1.Interval = 2000; + this.timer1.Start(); + } + + + + + + //关闭窗体调用 + public void ShowClose() + { + timer1.Interval = 1; + action = enmAction.close; + } + + + } +} diff --git a/JY.Inspection/Frm/FrmAlert.resx b/JY.Inspection/Frm/FrmAlert.resx new file mode 100644 index 0000000..1f666f2 --- /dev/null +++ b/JY.Inspection/Frm/FrmAlert.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmCCDQuery.cs b/JY.Inspection/Frm/FrmCCDQuery.cs new file mode 100644 index 0000000..c8121fe --- /dev/null +++ b/JY.Inspection/Frm/FrmCCDQuery.cs @@ -0,0 +1,153 @@ +using JY.DAL; +using JY.Model; +using JY.Utility; +using MetroFramework.Forms; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace JY.Inspection.Frm +{ + public partial class FrmCCDQuery : MetroForm + { + public delegate void myDelegate(DataTable dt); + public delegate void PDelegate(); + Thread tSo; + string strWorkerNum; + private string selectDate = ""; + private DataTable dataTable = null; + /// + /// 数据库访问接口 + /// + private IDbHelper dbHelper = new OpSqlDataBase(); + public FrmCCDQuery() + { + InitializeComponent(); + + } + + private void FrmAlamQuery_Load(object sender, EventArgs e) + { + dtStartTime.Value = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 08:00")); + dtEndTime.Value = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59")); + } + /// + /// 查询报警日志 + /// + /// + /// + private void btnSelect_Click(object sender, EventArgs e) + { + + + //if (txtOrderNum.Text == "") + //{ + // MessageBox.Show("工单号未输入","系统提示"); + // return; + //} + + strWorkerNum = txtOrderNum.Text.Trim(); + try + { + tSo = new Thread(new ThreadStart(ThreadWork)); + tSo.IsBackground = true; + tSo.Start(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message.ToString() + ",数据查询失败", "查询提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + } + + + private void ThreadWork() + { + lblSelectStures.BeginInvoke(new PDelegate(aa)); + string strDate1 = dtStartTime.Value.ToString("yyyy-MM-dd ") + "00:00:01"; + string strDate2 = dtEndTime.Value.ToString("yyyy-MM-dd ") + "23:59:59"; + selectDate = dtStartTime.Value.ToString("yyyy-MM-dd "); + + if (dtEndTime.Value.Year != dtStartTime.Value.Year) + { + MessageBox.Show("请选择日期必须在同一年份内!"); + lblSelectStures.BeginInvoke(new PDelegate(bb)); + return; + } + + var result = dbHelper.GetCCDData(strWorkerNum, selectDate, selectDate); + if (result == null) + { + MessageBox.Show("此时间段无数据或无此条码数据", "系统提示"); + lblSelectStures.BeginInvoke(new PDelegate(bb)); + return; + } + this.dgvData.BeginInvoke(new myDelegate(FillData), new object[] { result });//异步调用(来填充) + lblSelectStures.BeginInvoke(new PDelegate(bb)); + } + + private void FillData(DataTable dt) + { + dataTable = dt; + this.dgvData.DataSource = dt.DefaultView; + } + + private void aa() + { + this.lblSelectStures.Text = "正在查询数据..."; + } + private void bb() + { + this.lblSelectStures.Text = "查询结束"; + } + + /// + /// 导出数据 + /// + /// + /// + private void btnExcel_Click(object sender, EventArgs e) + { + try + { + string strErr = ""; + DataTable dt = dataTable; + int b = OpenOfficeXML.ExportExcel(dt, selectDate, ref strErr); + switch (b) + { + case 0: + MessageBox.Show(strErr, "系统错误"); + break; + case 1: + MessageBox.Show(strErr, "系统错误"); + break; + case 2: + MessageBox.Show(strErr, "系统错误"); + break; + case 3: + MessageBox.Show(strErr, "系统错误"); + break; + case 4: + if (MessageBox.Show("导出成功,是否打开文件?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes) + { + System.Diagnostics.Process.Start(strErr); + } + break; + } + } + catch (Exception) + { + + throw; + } + + } + } +} diff --git a/JY.Inspection/Frm/FrmCCDQuery.designer.cs b/JY.Inspection/Frm/FrmCCDQuery.designer.cs new file mode 100644 index 0000000..d0176ae --- /dev/null +++ b/JY.Inspection/Frm/FrmCCDQuery.designer.cs @@ -0,0 +1,272 @@ +namespace JY.Inspection.Frm +{ + partial class FrmCCDQuery + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmCCDQuery)); + this.btnSelect = new MetroFramework.Controls.MetroButton(); + this.metroLabel2 = new MetroFramework.Controls.MetroLabel(); + this.metroLabel1 = new MetroFramework.Controls.MetroLabel(); + this.dtEndTime = new MetroFramework.Controls.MetroDateTime(); + this.dtStartTime = new MetroFramework.Controls.MetroDateTime(); + this.lblSelectStures = new System.Windows.Forms.Label(); + this.dgvData = new MetroFramework.Controls.MetroGrid(); + this.txtOrderNum = new MetroFramework.Controls.MetroTextBox(); + this.metroLabel8 = new MetroFramework.Controls.MetroLabel(); + this.btnExcel = new MetroFramework.Controls.MetroButton(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + ((System.ComponentModel.ISupportInitialize)(this.dgvData)).BeginInit(); + this.tableLayoutPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // btnSelect + // + this.btnSelect.Location = new System.Drawing.Point(578, 26); + this.btnSelect.Name = "btnSelect"; + this.btnSelect.Size = new System.Drawing.Size(75, 23); + this.btnSelect.TabIndex = 12; + this.btnSelect.Text = "查询"; + this.btnSelect.UseSelectable = true; + this.btnSelect.Click += new System.EventHandler(this.btnSelect_Click); + // + // metroLabel2 + // + this.metroLabel2.AutoSize = true; + this.metroLabel2.Location = new System.Drawing.Point(1062, 31); + this.metroLabel2.Name = "metroLabel2"; + this.metroLabel2.Size = new System.Drawing.Size(18, 19); + this.metroLabel2.TabIndex = 11; + this.metroLabel2.Text = "~"; + this.metroLabel2.Visible = false; + // + // metroLabel1 + // + this.metroLabel1.AutoSize = true; + this.metroLabel1.Location = new System.Drawing.Point(928, 37); + this.metroLabel1.Name = "metroLabel1"; + this.metroLabel1.Size = new System.Drawing.Size(79, 19); + this.metroLabel1.TabIndex = 10; + this.metroLabel1.Text = "查询时间:"; + this.metroLabel1.Visible = false; + // + // dtEndTime + // + this.dtEndTime.CustomFormat = "yyyy-MM-dd"; + this.dtEndTime.Format = System.Windows.Forms.DateTimePickerFormat.Custom; + this.dtEndTime.Location = new System.Drawing.Point(1086, 26); + this.dtEndTime.MinimumSize = new System.Drawing.Size(4, 29); + this.dtEndTime.Name = "dtEndTime"; + this.dtEndTime.Size = new System.Drawing.Size(106, 29); + this.dtEndTime.TabIndex = 9; + this.dtEndTime.Value = new System.DateTime(2022, 3, 5, 0, 0, 0, 0); + this.dtEndTime.Visible = false; + // + // dtStartTime + // + this.dtStartTime.CustomFormat = "yyyy-MM-dd"; + this.dtStartTime.Format = System.Windows.Forms.DateTimePickerFormat.Custom; + this.dtStartTime.Location = new System.Drawing.Point(1008, 32); + this.dtStartTime.MinimumSize = new System.Drawing.Size(4, 29); + this.dtStartTime.Name = "dtStartTime"; + this.dtStartTime.Size = new System.Drawing.Size(104, 29); + this.dtStartTime.TabIndex = 8; + this.dtStartTime.Value = new System.DateTime(2022, 3, 5, 0, 0, 0, 0); + this.dtStartTime.Visible = false; + // + // lblSelectStures + // + this.lblSelectStures.AutoSize = true; + this.lblSelectStures.Location = new System.Drawing.Point(833, 32); + this.lblSelectStures.Name = "lblSelectStures"; + this.lblSelectStures.Size = new System.Drawing.Size(0, 12); + this.lblSelectStures.TabIndex = 14; + // + // dgvData + // + this.dgvData.AllowUserToAddRows = false; + this.dgvData.AllowUserToDeleteRows = false; + this.dgvData.AllowUserToResizeRows = false; + this.dgvData.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.dgvData.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dgvData.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.None; + this.dgvData.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle1.BackColor = System.Drawing.Color.Gold; + dataGridViewCellStyle1.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + dataGridViewCellStyle1.ForeColor = System.Drawing.Color.Black; + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(198)))), ((int)(((byte)(247))))); + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvData.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + this.dgvData.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + dataGridViewCellStyle2.Font = new System.Drawing.Font("微软雅黑", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + dataGridViewCellStyle2.ForeColor = System.Drawing.Color.Black; + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(198)))), ((int)(((byte)(247))))); + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvData.DefaultCellStyle = dataGridViewCellStyle2; + this.dgvData.Dock = System.Windows.Forms.DockStyle.Fill; + this.dgvData.EnableHeadersVisualStyles = false; + this.dgvData.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + this.dgvData.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.dgvData.Location = new System.Drawing.Point(3, 3); + this.dgvData.Name = "dgvData"; + this.dgvData.ReadOnly = true; + this.dgvData.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None; + dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle3.BackColor = System.Drawing.Color.White; + dataGridViewCellStyle3.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + dataGridViewCellStyle3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + dataGridViewCellStyle3.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(198)))), ((int)(((byte)(247))))); + dataGridViewCellStyle3.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvData.RowHeadersDefaultCellStyle = dataGridViewCellStyle3; + this.dgvData.RowHeadersVisible = false; + this.dgvData.RowHeadersWidth = 51; + this.dgvData.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; + this.dgvData.RowTemplate.Height = 23; + this.dgvData.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgvData.Size = new System.Drawing.Size(1371, 174); + this.dgvData.TabIndex = 15; + // + // txtOrderNum + // + // + // + // + this.txtOrderNum.CustomButton.Image = null; + this.txtOrderNum.CustomButton.Location = new System.Drawing.Point(130, 1); + this.txtOrderNum.CustomButton.Name = ""; + this.txtOrderNum.CustomButton.Size = new System.Drawing.Size(21, 21); + this.txtOrderNum.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.txtOrderNum.CustomButton.TabIndex = 1; + this.txtOrderNum.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.txtOrderNum.CustomButton.UseSelectable = true; + this.txtOrderNum.CustomButton.Visible = false; + this.txtOrderNum.FontSize = MetroFramework.MetroTextBoxSize.Medium; + this.txtOrderNum.Lines = new string[0]; + this.txtOrderNum.Location = new System.Drawing.Point(378, 29); + this.txtOrderNum.MaxLength = 32767; + this.txtOrderNum.Name = "txtOrderNum"; + this.txtOrderNum.PasswordChar = '\0'; + this.txtOrderNum.PromptText = "输入要查询的工单"; + this.txtOrderNum.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.txtOrderNum.SelectedText = ""; + this.txtOrderNum.SelectionLength = 0; + this.txtOrderNum.SelectionStart = 0; + this.txtOrderNum.ShortcutsEnabled = true; + this.txtOrderNum.Size = new System.Drawing.Size(152, 23); + this.txtOrderNum.TabIndex = 16; + this.txtOrderNum.UseSelectable = true; + this.txtOrderNum.WaterMark = "输入要查询的工单"; + this.txtOrderNum.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.txtOrderNum.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // metroLabel8 + // + this.metroLabel8.AutoSize = true; + this.metroLabel8.Location = new System.Drawing.Point(331, 30); + this.metroLabel8.Name = "metroLabel8"; + this.metroLabel8.Size = new System.Drawing.Size(51, 19); + this.metroLabel8.TabIndex = 17; + this.metroLabel8.Text = "工单:"; + // + // btnExcel + // + this.btnExcel.Location = new System.Drawing.Point(695, 26); + this.btnExcel.Name = "btnExcel"; + this.btnExcel.Size = new System.Drawing.Size(75, 23); + this.btnExcel.TabIndex = 18; + this.btnExcel.Text = "导出"; + this.btnExcel.UseSelectable = true; + this.btnExcel.Click += new System.EventHandler(this.btnExcel_Click); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tableLayoutPanel1.ColumnCount = 1; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.Controls.Add(this.dgvData, 0, 0); + this.tableLayoutPanel1.Location = new System.Drawing.Point(4, 72); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 2; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25.45455F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 74.54546F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(1377, 708); + this.tableLayoutPanel1.TabIndex = 19; + // + // FrmCCDQuery + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1386, 788); + this.Controls.Add(this.tableLayoutPanel1); + this.Controls.Add(this.lblSelectStures); + this.Controls.Add(this.btnExcel); + this.Controls.Add(this.txtOrderNum); + this.Controls.Add(this.metroLabel8); + this.Controls.Add(this.btnSelect); + this.Controls.Add(this.metroLabel2); + this.Controls.Add(this.metroLabel1); + this.Controls.Add(this.dtEndTime); + this.Controls.Add(this.dtStartTime); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "FrmCCDQuery"; + this.Resizable = false; + this.ShadowType = MetroFramework.Forms.MetroFormShadowType.SystemShadow; + this.Text = "CCD统计数据查询"; + this.Load += new System.EventHandler(this.FrmAlamQuery_Load); + ((System.ComponentModel.ISupportInitialize)(this.dgvData)).EndInit(); + this.tableLayoutPanel1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private MetroFramework.Controls.MetroButton btnSelect; + private MetroFramework.Controls.MetroLabel metroLabel2; + private MetroFramework.Controls.MetroLabel metroLabel1; + private MetroFramework.Controls.MetroDateTime dtEndTime; + private MetroFramework.Controls.MetroDateTime dtStartTime; + private System.Windows.Forms.Label lblSelectStures; + private MetroFramework.Controls.MetroGrid dgvData; + private MetroFramework.Controls.MetroTextBox txtOrderNum; + private MetroFramework.Controls.MetroLabel metroLabel8; + private MetroFramework.Controls.MetroButton btnExcel; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + } +} \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmCCDQuery.resx b/JY.Inspection/Frm/FrmCCDQuery.resx new file mode 100644 index 0000000..acb5bb2 --- /dev/null +++ b/JY.Inspection/Frm/FrmCCDQuery.resx @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlN + UABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAWU1QAFpNUABZTVASWU1QH1lNUB9ZTVAfWU1QH1lN + UB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUBJaTVAAWU1QAFlN + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXE5OAFlNUABZTVAFWU1QaFlLUM1YS0/gWEtQ4FhL + UOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS0/gWUtQzVlN + UGhZTVAFWU1QAFxOTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWS1EAWU1QAFlNUE5ZTlD0YGxY/2eH + Xv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eH + Xv9gbFj/WU5Q9FlNUE5ZTVAAVktRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhNUABaTVAAWUtQkl1c + VP9xtWn/dchu/3TIbf90yG3/dMht/3TIbf90yG3/dMht/3THbf91yG7/dMht/3TIbf90yG3/dMht/3TI + bf90yG3/dchu/3G1af9dXFT/WUtQklpNUABYTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNH + UAFYS0+fX2RW/3K+a/9zxm3/c8Vs/3PFbP9zxWz/c8Vs/3PFbP90xm3/b7Fo/3G6av90xm3/c8Vs/3PF + bf90xm3/dMZt/3TGbf90xm3/c79s/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYTFAAU0dQAVhKT59gZVf/fsp1/4HVd/+B1Hf/gdR3/4HUd/+B1Hf/gdR3/4HWd/9tnWX/Z4lf/3/S + dv+B1Hf/fdF1/3fJb/90xm3/dMZt/3TGbf9zvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+T4Yb/mfCL/5nvi/+Z74v/me+L/5nvi/+Z74v/lu2J/3Cg + aP9cV1L/gr92/5nwi/+Y7or/keaF/3/Sdv90xm3/dMZt/3O+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nvi/+Z74v/me+L/5nv + i/+T6ob/bp5l/09ZYv9ieGL/keCD/5rwjP+a8Iv/leuI/3zPdP90xm3/c75r/19kVv9YS0+fU0dQAVhM + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nwi/+Z74v/me+L/5nv + i/+Z74v/mvCM/4/lg/9tmmH/OXuO/zp6jf92nmn/mO6K/5nvi/+a8Iz/jOCA/3XHbf9zvmv/X2RW/1hL + T59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+U4ob/mfCL/5nv + i/+Z74v/me+L/5nvi/+U64f/gtl5/2yYX/82gJT/ELXe/1Nsaf+HyXn/mvGM/5nvi/+T6Ib/d8pw/3K+ + a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Ti + hv+Z8Iv/me+L/5nvi/+T6ob/hdZ6/3W0av9pj17/XGtb/y+Ko/8Az///J5Ox/2iAYf+T5Yb/mvCM/5Tq + h/95y3H/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhK + T59kaFr/lOKG/5nwi/+Z8Iv/idZ9/22aZf9ed1//SnB0/zCHoP8Xq9D/Bcb0/wDP//8Fx/b/P3aE/3uq + bv+Z8Iv/leqH/3nMcf9yvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhM + UABTR1ABWEpPn2RoWv+U4ob/mfCL/5rxjP+Kzn3/WWJe/yGau/8GxPL/AM///wDR//8Az///BMf3/w63 + 4v8wgpz/X2VY/4zVf/+V64j/ecxx/3K+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5jtiv9wjmj/JZWz/wDQ//8Azv//FLHX/zCI + oP9GdX7/XHZp/26MaP9+r3L/kd+E/5XriP95zHH/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nwi/+Z74v/mvGM/4vKe/9McnX/CMHv/wLL + +/9AdoP/dpRk/4vJe/+T4YX/mO6K/5rxjP+a8Iz/lOqH/3nMcf9yvmv/X2RW/1hLT59TR1ABWExQAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+U4ob/mfCL/5nvi/+Z74v/mOyK/2+K + Z/8jmLn/CMDt/1Nzbv+Q2oH/m/OM/5nwi/+Z74v/me+L/5nvi/+V6of/ecxx/3K+a/9fZFb/WEtPn1NH + UAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nv + i/+a8Yz/isZ6/0h1fP8cocX/ZoBo/5fpiP+Z74v/me+L/5nvi/+Z74v/me+L/5Xqh/95zHH/cr5r/19k + Vv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nw + i/+Z74v/me+L/5nvi/+Y64n/bIlq/0Nmdv91mW3/mvCL/5nvi/+Z74v/me+L/5nvi/+Z74v/leqH/3nM + cf9yvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2Ro + Wv+U4ob/mfCL/5nvi/+Z74v/me+L/5rxjP+Iwnv/XVZT/4K2dv+a8oz/me+L/5nvi/+Z74v/me+L/5nv + i/+V6of/ecxx/3K+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNH + UAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nvi/+Z74v/me+L/5fpif9yi2f/jM9//5rxjP+Z74v/me+L/5nv + i/+Z74v/me+L/5Xqh/95zHH/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYTFAAUkdQAFhKT55kaFr/leSH/5ryjP+a8Yz/mvGM/5rxjP+a8Yz/mvKM/5DYg/+W6Ij/mvKM/5rx + jP+a8Yz/mvGM/5rxjP+a8oz/leyI/3nNcf9zwGz/X2RW/1hKT55SR1AAWExQAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhMUABXSVABWEtPoWFhV/+FvHj/icd8/4nGfP+Jxnz/icZ8/4nGfP+Jxnz/icd8/4nH + fP+Jxnz/icZ8/4nGfP+Jxnz/icZ8/4nHfP+Gw3n/caxp/2yiZP9dXlT/WUtQoVdJUAFYTFAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWUxQAFlLUAJZTVCnWk5R/1xTU/9cU1L/XFNS/1xTUv9cU1L/XFNS/1xT + Uv9cU1L/XFNS/1xTUv9cU1L/XFNS/1xTUv9cU1L/XFNS/1tTUv9aUlH/WlJR/1lOUP9ZTVCnWUtQAllM + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAW05QAFlMUJldUlT/gYF8/42Qif+MkIj/jJCI/4yQ + iP+MkIj/jJCI/4yQiP+MkIj/jJCI/4yQiP+MkIj/jJCI/4yQiP+MkIj/jJCI/42Qif+BgXz/XVJU/1lM + UJlbTlEAWU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFtGTQBZTVAAWU1QVFpOUfdtZ2b/fn15/35+ + ef9+fnn/fn55/39+ef9+fnn/fn55/35+ef9+fnn/fn55/35+ef9/fnn/fn55/35+ef9+fnn/fn15/21n + Zv9aTlH3WU1QVFlNUABbRk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVlNTAFlNUABZTVAHWU1Qb1hM + T9JXS07lV0tO5FdLTuVYS074WExP/1pOUf9aTlH/Wk5R/1pOUf9aTlH/Wk5R/1hMT/9YS074V0tO5VdL + TuRXS07lWExP0llNUG9ZTVAGWU1QAFZTUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWU1QAFlN + UABbTk8AWU1QFllNUCNZTVAjWU1QKVhMT8JiV1n/fHN2/311d/99dXf/fXV3/311d/98dHb/Ylda/1hM + T8JZTVApWU1QI1lNUCNZTVAVXE5QAFlNUABZTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAWU1QAFlNUABZTVAAWU1QAFlNUABWSlAAWExPpV5TVv9yaGr/c2ps/3NqbP9zamz/c2ps/3Jo + av9eU1b/WExPpVZKUQFZTVAAWU1QAFlNUABYTVAAWU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVklRAFlNUABZTVA7WU1QwlhMT+BYTE/gWExP4FhM + T+BYTE/gWExP4FlNUMJZTVA7WU1QAFZKUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFEAWE1QAFlNUABZTVAPWU1QH1lN + UB9ZTVAfWU1QH1lNUB9ZTVAfWU1QD1lNUABYTFEAWExRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAWE1QAFlN + UABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA+AAAH/AAAA/gAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH8AAAD/gAAB//gAH//4AB///AA/8= + + + \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmChangeModel.cs b/JY.Inspection/Frm/FrmChangeModel.cs new file mode 100644 index 0000000..61c3955 --- /dev/null +++ b/JY.Inspection/Frm/FrmChangeModel.cs @@ -0,0 +1,309 @@ +using JY.DAL; +using JY.Model; +using MetroFramework.Forms; +using PLCCommunication; +using System; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace JY.Inspection.Frm +{ + public partial class FrmChangeModel : MetroForm + { + /// + /// 数据库访问接口 + /// + private IDbHelper dbHelper = new OpSqlDataBase(); + /// + /// 定义DataGridView数据源 + /// + private BindingList blPLCConfigParaList = new BindingList(); + + private delegate void UpdateBar(int value); + private FrmOmronPLCCom MelsecPLCCom; + public string strModelType; + //bool IsNoOrg = false; + int AxisCount = 0; + + + public FrmChangeModel(FrmOmronPLCCom melsecPLCCom, string ModelType) + { + InitializeComponent(); + MelsecPLCCom = melsecPLCCom; + strModelType = ModelType; + this.dgvParaPLC.AutoGenerateColumns = false; + dgvParaPLC.DataSource = blPLCConfigParaList; + } + + private void FrmChangeModel_Load(object sender, EventArgs e) + { + progressBar1.Maximum = 100;//进度条 + progressBar1.Step = 1; + setCombOrg(); + cmbProductModel.Text = strModelType; + GetPLCConfigPara(strModelType); + } + + /// + /// 加载产品型号下拉 + /// + private void setCombOrg() + { + var list = dbHelper.GetProductModelList(); + cmbProductModel.Items.Clear(); + + cmbProductModel.DataSource = list; + cmbProductModel.DisplayMember = "ModelName"; + cmbProductModel.ValueMember = "ModelName"; + } + + /// + /// 一键保存 + /// + /// + /// + private void btnReadPLC_Click(object sender, EventArgs e) + { + try + { + if (!HomeForm.startup) + { + MessageBox.Show("请先开启监控连接PLC!"); + return; + } + if (cmbProductModel.Text == "") + { + MessageBox.Show("请先选择型号!"); + return; + } + ChangeButtonStatus(false); + string model = cmbProductModel.Text; + if (blPLCConfigParaList.Count <= 0) + { + MessageBox.Show("轴参数为空不能保存", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + else + { + AxisCount = blPLCConfigParaList.Count; + Task.Run(() => + { + ClearPos(true); + for (int i = 1; i < AxisCount; i++) + { + try + { + blPLCConfigParaList[i].PLCValue = MelsecPLCCom.lstMcUI[0].ReadIntDReg(blPLCConfigParaList[i].PLCAddress); + blPLCConfigParaList[i].UpdateData = DateTime.Now;//更新数据时间 + } + catch (Exception ex) + { + blPLCConfigParaList[i].PLCValue = 0;//没有值的话,给予0值 + blPLCConfigParaList[i].UpdateData = DateTime.Now;//更新数据时间 + } + Thread.Sleep(100); + ChangeBar(i); + } + Thread.Sleep(100); + if (this.InvokeRequired) + { + Action w = colosbar; + this.Invoke(w); + } + else + { + progressBar1.Visible = false; + metroLabel2.Text = string.Empty; + metroLabel2.Visible = false; + } + + var result = dbHelper.InsertPLCConfigParam(blPLCConfigParaList.ToList()); + MessageBox.Show("保存成功!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + ChangeButtonStatus(true); + ClearPos(false); + }); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + /// + /// 一键换型 + /// + /// + /// + private void btnChangeConfig_Click(object sender, EventArgs e) + { + if (!HomeForm.startup) + { + MessageBox.Show("请先开启监控连接PLC!"); + return; + } + if (MessageBox.Show("确定要更改" + cmbProductModel.Text + "型号吗?", "系统提示", MessageBoxButtons.OKCancel, + MessageBoxIcon.Question) != DialogResult.OK) + { + return; + } + try + { + if (blPLCConfigParaList.Count > 0) + { + ChangeButtonStatus(false); + AxisCount = blPLCConfigParaList.Count; + Task.Run(() => + { + ClearPos(true); + for (int i = 0; i < blPLCConfigParaList.Count; i++) + { + try + { + MelsecPLCCom.lstMcUI[0].WriteDReg(blPLCConfigParaList[i].PLCAddress, blPLCConfigParaList[i].PLCValue); + } + catch (Exception ex) + { + MessageBox.Show(ex.ToString()); + return; + } + Thread.Sleep(100); + ChangeBar(i); + } + Thread.Sleep(100); + if (this.InvokeRequired) + { + Action w = colosbar; + this.Invoke(w); + } + else + { + progressBar1.Visible = false; + metroLabel2.Text = string.Empty; + metroLabel2.Visible = false; + } + + }); + + //melsec.Write("R500", ProdTypeNum_All);//写回到PLC。型号序号下发到PLC。R500是跟黄晓宇工确定好的PLC地址,固定不变。 + MessageBox.Show("一键换型成功!"); + + } + else + { + MessageBox.Show("没有参数换型!"); + } + + ChangeButtonStatus(true); + ClearPos(false); + } + catch (Exception ex) + { + MessageBox.Show(ex.ToString()); + return; + } + } + + /// + /// 打开轴参数配置页面 + /// + /// + /// + private void btnConfigBaseSet_Click(object sender, EventArgs e) + { + FrmConfigBaseSet frmConfigBaseSet = new FrmConfigBaseSet(); + frmConfigBaseSet.ShowDialog(); + } + + /// + /// 选择产品机型事件 + /// + /// + /// + private void cmbProductModel_SelectedIndexChanged(object sender, EventArgs e) + { + GetPLCConfigPara(cmbProductModel.Text); + } + + /// + /// 查询当前产品型号轴参数信息 + /// + /// + private void GetPLCConfigPara(string str) + { + try + { + var list = dbHelper.GetPLCConfigPara(str); + blPLCConfigParaList = new BindingList(list); + dgvParaPLC.DataSource = blPLCConfigParaList; + } + catch (Exception ex) + { + throw ex; + } + } + + #region 进度条码设置 + public void colosbar() + { + progressBar1.Visible = false; + metroLabel2.Visible = false; + } + public void ClearPos(bool b) + { + this.Invoke(new Action(() => + { + progressBar1.Visible = b; + metroLabel2.Visible = b; + })); + } + + public void ChangeBar(int value) + { + if (progressBar1.InvokeRequired) + { + UpdateBar c = new UpdateBar(ChangeBar); + this.Invoke(c, new object[] { value }); + } + else + { + if (value < AxisCount) + { + progressBar1.Value = Convert.ToInt16(((double)value / AxisCount) * 100); + progressBar1.PerformStep(); + Thread.Sleep(100); + metroLabel2.Text = "已完成" + progressBar1.Value + "%"; + Application.DoEvents(); + } + } + } + + public void ChangeButtonStatus(bool b) + { + this.Invoke(new Action(() => + { + btnSavePLCConfig.Enabled = b; + btnChangeConfig.Enabled = b; + btnConfigBaseSet.Enabled = b; + })); + } + #endregion + + private void dgvParaPLC_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) + { + Rectangle rectangle = new Rectangle(e.RowBounds.Location.X, + e.RowBounds.Location.Y, + dgvParaPLC.RowHeadersWidth - 4, + e.RowBounds.Height); + TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(), + dgvParaPLC.RowHeadersDefaultCellStyle.Font, + rectangle, + dgvParaPLC.RowHeadersDefaultCellStyle.ForeColor=Color.Gray, + TextFormatFlags.VerticalCenter | TextFormatFlags.Right); + } + } +} diff --git a/JY.Inspection/Frm/FrmChangeModel.designer.cs b/JY.Inspection/Frm/FrmChangeModel.designer.cs new file mode 100644 index 0000000..7b6cdb4 --- /dev/null +++ b/JY.Inspection/Frm/FrmChangeModel.designer.cs @@ -0,0 +1,298 @@ + +namespace JY.Inspection.Frm +{ + partial class FrmChangeModel + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmChangeModel)); + this.dgvParaPLC = new MetroFramework.Controls.MetroGrid(); + this.cmbProductModel = new MetroFramework.Controls.MetroComboBox(); + this.metroLabel1 = new MetroFramework.Controls.MetroLabel(); + this.btnSavePLCConfig = new MetroFramework.Controls.MetroButton(); + this.btnChangeConfig = new MetroFramework.Controls.MetroButton(); + this.btnConfigBaseSet = new MetroFramework.Controls.MetroButton(); + this.progressBar1 = new System.Windows.Forms.ProgressBar(); + this.metroLabel2 = new MetroFramework.Controls.MetroLabel(); + this.序号 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.ModelName = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.PLCAddress = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.PLCValue = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.UpdateTime = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.PLCRemark = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.OrderNum = new System.Windows.Forms.DataGridViewTextBoxColumn(); + ((System.ComponentModel.ISupportInitialize)(this.dgvParaPLC)).BeginInit(); + this.SuspendLayout(); + // + // dgvParaPLC + // + this.dgvParaPLC.AllowUserToAddRows = false; + this.dgvParaPLC.AllowUserToDeleteRows = false; + this.dgvParaPLC.AllowUserToResizeRows = false; + this.dgvParaPLC.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.dgvParaPLC.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dgvParaPLC.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.None; + this.dgvParaPLC.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(174)))), ((int)(((byte)(219))))); + dataGridViewCellStyle1.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + dataGridViewCellStyle1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(198)))), ((int)(((byte)(247))))); + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvParaPLC.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + this.dgvParaPLC.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dgvParaPLC.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.序号, + this.ModelName, + this.PLCAddress, + this.PLCValue, + this.UpdateTime, + this.PLCRemark, + this.OrderNum}); + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + dataGridViewCellStyle2.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + dataGridViewCellStyle2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(136)))), ((int)(((byte)(136)))), ((int)(((byte)(136))))); + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(198)))), ((int)(((byte)(247))))); + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvParaPLC.DefaultCellStyle = dataGridViewCellStyle2; + this.dgvParaPLC.Dock = System.Windows.Forms.DockStyle.Right; + this.dgvParaPLC.EnableHeadersVisualStyles = false; + this.dgvParaPLC.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + this.dgvParaPLC.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.dgvParaPLC.Location = new System.Drawing.Point(490, 75); + this.dgvParaPLC.Margin = new System.Windows.Forms.Padding(4); + this.dgvParaPLC.Name = "dgvParaPLC"; + this.dgvParaPLC.ReadOnly = true; + this.dgvParaPLC.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None; + dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(174)))), ((int)(((byte)(219))))); + dataGridViewCellStyle3.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + dataGridViewCellStyle3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + dataGridViewCellStyle3.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(198)))), ((int)(((byte)(247))))); + dataGridViewCellStyle3.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvParaPLC.RowHeadersDefaultCellStyle = dataGridViewCellStyle3; + this.dgvParaPLC.RowHeadersVisible = false; + this.dgvParaPLC.RowHeadersWidth = 51; + this.dgvParaPLC.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; + this.dgvParaPLC.RowTemplate.Height = 23; + this.dgvParaPLC.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgvParaPLC.Size = new System.Drawing.Size(935, 814); + this.dgvParaPLC.TabIndex = 0; + this.dgvParaPLC.RowPostPaint += new System.Windows.Forms.DataGridViewRowPostPaintEventHandler(this.dgvParaPLC_RowPostPaint); + // + // cmbProductModel + // + this.cmbProductModel.FormattingEnabled = true; + this.cmbProductModel.ItemHeight = 24; + this.cmbProductModel.Location = new System.Drawing.Point(161, 118); + this.cmbProductModel.Margin = new System.Windows.Forms.Padding(4); + this.cmbProductModel.Name = "cmbProductModel"; + this.cmbProductModel.Size = new System.Drawing.Size(257, 30); + this.cmbProductModel.TabIndex = 2; + this.cmbProductModel.UseSelectable = true; + this.cmbProductModel.SelectedIndexChanged += new System.EventHandler(this.cmbProductModel_SelectedIndexChanged); + // + // metroLabel1 + // + this.metroLabel1.AutoSize = true; + this.metroLabel1.Location = new System.Drawing.Point(53, 122); + this.metroLabel1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.metroLabel1.Name = "metroLabel1"; + this.metroLabel1.Size = new System.Drawing.Size(84, 20); + this.metroLabel1.TabIndex = 3; + this.metroLabel1.Text = "电芯型号:"; + // + // btnSavePLCConfig + // + this.btnSavePLCConfig.Location = new System.Drawing.Point(51, 259); + this.btnSavePLCConfig.Margin = new System.Windows.Forms.Padding(4); + this.btnSavePLCConfig.Name = "btnSavePLCConfig"; + this.btnSavePLCConfig.Size = new System.Drawing.Size(152, 46); + this.btnSavePLCConfig.TabIndex = 4; + this.btnSavePLCConfig.Text = "一键保存"; + this.btnSavePLCConfig.UseSelectable = true; + this.btnSavePLCConfig.Click += new System.EventHandler(this.btnReadPLC_Click); + // + // btnChangeConfig + // + this.btnChangeConfig.Location = new System.Drawing.Point(252, 259); + this.btnChangeConfig.Margin = new System.Windows.Forms.Padding(4); + this.btnChangeConfig.Name = "btnChangeConfig"; + this.btnChangeConfig.Size = new System.Drawing.Size(152, 46); + this.btnChangeConfig.TabIndex = 5; + this.btnChangeConfig.Text = "一键换型"; + this.btnChangeConfig.UseSelectable = true; + this.btnChangeConfig.Click += new System.EventHandler(this.btnChangeConfig_Click); + // + // btnConfigBaseSet + // + this.btnConfigBaseSet.Location = new System.Drawing.Point(51, 352); + this.btnConfigBaseSet.Margin = new System.Windows.Forms.Padding(4); + this.btnConfigBaseSet.Name = "btnConfigBaseSet"; + this.btnConfigBaseSet.Size = new System.Drawing.Size(152, 46); + this.btnConfigBaseSet.TabIndex = 6; + this.btnConfigBaseSet.Text = "轴参数维护设置"; + this.btnConfigBaseSet.UseSelectable = true; + this.btnConfigBaseSet.Click += new System.EventHandler(this.btnConfigBaseSet_Click); + // + // progressBar1 + // + this.progressBar1.Location = new System.Drawing.Point(51, 190); + this.progressBar1.Margin = new System.Windows.Forms.Padding(4); + this.progressBar1.Name = "progressBar1"; + this.progressBar1.Size = new System.Drawing.Size(353, 29); + this.progressBar1.TabIndex = 7; + this.progressBar1.Visible = false; + // + // metroLabel2 + // + this.metroLabel2.AutoSize = true; + this.metroLabel2.Location = new System.Drawing.Point(144, 162); + this.metroLabel2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.metroLabel2.Name = "metroLabel2"; + this.metroLabel2.Size = new System.Drawing.Size(0, 0); + this.metroLabel2.TabIndex = 8; + this.metroLabel2.Visible = false; + // + // 序号 + // + this.序号.DataPropertyName = "序号"; + this.序号.HeaderText = "序号"; + this.序号.MinimumWidth = 6; + this.序号.Name = "序号"; + this.序号.ReadOnly = true; + this.序号.Width = 125; + // + // ModelName + // + this.ModelName.DataPropertyName = "ModelName"; + this.ModelName.HeaderText = "型号"; + this.ModelName.MinimumWidth = 6; + this.ModelName.Name = "ModelName"; + this.ModelName.ReadOnly = true; + this.ModelName.Width = 125; + // + // PLCAddress + // + this.PLCAddress.DataPropertyName = "PLCAddress"; + this.PLCAddress.HeaderText = "PLC地址"; + this.PLCAddress.MinimumWidth = 6; + this.PLCAddress.Name = "PLCAddress"; + this.PLCAddress.ReadOnly = true; + this.PLCAddress.Width = 125; + // + // PLCValue + // + this.PLCValue.DataPropertyName = "PLCValue"; + this.PLCValue.HeaderText = "PLC值"; + this.PLCValue.MinimumWidth = 6; + this.PLCValue.Name = "PLCValue"; + this.PLCValue.ReadOnly = true; + this.PLCValue.Width = 125; + // + // UpdateTime + // + this.UpdateTime.DataPropertyName = "UpdateTime"; + this.UpdateTime.HeaderText = "更新时间"; + this.UpdateTime.MinimumWidth = 6; + this.UpdateTime.Name = "UpdateTime"; + this.UpdateTime.ReadOnly = true; + this.UpdateTime.Width = 125; + // + // PLCRemark + // + this.PLCRemark.DataPropertyName = "PLCRemark"; + this.PLCRemark.HeaderText = "备注"; + this.PLCRemark.MinimumWidth = 6; + this.PLCRemark.Name = "PLCRemark"; + this.PLCRemark.ReadOnly = true; + this.PLCRemark.Width = 125; + // + // OrderNum + // + this.OrderNum.DataPropertyName = "OrderNum"; + this.OrderNum.HeaderText = "排序"; + this.OrderNum.MinimumWidth = 6; + this.OrderNum.Name = "OrderNum"; + this.OrderNum.ReadOnly = true; + this.OrderNum.Width = 125; + // + // FrmChangeModel + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BorderStyle = MetroFramework.Forms.MetroFormBorderStyle.FixedSingle; + this.ClientSize = new System.Drawing.Size(1452, 914); + this.Controls.Add(this.metroLabel2); + this.Controls.Add(this.progressBar1); + this.Controls.Add(this.btnConfigBaseSet); + this.Controls.Add(this.btnChangeConfig); + this.Controls.Add(this.btnSavePLCConfig); + this.Controls.Add(this.metroLabel1); + this.Controls.Add(this.cmbProductModel); + this.Controls.Add(this.dgvParaPLC); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(4); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Movable = false; + this.Name = "FrmChangeModel"; + this.Padding = new System.Windows.Forms.Padding(27, 75, 27, 25); + this.Text = "9978-"; + this.Load += new System.EventHandler(this.FrmChangeModel_Load); + ((System.ComponentModel.ISupportInitialize)(this.dgvParaPLC)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private MetroFramework.Controls.MetroGrid dgvParaPLC; + private MetroFramework.Controls.MetroComboBox cmbProductModel; + private MetroFramework.Controls.MetroLabel metroLabel1; + private MetroFramework.Controls.MetroButton btnSavePLCConfig; + private MetroFramework.Controls.MetroButton btnChangeConfig; + private MetroFramework.Controls.MetroButton btnConfigBaseSet; + private System.Windows.Forms.ProgressBar progressBar1; + private MetroFramework.Controls.MetroLabel metroLabel2; + private System.Windows.Forms.DataGridViewTextBoxColumn 序号; + private System.Windows.Forms.DataGridViewTextBoxColumn ModelName; + private System.Windows.Forms.DataGridViewTextBoxColumn PLCAddress; + private System.Windows.Forms.DataGridViewTextBoxColumn PLCValue; + private System.Windows.Forms.DataGridViewTextBoxColumn UpdateTime; + private System.Windows.Forms.DataGridViewTextBoxColumn PLCRemark; + private System.Windows.Forms.DataGridViewTextBoxColumn OrderNum; + } +} \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmChangeModel.resx b/JY.Inspection/Frm/FrmChangeModel.resx new file mode 100644 index 0000000..ec37289 --- /dev/null +++ b/JY.Inspection/Frm/FrmChangeModel.resx @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + + + AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlN + UABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAWU1QAFpNUABZTVASWU1QH1lNUB9ZTVAfWU1QH1lN + UB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUBJaTVAAWU1QAFlN + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXE5OAFlNUABZTVAFWU1QaFlLUM1YS0/gWEtQ4FhL + UOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS0/gWUtQzVlN + UGhZTVAFWU1QAFxOTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWS1EAWU1QAFlNUE5ZTlD0YGxY/2eH + Xv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eH + Xv9gbFj/WU5Q9FlNUE5ZTVAAVktRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhNUABaTVAAWUtQkl1c + VP9xtWn/dchu/3TIbf90yG3/dMht/3TIbf90yG3/dMht/3THbf91yG7/dMht/3TIbf90yG3/dMht/3TI + bf90yG3/dchu/3G1af9dXFT/WUtQklpNUABYTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNH + UAFYS0+fX2RW/3K+a/9zxm3/c8Vs/3PFbP9zxWz/c8Vs/3PFbP90xm3/b7Fo/3G6av90xm3/c8Vs/3PF + bf90xm3/dMZt/3TGbf90xm3/c79s/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYTFAAU0dQAVhKT59gZVf/fsp1/4HVd/+B1Hf/gdR3/4HUd/+B1Hf/gdR3/4HWd/9tnWX/Z4lf/3/S + dv+B1Hf/fdF1/3fJb/90xm3/dMZt/3TGbf9zvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+T4Yb/mfCL/5nvi/+Z74v/me+L/5nvi/+Z74v/lu2J/3Cg + aP9cV1L/gr92/5nwi/+Y7or/keaF/3/Sdv90xm3/dMZt/3O+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nvi/+Z74v/me+L/5nv + i/+T6ob/bp5l/09ZYv9ieGL/keCD/5rwjP+a8Iv/leuI/3zPdP90xm3/c75r/19kVv9YS0+fU0dQAVhM + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nwi/+Z74v/me+L/5nv + i/+Z74v/mvCM/4/lg/9tmmH/OXuO/zp6jf92nmn/mO6K/5nvi/+a8Iz/jOCA/3XHbf9zvmv/X2RW/1hL + T59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+U4ob/mfCL/5nv + i/+Z74v/me+L/5nvi/+U64f/gtl5/2yYX/82gJT/ELXe/1Nsaf+HyXn/mvGM/5nvi/+T6Ib/d8pw/3K+ + a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Ti + hv+Z8Iv/me+L/5nvi/+T6ob/hdZ6/3W0av9pj17/XGtb/y+Ko/8Az///J5Ox/2iAYf+T5Yb/mvCM/5Tq + h/95y3H/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhK + T59kaFr/lOKG/5nwi/+Z8Iv/idZ9/22aZf9ed1//SnB0/zCHoP8Xq9D/Bcb0/wDP//8Fx/b/P3aE/3uq + bv+Z8Iv/leqH/3nMcf9yvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhM + UABTR1ABWEpPn2RoWv+U4ob/mfCL/5rxjP+Kzn3/WWJe/yGau/8GxPL/AM///wDR//8Az///BMf3/w63 + 4v8wgpz/X2VY/4zVf/+V64j/ecxx/3K+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5jtiv9wjmj/JZWz/wDQ//8Azv//FLHX/zCI + oP9GdX7/XHZp/26MaP9+r3L/kd+E/5XriP95zHH/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nwi/+Z74v/mvGM/4vKe/9McnX/CMHv/wLL + +/9AdoP/dpRk/4vJe/+T4YX/mO6K/5rxjP+a8Iz/lOqH/3nMcf9yvmv/X2RW/1hLT59TR1ABWExQAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+U4ob/mfCL/5nvi/+Z74v/mOyK/2+K + Z/8jmLn/CMDt/1Nzbv+Q2oH/m/OM/5nwi/+Z74v/me+L/5nvi/+V6of/ecxx/3K+a/9fZFb/WEtPn1NH + UAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nv + i/+a8Yz/isZ6/0h1fP8cocX/ZoBo/5fpiP+Z74v/me+L/5nvi/+Z74v/me+L/5Xqh/95zHH/cr5r/19k + Vv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nw + i/+Z74v/me+L/5nvi/+Y64n/bIlq/0Nmdv91mW3/mvCL/5nvi/+Z74v/me+L/5nvi/+Z74v/leqH/3nM + cf9yvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2Ro + Wv+U4ob/mfCL/5nvi/+Z74v/me+L/5rxjP+Iwnv/XVZT/4K2dv+a8oz/me+L/5nvi/+Z74v/me+L/5nv + i/+V6of/ecxx/3K+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNH + UAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nvi/+Z74v/me+L/5fpif9yi2f/jM9//5rxjP+Z74v/me+L/5nv + i/+Z74v/me+L/5Xqh/95zHH/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYTFAAUkdQAFhKT55kaFr/leSH/5ryjP+a8Yz/mvGM/5rxjP+a8Yz/mvKM/5DYg/+W6Ij/mvKM/5rx + jP+a8Yz/mvGM/5rxjP+a8oz/leyI/3nNcf9zwGz/X2RW/1hKT55SR1AAWExQAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhMUABXSVABWEtPoWFhV/+FvHj/icd8/4nGfP+Jxnz/icZ8/4nGfP+Jxnz/icd8/4nH + fP+Jxnz/icZ8/4nGfP+Jxnz/icZ8/4nHfP+Gw3n/caxp/2yiZP9dXlT/WUtQoVdJUAFYTFAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWUxQAFlLUAJZTVCnWk5R/1xTU/9cU1L/XFNS/1xTUv9cU1L/XFNS/1xT + Uv9cU1L/XFNS/1xTUv9cU1L/XFNS/1xTUv9cU1L/XFNS/1tTUv9aUlH/WlJR/1lOUP9ZTVCnWUtQAllM + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAW05QAFlMUJldUlT/gYF8/42Qif+MkIj/jJCI/4yQ + iP+MkIj/jJCI/4yQiP+MkIj/jJCI/4yQiP+MkIj/jJCI/4yQiP+MkIj/jJCI/42Qif+BgXz/XVJU/1lM + UJlbTlEAWU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFtGTQBZTVAAWU1QVFpOUfdtZ2b/fn15/35+ + ef9+fnn/fn55/39+ef9+fnn/fn55/35+ef9+fnn/fn55/35+ef9/fnn/fn55/35+ef9+fnn/fn15/21n + Zv9aTlH3WU1QVFlNUABbRk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVlNTAFlNUABZTVAHWU1Qb1hM + T9JXS07lV0tO5FdLTuVYS074WExP/1pOUf9aTlH/Wk5R/1pOUf9aTlH/Wk5R/1hMT/9YS074V0tO5VdL + TuRXS07lWExP0llNUG9ZTVAGWU1QAFZTUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWU1QAFlN + UABbTk8AWU1QFllNUCNZTVAjWU1QKVhMT8JiV1n/fHN2/311d/99dXf/fXV3/311d/98dHb/Ylda/1hM + T8JZTVApWU1QI1lNUCNZTVAVXE5QAFlNUABZTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAWU1QAFlNUABZTVAAWU1QAFlNUABWSlAAWExPpV5TVv9yaGr/c2ps/3NqbP9zamz/c2ps/3Jo + av9eU1b/WExPpVZKUQFZTVAAWU1QAFlNUABYTVAAWU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVklRAFlNUABZTVA7WU1QwlhMT+BYTE/gWExP4FhM + T+BYTE/gWExP4FlNUMJZTVA7WU1QAFZKUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFEAWE1QAFlNUABZTVAPWU1QH1lN + UB9ZTVAfWU1QH1lNUB9ZTVAfWU1QD1lNUABYTFEAWExRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAWE1QAFlN + UABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA+AAAH/AAAA/gAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH8AAAD/gAAB//gAH//4AB///AA/8= + + + \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmConfigBaseSet.cs b/JY.Inspection/Frm/FrmConfigBaseSet.cs new file mode 100644 index 0000000..bd37a62 --- /dev/null +++ b/JY.Inspection/Frm/FrmConfigBaseSet.cs @@ -0,0 +1,173 @@ +using JY.DAL; +using JY.Inspection.Common; +using JY.Model; +using JY.Utility; +using MetroFramework.Forms; +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 JY.Inspection.Frm +{ + public partial class FrmConfigBaseSet : MetroForm + { + /// + /// 数据库访问接口 + /// + private IDbHelper dbHelper = new OpSqlDataBase(); + /// + /// 定义DataGridView数据源 + /// + private BindingList blPLCConfigBaseList = new BindingList(); + public FrmConfigBaseSet() + { + InitializeComponent(); + } + + //bool IsOrg = true; + + private void FrmConfigBaseSet_Load(object sender, EventArgs e) + { + this.dgvPara.AutoGenerateColumns = false; + //IsOrg = false; + GetData(); + } + + /// + /// 加载PLC轴参数数据到页面列表 + /// + private void GetData() + { + var list = dbHelper.GetPLCConfigBases(); + blPLCConfigBaseList = new BindingList(list); + dgvPara.DataSource = blPLCConfigBaseList; + //dgvPara.Columns[0].Visible = false; + } + + /// + /// 导出到Excel + /// + /// + /// + private void btnExcelToDgv_Click(object sender, EventArgs e) + { + try + { + OpenFileDialog fd = new OpenFileDialog(); + fd.Filter = "导入Excel数据库|*.xlsx;"; //打开文件对话框筛选器 + if (fd.ShowDialog() == DialogResult.OK) + { + EPPlusExcelHelper excelHepler = new EPPlusExcelHelper(fd.FileName); + DataTable dt = excelHepler.ImportExcel(1); + if (dt != null && dt.Rows.Count > 0) + { + blPLCConfigBaseList.Clear(); + foreach (DataRow dr in dt.Rows) + { + blPLCConfigBaseList.Add(new PLCConfigBase() + { + OrderNum = int.Parse(dr["顺序"].ToString()), + PLCAddress = dr["PLC地址"].ToString(), + PLCRemark = dr["地址说明"].ToString() + }); + } + } + } + } + catch (Exception exception) + { + MessageBox.Show(exception.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + /// + /// 保存轴参数信息 + /// + /// + /// + private void btnOk_Click(object sender, EventArgs e) + { + try + { + string PlcAddressErr = "";//判断 PLC地址 是否重复 + + if (blPLCConfigBaseList.Count == 0) + { + MessageBox.Show("列表数据空数据,不能保存!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + var duplicateData = blPLCConfigBaseList.GroupBy(p => p.PLCAddress); + foreach (var item in duplicateData) + { + if (item.Count() > 1) + { + PlcAddressErr += $"PLC地址不能重复:{item.FirstOrDefault().PLCAddress}"; + } + } + + if (PlcAddressErr != "")//重复,需要报错并返出 + { + MessageBox.Show(PlcAddressErr, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return;//返出 + } + + dbHelper.InsertPLCConfigBase(blPLCConfigBaseList.ToList()); + MessageBox.Show("保存成功!"); + } + catch (Exception ex) + { + MessageBox.Show(ex.ToString()); + } + } + /// + /// 关闭窗体 + /// + /// + /// + private void btnCancel_Click(object sender, EventArgs e) + { + this.Close(); + } + + /// + /// 添加记录 + /// + /// + /// + private void tsmiAdd_Click(object sender, EventArgs e) + { + blPLCConfigBaseList.Add(new PLCConfigBase() + { + OrderNum = blPLCConfigBaseList.Count + 1, + PLCAddress = "D00", + PLCRemark = "" + }); + } + + /// + /// 删除记录 + /// + /// + /// + private void tsmiDelete_Click(object sender, EventArgs e) + { + if (dgvPara.RowCount == 0) + { + MessageBox.Show("没有数据需要删除!"); + return; + } + if (MessageBox.Show("确定要删除该行?", "系统提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK) + { + int row = dgvPara.CurrentCell.RowIndex; + blPLCConfigBaseList.RemoveAt(row); + } + } + } +} diff --git a/JY.Inspection/Frm/FrmConfigBaseSet.designer.cs b/JY.Inspection/Frm/FrmConfigBaseSet.designer.cs new file mode 100644 index 0000000..9a2d596 --- /dev/null +++ b/JY.Inspection/Frm/FrmConfigBaseSet.designer.cs @@ -0,0 +1,226 @@ + +namespace JY.Inspection.Frm +{ + partial class FrmConfigBaseSet + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmConfigBaseSet)); + this.dgvPara = new MetroFramework.Controls.MetroGrid(); + this.PLCAddress = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.PLCRemark = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.OrderNum = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.tsmiAdd = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiDelete = new System.Windows.Forms.ToolStripMenuItem(); + this.btnOk = new MetroFramework.Controls.MetroButton(); + this.btnCancel = new MetroFramework.Controls.MetroButton(); + this.btnExcelToDgv = new MetroFramework.Controls.MetroButton(); + ((System.ComponentModel.ISupportInitialize)(this.dgvPara)).BeginInit(); + this.contextMenuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // dgvPara + // + this.dgvPara.AllowUserToAddRows = false; + this.dgvPara.AllowUserToDeleteRows = false; + this.dgvPara.AllowUserToResizeRows = false; + this.dgvPara.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.dgvPara.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dgvPara.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.None; + this.dgvPara.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(174)))), ((int)(((byte)(219))))); + dataGridViewCellStyle1.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + dataGridViewCellStyle1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(198)))), ((int)(((byte)(247))))); + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvPara.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + this.dgvPara.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dgvPara.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.PLCAddress, + this.PLCRemark, + this.OrderNum}); + this.dgvPara.ContextMenuStrip = this.contextMenuStrip1; + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + dataGridViewCellStyle2.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + dataGridViewCellStyle2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(136)))), ((int)(((byte)(136)))), ((int)(((byte)(136))))); + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(198)))), ((int)(((byte)(247))))); + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvPara.DefaultCellStyle = dataGridViewCellStyle2; + this.dgvPara.Dock = System.Windows.Forms.DockStyle.Top; + this.dgvPara.EnableHeadersVisualStyles = false; + this.dgvPara.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + this.dgvPara.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.dgvPara.Location = new System.Drawing.Point(27, 75); + this.dgvPara.Margin = new System.Windows.Forms.Padding(4); + this.dgvPara.Name = "dgvPara"; + this.dgvPara.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None; + dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(174)))), ((int)(((byte)(219))))); + dataGridViewCellStyle3.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + dataGridViewCellStyle3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + dataGridViewCellStyle3.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(198)))), ((int)(((byte)(247))))); + dataGridViewCellStyle3.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvPara.RowHeadersDefaultCellStyle = dataGridViewCellStyle3; + this.dgvPara.RowHeadersVisible = false; + this.dgvPara.RowHeadersWidth = 51; + this.dgvPara.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; + this.dgvPara.RowTemplate.Height = 23; + this.dgvPara.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgvPara.Size = new System.Drawing.Size(737, 680); + this.dgvPara.TabIndex = 0; + // + // PLCAddress + // + this.PLCAddress.DataPropertyName = "PLCAddress"; + this.PLCAddress.HeaderText = "PLC地址"; + this.PLCAddress.MinimumWidth = 6; + this.PLCAddress.Name = "PLCAddress"; + this.PLCAddress.Width = 125; + // + // PLCRemark + // + this.PLCRemark.DataPropertyName = "PLCRemark"; + this.PLCRemark.HeaderText = "地址说明"; + this.PLCRemark.MinimumWidth = 6; + this.PLCRemark.Name = "PLCRemark"; + this.PLCRemark.Width = 300; + // + // OrderNum + // + this.OrderNum.DataPropertyName = "OrderNum"; + this.OrderNum.HeaderText = "顺序"; + this.OrderNum.MinimumWidth = 6; + this.OrderNum.Name = "OrderNum"; + this.OrderNum.Width = 125; + // + // contextMenuStrip1 + // + this.contextMenuStrip1.ImageScalingSize = new System.Drawing.Size(20, 20); + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsmiAdd, + this.tsmiDelete}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(124, 52); + // + // tsmiAdd + // + this.tsmiAdd.Name = "tsmiAdd"; + this.tsmiAdd.Size = new System.Drawing.Size(123, 24); + this.tsmiAdd.Text = "添加行"; + this.tsmiAdd.Click += new System.EventHandler(this.tsmiAdd_Click); + // + // tsmiDelete + // + this.tsmiDelete.Name = "tsmiDelete"; + this.tsmiDelete.Size = new System.Drawing.Size(123, 24); + this.tsmiDelete.Text = "删除行"; + this.tsmiDelete.Click += new System.EventHandler(this.tsmiDelete_Click); + // + // btnOk + // + this.btnOk.Location = new System.Drawing.Point(292, 811); + this.btnOk.Margin = new System.Windows.Forms.Padding(4); + this.btnOk.Name = "btnOk"; + this.btnOk.Size = new System.Drawing.Size(181, 55); + this.btnOk.TabIndex = 1; + this.btnOk.Text = "保存"; + this.btnOk.UseSelectable = true; + this.btnOk.Click += new System.EventHandler(this.btnOk_Click); + // + // btnCancel + // + this.btnCancel.Location = new System.Drawing.Point(537, 811); + this.btnCancel.Margin = new System.Windows.Forms.Padding(4); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(181, 55); + this.btnCancel.TabIndex = 2; + this.btnCancel.Text = "退出"; + this.btnCancel.UseSelectable = true; + this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); + // + // btnExcelToDgv + // + this.btnExcelToDgv.Location = new System.Drawing.Point(64, 811); + this.btnExcelToDgv.Margin = new System.Windows.Forms.Padding(4); + this.btnExcelToDgv.Name = "btnExcelToDgv"; + this.btnExcelToDgv.Size = new System.Drawing.Size(181, 55); + this.btnExcelToDgv.TabIndex = 3; + this.btnExcelToDgv.Text = "导入轴寄存器"; + this.btnExcelToDgv.UseSelectable = true; + this.btnExcelToDgv.Click += new System.EventHandler(this.btnExcelToDgv_Click); + // + // FrmConfigBaseSet + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BorderStyle = MetroFramework.Forms.MetroFormBorderStyle.FixedSingle; + this.ClientSize = new System.Drawing.Size(791, 877); + this.Controls.Add(this.btnExcelToDgv); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.btnOk); + this.Controls.Add(this.dgvPara); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(4); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Movable = false; + this.Name = "FrmConfigBaseSet"; + this.Padding = new System.Windows.Forms.Padding(27, 75, 27, 25); + this.Text = "PLC轴寄存器维护地址"; + this.Load += new System.EventHandler(this.FrmConfigBaseSet_Load); + ((System.ComponentModel.ISupportInitialize)(this.dgvPara)).EndInit(); + this.contextMenuStrip1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private MetroFramework.Controls.MetroGrid dgvPara; + private MetroFramework.Controls.MetroButton btnOk; + private MetroFramework.Controls.MetroButton btnCancel; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem tsmiAdd; + private System.Windows.Forms.ToolStripMenuItem tsmiDelete; + private MetroFramework.Controls.MetroButton btnExcelToDgv; + private System.Windows.Forms.DataGridViewTextBoxColumn PLCAddress; + private System.Windows.Forms.DataGridViewTextBoxColumn PLCRemark; + private System.Windows.Forms.DataGridViewTextBoxColumn OrderNum; + + + } +} \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmConfigBaseSet.resx b/JY.Inspection/Frm/FrmConfigBaseSet.resx new file mode 100644 index 0000000..c1c4cf4 --- /dev/null +++ b/JY.Inspection/Frm/FrmConfigBaseSet.resx @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + True + + + True + + + 17, 17 + + + + + AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlN + UABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAWU1QAFpNUABZTVASWU1QH1lNUB9ZTVAfWU1QH1lN + UB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUBJaTVAAWU1QAFlN + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXE5OAFlNUABZTVAFWU1QaFlLUM1YS0/gWEtQ4FhL + UOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS0/gWUtQzVlN + UGhZTVAFWU1QAFxOTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWS1EAWU1QAFlNUE5ZTlD0YGxY/2eH + Xv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eH + Xv9gbFj/WU5Q9FlNUE5ZTVAAVktRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhNUABaTVAAWUtQkl1c + VP9xtWn/dchu/3TIbf90yG3/dMht/3TIbf90yG3/dMht/3THbf91yG7/dMht/3TIbf90yG3/dMht/3TI + bf90yG3/dchu/3G1af9dXFT/WUtQklpNUABYTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNH + UAFYS0+fX2RW/3K+a/9zxm3/c8Vs/3PFbP9zxWz/c8Vs/3PFbP90xm3/b7Fo/3G6av90xm3/c8Vs/3PF + bf90xm3/dMZt/3TGbf90xm3/c79s/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYTFAAU0dQAVhKT59gZVf/fsp1/4HVd/+B1Hf/gdR3/4HUd/+B1Hf/gdR3/4HWd/9tnWX/Z4lf/3/S + dv+B1Hf/fdF1/3fJb/90xm3/dMZt/3TGbf9zvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+T4Yb/mfCL/5nvi/+Z74v/me+L/5nvi/+Z74v/lu2J/3Cg + aP9cV1L/gr92/5nwi/+Y7or/keaF/3/Sdv90xm3/dMZt/3O+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nvi/+Z74v/me+L/5nv + i/+T6ob/bp5l/09ZYv9ieGL/keCD/5rwjP+a8Iv/leuI/3zPdP90xm3/c75r/19kVv9YS0+fU0dQAVhM + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nwi/+Z74v/me+L/5nv + i/+Z74v/mvCM/4/lg/9tmmH/OXuO/zp6jf92nmn/mO6K/5nvi/+a8Iz/jOCA/3XHbf9zvmv/X2RW/1hL + T59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+U4ob/mfCL/5nv + i/+Z74v/me+L/5nvi/+U64f/gtl5/2yYX/82gJT/ELXe/1Nsaf+HyXn/mvGM/5nvi/+T6Ib/d8pw/3K+ + a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Ti + hv+Z8Iv/me+L/5nvi/+T6ob/hdZ6/3W0av9pj17/XGtb/y+Ko/8Az///J5Ox/2iAYf+T5Yb/mvCM/5Tq + h/95y3H/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhK + T59kaFr/lOKG/5nwi/+Z8Iv/idZ9/22aZf9ed1//SnB0/zCHoP8Xq9D/Bcb0/wDP//8Fx/b/P3aE/3uq + bv+Z8Iv/leqH/3nMcf9yvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhM + UABTR1ABWEpPn2RoWv+U4ob/mfCL/5rxjP+Kzn3/WWJe/yGau/8GxPL/AM///wDR//8Az///BMf3/w63 + 4v8wgpz/X2VY/4zVf/+V64j/ecxx/3K+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5jtiv9wjmj/JZWz/wDQ//8Azv//FLHX/zCI + oP9GdX7/XHZp/26MaP9+r3L/kd+E/5XriP95zHH/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nwi/+Z74v/mvGM/4vKe/9McnX/CMHv/wLL + +/9AdoP/dpRk/4vJe/+T4YX/mO6K/5rxjP+a8Iz/lOqH/3nMcf9yvmv/X2RW/1hLT59TR1ABWExQAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+U4ob/mfCL/5nvi/+Z74v/mOyK/2+K + Z/8jmLn/CMDt/1Nzbv+Q2oH/m/OM/5nwi/+Z74v/me+L/5nvi/+V6of/ecxx/3K+a/9fZFb/WEtPn1NH + UAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nv + i/+a8Yz/isZ6/0h1fP8cocX/ZoBo/5fpiP+Z74v/me+L/5nvi/+Z74v/me+L/5Xqh/95zHH/cr5r/19k + Vv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nw + i/+Z74v/me+L/5nvi/+Y64n/bIlq/0Nmdv91mW3/mvCL/5nvi/+Z74v/me+L/5nvi/+Z74v/leqH/3nM + cf9yvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2Ro + Wv+U4ob/mfCL/5nvi/+Z74v/me+L/5rxjP+Iwnv/XVZT/4K2dv+a8oz/me+L/5nvi/+Z74v/me+L/5nv + i/+V6of/ecxx/3K+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNH + UAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nvi/+Z74v/me+L/5fpif9yi2f/jM9//5rxjP+Z74v/me+L/5nv + i/+Z74v/me+L/5Xqh/95zHH/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYTFAAUkdQAFhKT55kaFr/leSH/5ryjP+a8Yz/mvGM/5rxjP+a8Yz/mvKM/5DYg/+W6Ij/mvKM/5rx + jP+a8Yz/mvGM/5rxjP+a8oz/leyI/3nNcf9zwGz/X2RW/1hKT55SR1AAWExQAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhMUABXSVABWEtPoWFhV/+FvHj/icd8/4nGfP+Jxnz/icZ8/4nGfP+Jxnz/icd8/4nH + fP+Jxnz/icZ8/4nGfP+Jxnz/icZ8/4nHfP+Gw3n/caxp/2yiZP9dXlT/WUtQoVdJUAFYTFAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWUxQAFlLUAJZTVCnWk5R/1xTU/9cU1L/XFNS/1xTUv9cU1L/XFNS/1xT + Uv9cU1L/XFNS/1xTUv9cU1L/XFNS/1xTUv9cU1L/XFNS/1tTUv9aUlH/WlJR/1lOUP9ZTVCnWUtQAllM + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAW05QAFlMUJldUlT/gYF8/42Qif+MkIj/jJCI/4yQ + iP+MkIj/jJCI/4yQiP+MkIj/jJCI/4yQiP+MkIj/jJCI/4yQiP+MkIj/jJCI/42Qif+BgXz/XVJU/1lM + UJlbTlEAWU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFtGTQBZTVAAWU1QVFpOUfdtZ2b/fn15/35+ + ef9+fnn/fn55/39+ef9+fnn/fn55/35+ef9+fnn/fn55/35+ef9/fnn/fn55/35+ef9+fnn/fn15/21n + Zv9aTlH3WU1QVFlNUABbRk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVlNTAFlNUABZTVAHWU1Qb1hM + T9JXS07lV0tO5FdLTuVYS074WExP/1pOUf9aTlH/Wk5R/1pOUf9aTlH/Wk5R/1hMT/9YS074V0tO5VdL + TuRXS07lWExP0llNUG9ZTVAGWU1QAFZTUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWU1QAFlN + UABbTk8AWU1QFllNUCNZTVAjWU1QKVhMT8JiV1n/fHN2/311d/99dXf/fXV3/311d/98dHb/Ylda/1hM + T8JZTVApWU1QI1lNUCNZTVAVXE5QAFlNUABZTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAWU1QAFlNUABZTVAAWU1QAFlNUABWSlAAWExPpV5TVv9yaGr/c2ps/3NqbP9zamz/c2ps/3Jo + av9eU1b/WExPpVZKUQFZTVAAWU1QAFlNUABYTVAAWU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVklRAFlNUABZTVA7WU1QwlhMT+BYTE/gWExP4FhM + T+BYTE/gWExP4FlNUMJZTVA7WU1QAFZKUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFEAWE1QAFlNUABZTVAPWU1QH1lN + UB9ZTVAfWU1QH1lNUB9ZTVAfWU1QD1lNUABYTFEAWExRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAWE1QAFlN + UABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA+AAAH/AAAA/gAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH8AAAD/gAAB//gAH//4AB///AA/8= + + + \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmDBbaseSet.cs b/JY.Inspection/Frm/FrmDBbaseSet.cs new file mode 100644 index 0000000..2fb9471 --- /dev/null +++ b/JY.Inspection/Frm/FrmDBbaseSet.cs @@ -0,0 +1,47 @@ +using MetroFramework.Forms; +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 JY.Inspection.Common; +using JY.Utility; + +namespace JY.Inspection.Frm +{ + public partial class FrmDBbaseSet : MetroForm + { + public FrmDBbaseSet() + { + InitializeComponent(); + } + + private void FrmDBbaseSet_Load(object sender, EventArgs e) + { + txtDBIP.Text = IniFileHelper.ReadIniData("MYSQL配置", "DB_IP"); + txtDBName.Text = IniFileHelper.ReadIniData("MYSQL配置", "DB_Name"); + txtDBUser.Text = IniFileHelper.ReadIniData("MYSQL配置", "DB_User"); + txtDBPwd.Text = IniFileHelper.ReadIniData("MYSQL配置", "DB_Pwd"); + + } + + private void btnSave_Click(object sender, EventArgs e) + { + IniFileHelper.WriteIniData("MYSQL配置", "DB_IP", txtDBIP.Text.Trim()); + IniFileHelper.WriteIniData("MYSQL配置", "DB_Name", txtDBName.Text.Trim()); + IniFileHelper.WriteIniData("MYSQL配置", "DB_User", txtDBUser.Text.Trim()); + IniFileHelper.WriteIniData("MYSQL配置", "DB_Pwd", txtDBPwd.Text.Trim()); + + MessageBox.Show("数据库参数保存成功!", "系统提示"); + } + + private void btnExit_Click(object sender, EventArgs e) + { + this.Close(); + } + } +} diff --git a/JY.Inspection/Frm/FrmDBbaseSet.designer.cs b/JY.Inspection/Frm/FrmDBbaseSet.designer.cs new file mode 100644 index 0000000..4794465 --- /dev/null +++ b/JY.Inspection/Frm/FrmDBbaseSet.designer.cs @@ -0,0 +1,276 @@ + +namespace JY.Inspection.Frm +{ + partial class FrmDBbaseSet + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmDBbaseSet)); + this.btnSave = new MetroFramework.Controls.MetroButton(); + this.txtDBIP = new MetroFramework.Controls.MetroTextBox(); + this.metroLabel1 = new MetroFramework.Controls.MetroLabel(); + this.btnExit = new MetroFramework.Controls.MetroButton(); + this.metroLabel2 = new MetroFramework.Controls.MetroLabel(); + this.txtDBName = new MetroFramework.Controls.MetroTextBox(); + this.metroLabel3 = new MetroFramework.Controls.MetroLabel(); + this.txtDBUser = new MetroFramework.Controls.MetroTextBox(); + this.metroLabel4 = new MetroFramework.Controls.MetroLabel(); + this.txtDBPwd = new MetroFramework.Controls.MetroTextBox(); + this.SuspendLayout(); + // + // btnSave + // + this.btnSave.Location = new System.Drawing.Point(87, 331); + this.btnSave.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnSave.Name = "btnSave"; + this.btnSave.Size = new System.Drawing.Size(149, 46); + this.btnSave.TabIndex = 0; + this.btnSave.Text = "保存"; + this.btnSave.UseSelectable = true; + this.btnSave.Click += new System.EventHandler(this.btnSave_Click); + // + // txtDBIP + // + // + // + // + this.txtDBIP.CustomButton.Image = null; + this.txtDBIP.CustomButton.Location = new System.Drawing.Point(273, 1); + this.txtDBIP.CustomButton.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txtDBIP.CustomButton.Name = ""; + this.txtDBIP.CustomButton.Size = new System.Drawing.Size(36, 34); + this.txtDBIP.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.txtDBIP.CustomButton.TabIndex = 1; + this.txtDBIP.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.txtDBIP.CustomButton.UseSelectable = true; + this.txtDBIP.CustomButton.Visible = false; + this.txtDBIP.Lines = new string[0]; + this.txtDBIP.Location = new System.Drawing.Point(204, 95); + this.txtDBIP.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txtDBIP.MaxLength = 32767; + this.txtDBIP.Name = "txtDBIP"; + this.txtDBIP.PasswordChar = '\0'; + this.txtDBIP.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.txtDBIP.SelectedText = ""; + this.txtDBIP.SelectionLength = 0; + this.txtDBIP.SelectionStart = 0; + this.txtDBIP.ShortcutsEnabled = true; + this.txtDBIP.Size = new System.Drawing.Size(233, 29); + this.txtDBIP.TabIndex = 1; + this.txtDBIP.UseSelectable = true; + this.txtDBIP.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.txtDBIP.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // metroLabel1 + // + this.metroLabel1.AutoSize = true; + this.metroLabel1.Location = new System.Drawing.Point(75, 95); + this.metroLabel1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.metroLabel1.Name = "metroLabel1"; + this.metroLabel1.Size = new System.Drawing.Size(99, 20); + this.metroLabel1.TabIndex = 2; + this.metroLabel1.Text = "数据库地址:"; + // + // btnExit + // + this.btnExit.Location = new System.Drawing.Point(300, 331); + this.btnExit.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnExit.Name = "btnExit"; + this.btnExit.Size = new System.Drawing.Size(137, 46); + this.btnExit.TabIndex = 3; + this.btnExit.Text = "退出"; + this.btnExit.UseSelectable = true; + this.btnExit.Click += new System.EventHandler(this.btnExit_Click); + // + // metroLabel2 + // + this.metroLabel2.AutoSize = true; + this.metroLabel2.Location = new System.Drawing.Point(75, 150); + this.metroLabel2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.metroLabel2.Name = "metroLabel2"; + this.metroLabel2.Size = new System.Drawing.Size(99, 20); + this.metroLabel2.TabIndex = 5; + this.metroLabel2.Text = "数据库名称:"; + // + // txtDBName + // + // + // + // + this.txtDBName.CustomButton.Image = null; + this.txtDBName.CustomButton.Location = new System.Drawing.Point(273, 1); + this.txtDBName.CustomButton.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txtDBName.CustomButton.Name = ""; + this.txtDBName.CustomButton.Size = new System.Drawing.Size(36, 34); + this.txtDBName.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.txtDBName.CustomButton.TabIndex = 1; + this.txtDBName.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.txtDBName.CustomButton.UseSelectable = true; + this.txtDBName.CustomButton.Visible = false; + this.txtDBName.Lines = new string[0]; + this.txtDBName.Location = new System.Drawing.Point(204, 150); + this.txtDBName.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txtDBName.MaxLength = 32767; + this.txtDBName.Name = "txtDBName"; + this.txtDBName.PasswordChar = '\0'; + this.txtDBName.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.txtDBName.SelectedText = ""; + this.txtDBName.SelectionLength = 0; + this.txtDBName.SelectionStart = 0; + this.txtDBName.ShortcutsEnabled = true; + this.txtDBName.Size = new System.Drawing.Size(233, 29); + this.txtDBName.TabIndex = 4; + this.txtDBName.UseSelectable = true; + this.txtDBName.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.txtDBName.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // metroLabel3 + // + this.metroLabel3.AutoSize = true; + this.metroLabel3.Location = new System.Drawing.Point(75, 206); + this.metroLabel3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.metroLabel3.Name = "metroLabel3"; + this.metroLabel3.Size = new System.Drawing.Size(99, 20); + this.metroLabel3.TabIndex = 7; + this.metroLabel3.Text = "数据库用户:"; + // + // txtDBUser + // + // + // + // + this.txtDBUser.CustomButton.Image = null; + this.txtDBUser.CustomButton.Location = new System.Drawing.Point(273, 1); + this.txtDBUser.CustomButton.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txtDBUser.CustomButton.Name = ""; + this.txtDBUser.CustomButton.Size = new System.Drawing.Size(36, 34); + this.txtDBUser.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.txtDBUser.CustomButton.TabIndex = 1; + this.txtDBUser.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.txtDBUser.CustomButton.UseSelectable = true; + this.txtDBUser.CustomButton.Visible = false; + this.txtDBUser.Lines = new string[0]; + this.txtDBUser.Location = new System.Drawing.Point(204, 206); + this.txtDBUser.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txtDBUser.MaxLength = 32767; + this.txtDBUser.Name = "txtDBUser"; + this.txtDBUser.PasswordChar = '\0'; + this.txtDBUser.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.txtDBUser.SelectedText = ""; + this.txtDBUser.SelectionLength = 0; + this.txtDBUser.SelectionStart = 0; + this.txtDBUser.ShortcutsEnabled = true; + this.txtDBUser.Size = new System.Drawing.Size(233, 29); + this.txtDBUser.TabIndex = 6; + this.txtDBUser.UseSelectable = true; + this.txtDBUser.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.txtDBUser.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // metroLabel4 + // + this.metroLabel4.AutoSize = true; + this.metroLabel4.Location = new System.Drawing.Point(75, 259); + this.metroLabel4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.metroLabel4.Name = "metroLabel4"; + this.metroLabel4.Size = new System.Drawing.Size(99, 20); + this.metroLabel4.TabIndex = 9; + this.metroLabel4.Text = "数据库密码:"; + // + // txtDBPwd + // + // + // + // + this.txtDBPwd.CustomButton.Image = null; + this.txtDBPwd.CustomButton.Location = new System.Drawing.Point(273, 1); + this.txtDBPwd.CustomButton.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txtDBPwd.CustomButton.Name = ""; + this.txtDBPwd.CustomButton.Size = new System.Drawing.Size(36, 34); + this.txtDBPwd.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.txtDBPwd.CustomButton.TabIndex = 1; + this.txtDBPwd.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.txtDBPwd.CustomButton.UseSelectable = true; + this.txtDBPwd.CustomButton.Visible = false; + this.txtDBPwd.Lines = new string[0]; + this.txtDBPwd.Location = new System.Drawing.Point(204, 259); + this.txtDBPwd.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txtDBPwd.MaxLength = 32767; + this.txtDBPwd.Name = "txtDBPwd"; + this.txtDBPwd.PasswordChar = '\0'; + this.txtDBPwd.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.txtDBPwd.SelectedText = ""; + this.txtDBPwd.SelectionLength = 0; + this.txtDBPwd.SelectionStart = 0; + this.txtDBPwd.ShortcutsEnabled = true; + this.txtDBPwd.Size = new System.Drawing.Size(233, 29); + this.txtDBPwd.TabIndex = 8; + this.txtDBPwd.UseSelectable = true; + this.txtDBPwd.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.txtDBPwd.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // FrmDBbaseSet + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(497, 420); + this.Controls.Add(this.metroLabel4); + this.Controls.Add(this.txtDBPwd); + this.Controls.Add(this.metroLabel3); + this.Controls.Add(this.txtDBUser); + this.Controls.Add(this.metroLabel2); + this.Controls.Add(this.txtDBName); + this.Controls.Add(this.btnExit); + this.Controls.Add(this.metroLabel1); + this.Controls.Add(this.txtDBIP); + this.Controls.Add(this.btnSave); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmDBbaseSet"; + this.Padding = new System.Windows.Forms.Padding(27, 75, 27, 25); + this.Text = "数据库设置"; + this.Load += new System.EventHandler(this.FrmDBbaseSet_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private MetroFramework.Controls.MetroButton btnSave; + private MetroFramework.Controls.MetroTextBox txtDBIP; + private MetroFramework.Controls.MetroLabel metroLabel1; + private MetroFramework.Controls.MetroButton btnExit; + private MetroFramework.Controls.MetroLabel metroLabel2; + private MetroFramework.Controls.MetroTextBox txtDBName; + private MetroFramework.Controls.MetroLabel metroLabel3; + private MetroFramework.Controls.MetroTextBox txtDBUser; + private MetroFramework.Controls.MetroLabel metroLabel4; + private MetroFramework.Controls.MetroTextBox txtDBPwd; + } +} \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmDBbaseSet.resx b/JY.Inspection/Frm/FrmDBbaseSet.resx new file mode 100644 index 0000000..acb5bb2 --- /dev/null +++ b/JY.Inspection/Frm/FrmDBbaseSet.resx @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlN + UABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAWU1QAFpNUABZTVASWU1QH1lNUB9ZTVAfWU1QH1lN + UB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUBJaTVAAWU1QAFlN + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXE5OAFlNUABZTVAFWU1QaFlLUM1YS0/gWEtQ4FhL + UOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS0/gWUtQzVlN + UGhZTVAFWU1QAFxOTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWS1EAWU1QAFlNUE5ZTlD0YGxY/2eH + Xv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eH + Xv9gbFj/WU5Q9FlNUE5ZTVAAVktRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhNUABaTVAAWUtQkl1c + VP9xtWn/dchu/3TIbf90yG3/dMht/3TIbf90yG3/dMht/3THbf91yG7/dMht/3TIbf90yG3/dMht/3TI + bf90yG3/dchu/3G1af9dXFT/WUtQklpNUABYTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNH + UAFYS0+fX2RW/3K+a/9zxm3/c8Vs/3PFbP9zxWz/c8Vs/3PFbP90xm3/b7Fo/3G6av90xm3/c8Vs/3PF + bf90xm3/dMZt/3TGbf90xm3/c79s/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYTFAAU0dQAVhKT59gZVf/fsp1/4HVd/+B1Hf/gdR3/4HUd/+B1Hf/gdR3/4HWd/9tnWX/Z4lf/3/S + dv+B1Hf/fdF1/3fJb/90xm3/dMZt/3TGbf9zvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+T4Yb/mfCL/5nvi/+Z74v/me+L/5nvi/+Z74v/lu2J/3Cg + aP9cV1L/gr92/5nwi/+Y7or/keaF/3/Sdv90xm3/dMZt/3O+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nvi/+Z74v/me+L/5nv + i/+T6ob/bp5l/09ZYv9ieGL/keCD/5rwjP+a8Iv/leuI/3zPdP90xm3/c75r/19kVv9YS0+fU0dQAVhM + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nwi/+Z74v/me+L/5nv + i/+Z74v/mvCM/4/lg/9tmmH/OXuO/zp6jf92nmn/mO6K/5nvi/+a8Iz/jOCA/3XHbf9zvmv/X2RW/1hL + T59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+U4ob/mfCL/5nv + i/+Z74v/me+L/5nvi/+U64f/gtl5/2yYX/82gJT/ELXe/1Nsaf+HyXn/mvGM/5nvi/+T6Ib/d8pw/3K+ + a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Ti + hv+Z8Iv/me+L/5nvi/+T6ob/hdZ6/3W0av9pj17/XGtb/y+Ko/8Az///J5Ox/2iAYf+T5Yb/mvCM/5Tq + h/95y3H/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhK + T59kaFr/lOKG/5nwi/+Z8Iv/idZ9/22aZf9ed1//SnB0/zCHoP8Xq9D/Bcb0/wDP//8Fx/b/P3aE/3uq + bv+Z8Iv/leqH/3nMcf9yvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhM + UABTR1ABWEpPn2RoWv+U4ob/mfCL/5rxjP+Kzn3/WWJe/yGau/8GxPL/AM///wDR//8Az///BMf3/w63 + 4v8wgpz/X2VY/4zVf/+V64j/ecxx/3K+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5jtiv9wjmj/JZWz/wDQ//8Azv//FLHX/zCI + oP9GdX7/XHZp/26MaP9+r3L/kd+E/5XriP95zHH/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nwi/+Z74v/mvGM/4vKe/9McnX/CMHv/wLL + +/9AdoP/dpRk/4vJe/+T4YX/mO6K/5rxjP+a8Iz/lOqH/3nMcf9yvmv/X2RW/1hLT59TR1ABWExQAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+U4ob/mfCL/5nvi/+Z74v/mOyK/2+K + Z/8jmLn/CMDt/1Nzbv+Q2oH/m/OM/5nwi/+Z74v/me+L/5nvi/+V6of/ecxx/3K+a/9fZFb/WEtPn1NH + UAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nv + i/+a8Yz/isZ6/0h1fP8cocX/ZoBo/5fpiP+Z74v/me+L/5nvi/+Z74v/me+L/5Xqh/95zHH/cr5r/19k + Vv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nw + i/+Z74v/me+L/5nvi/+Y64n/bIlq/0Nmdv91mW3/mvCL/5nvi/+Z74v/me+L/5nvi/+Z74v/leqH/3nM + cf9yvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2Ro + Wv+U4ob/mfCL/5nvi/+Z74v/me+L/5rxjP+Iwnv/XVZT/4K2dv+a8oz/me+L/5nvi/+Z74v/me+L/5nv + i/+V6of/ecxx/3K+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNH + UAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nvi/+Z74v/me+L/5fpif9yi2f/jM9//5rxjP+Z74v/me+L/5nv + i/+Z74v/me+L/5Xqh/95zHH/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYTFAAUkdQAFhKT55kaFr/leSH/5ryjP+a8Yz/mvGM/5rxjP+a8Yz/mvKM/5DYg/+W6Ij/mvKM/5rx + jP+a8Yz/mvGM/5rxjP+a8oz/leyI/3nNcf9zwGz/X2RW/1hKT55SR1AAWExQAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhMUABXSVABWEtPoWFhV/+FvHj/icd8/4nGfP+Jxnz/icZ8/4nGfP+Jxnz/icd8/4nH + fP+Jxnz/icZ8/4nGfP+Jxnz/icZ8/4nHfP+Gw3n/caxp/2yiZP9dXlT/WUtQoVdJUAFYTFAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWUxQAFlLUAJZTVCnWk5R/1xTU/9cU1L/XFNS/1xTUv9cU1L/XFNS/1xT + Uv9cU1L/XFNS/1xTUv9cU1L/XFNS/1xTUv9cU1L/XFNS/1tTUv9aUlH/WlJR/1lOUP9ZTVCnWUtQAllM + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAW05QAFlMUJldUlT/gYF8/42Qif+MkIj/jJCI/4yQ + iP+MkIj/jJCI/4yQiP+MkIj/jJCI/4yQiP+MkIj/jJCI/4yQiP+MkIj/jJCI/42Qif+BgXz/XVJU/1lM + UJlbTlEAWU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFtGTQBZTVAAWU1QVFpOUfdtZ2b/fn15/35+ + ef9+fnn/fn55/39+ef9+fnn/fn55/35+ef9+fnn/fn55/35+ef9/fnn/fn55/35+ef9+fnn/fn15/21n + Zv9aTlH3WU1QVFlNUABbRk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVlNTAFlNUABZTVAHWU1Qb1hM + T9JXS07lV0tO5FdLTuVYS074WExP/1pOUf9aTlH/Wk5R/1pOUf9aTlH/Wk5R/1hMT/9YS074V0tO5VdL + TuRXS07lWExP0llNUG9ZTVAGWU1QAFZTUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWU1QAFlN + UABbTk8AWU1QFllNUCNZTVAjWU1QKVhMT8JiV1n/fHN2/311d/99dXf/fXV3/311d/98dHb/Ylda/1hM + T8JZTVApWU1QI1lNUCNZTVAVXE5QAFlNUABZTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAWU1QAFlNUABZTVAAWU1QAFlNUABWSlAAWExPpV5TVv9yaGr/c2ps/3NqbP9zamz/c2ps/3Jo + av9eU1b/WExPpVZKUQFZTVAAWU1QAFlNUABYTVAAWU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVklRAFlNUABZTVA7WU1QwlhMT+BYTE/gWExP4FhM + T+BYTE/gWExP4FlNUMJZTVA7WU1QAFZKUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFEAWE1QAFlNUABZTVAPWU1QH1lN + UB9ZTVAfWU1QH1lNUB9ZTVAfWU1QD1lNUABYTFEAWExRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAWE1QAFlN + UABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA+AAAH/AAAA/gAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH8AAAD/gAAB//gAH//4AB///AA/8= + + + \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmHelper.cs b/JY.Inspection/Frm/FrmHelper.cs new file mode 100644 index 0000000..6e7baf4 --- /dev/null +++ b/JY.Inspection/Frm/FrmHelper.cs @@ -0,0 +1,21 @@ +using MetroFramework.Forms; +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 JY.Inspection.Frm +{ + public partial class FrmHelper : MetroForm + { + public FrmHelper() + { + InitializeComponent(); + } + } +} diff --git a/JY.Inspection/Frm/FrmHelper.designer.cs b/JY.Inspection/Frm/FrmHelper.designer.cs new file mode 100644 index 0000000..ff0e8a0 --- /dev/null +++ b/JY.Inspection/Frm/FrmHelper.designer.cs @@ -0,0 +1,82 @@ + +namespace JY.Inspection.Frm +{ + partial class FrmHelper + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmHelper)); + this.metroLabel1 = new MetroFramework.Controls.MetroLabel(); + this.metroLabel2 = new MetroFramework.Controls.MetroLabel(); + this.SuspendLayout(); + // + // metroLabel1 + // + this.metroLabel1.AutoSize = true; + this.metroLabel1.Location = new System.Drawing.Point(114, 166); + this.metroLabel1.Name = "metroLabel1"; + this.metroLabel1.Size = new System.Drawing.Size(317, 19); + this.metroLabel1.TabIndex = 0; + this.metroLabel1.Text = "本系统由惠州金源精密自动化设备有限公司开发。"; + // + // metroLabel2 + // + this.metroLabel2.AutoSize = true; + this.metroLabel2.Location = new System.Drawing.Point(114, 185); + this.metroLabel2.Name = "metroLabel2"; + this.metroLabel2.Size = new System.Drawing.Size(216, 19); + this.metroLabel2.TabIndex = 1; + this.metroLabel2.Text = "版本号V1.2,更新时间2025.11.22。"; + // + // FrmHelper + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(531, 332); + this.Controls.Add(this.metroLabel2); + this.Controls.Add(this.metroLabel1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Movable = false; + this.Name = "FrmHelper"; + this.Resizable = false; + this.ShadowType = MetroFramework.Forms.MetroFormShadowType.AeroShadow; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.Text = "帮助页面"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private MetroFramework.Controls.MetroLabel metroLabel1; + private MetroFramework.Controls.MetroLabel metroLabel2; + } +} \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmHelper.resx b/JY.Inspection/Frm/FrmHelper.resx new file mode 100644 index 0000000..acb5bb2 --- /dev/null +++ b/JY.Inspection/Frm/FrmHelper.resx @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlN + UABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAWU1QAFpNUABZTVASWU1QH1lNUB9ZTVAfWU1QH1lN + UB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUBJaTVAAWU1QAFlN + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXE5OAFlNUABZTVAFWU1QaFlLUM1YS0/gWEtQ4FhL + UOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS0/gWUtQzVlN + UGhZTVAFWU1QAFxOTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWS1EAWU1QAFlNUE5ZTlD0YGxY/2eH + Xv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eH + Xv9gbFj/WU5Q9FlNUE5ZTVAAVktRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhNUABaTVAAWUtQkl1c + VP9xtWn/dchu/3TIbf90yG3/dMht/3TIbf90yG3/dMht/3THbf91yG7/dMht/3TIbf90yG3/dMht/3TI + bf90yG3/dchu/3G1af9dXFT/WUtQklpNUABYTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNH + UAFYS0+fX2RW/3K+a/9zxm3/c8Vs/3PFbP9zxWz/c8Vs/3PFbP90xm3/b7Fo/3G6av90xm3/c8Vs/3PF + bf90xm3/dMZt/3TGbf90xm3/c79s/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYTFAAU0dQAVhKT59gZVf/fsp1/4HVd/+B1Hf/gdR3/4HUd/+B1Hf/gdR3/4HWd/9tnWX/Z4lf/3/S + dv+B1Hf/fdF1/3fJb/90xm3/dMZt/3TGbf9zvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+T4Yb/mfCL/5nvi/+Z74v/me+L/5nvi/+Z74v/lu2J/3Cg + aP9cV1L/gr92/5nwi/+Y7or/keaF/3/Sdv90xm3/dMZt/3O+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nvi/+Z74v/me+L/5nv + i/+T6ob/bp5l/09ZYv9ieGL/keCD/5rwjP+a8Iv/leuI/3zPdP90xm3/c75r/19kVv9YS0+fU0dQAVhM + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nwi/+Z74v/me+L/5nv + i/+Z74v/mvCM/4/lg/9tmmH/OXuO/zp6jf92nmn/mO6K/5nvi/+a8Iz/jOCA/3XHbf9zvmv/X2RW/1hL + T59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+U4ob/mfCL/5nv + i/+Z74v/me+L/5nvi/+U64f/gtl5/2yYX/82gJT/ELXe/1Nsaf+HyXn/mvGM/5nvi/+T6Ib/d8pw/3K+ + a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Ti + hv+Z8Iv/me+L/5nvi/+T6ob/hdZ6/3W0av9pj17/XGtb/y+Ko/8Az///J5Ox/2iAYf+T5Yb/mvCM/5Tq + h/95y3H/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhK + T59kaFr/lOKG/5nwi/+Z8Iv/idZ9/22aZf9ed1//SnB0/zCHoP8Xq9D/Bcb0/wDP//8Fx/b/P3aE/3uq + bv+Z8Iv/leqH/3nMcf9yvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhM + UABTR1ABWEpPn2RoWv+U4ob/mfCL/5rxjP+Kzn3/WWJe/yGau/8GxPL/AM///wDR//8Az///BMf3/w63 + 4v8wgpz/X2VY/4zVf/+V64j/ecxx/3K+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5jtiv9wjmj/JZWz/wDQ//8Azv//FLHX/zCI + oP9GdX7/XHZp/26MaP9+r3L/kd+E/5XriP95zHH/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nwi/+Z74v/mvGM/4vKe/9McnX/CMHv/wLL + +/9AdoP/dpRk/4vJe/+T4YX/mO6K/5rxjP+a8Iz/lOqH/3nMcf9yvmv/X2RW/1hLT59TR1ABWExQAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+U4ob/mfCL/5nvi/+Z74v/mOyK/2+K + Z/8jmLn/CMDt/1Nzbv+Q2oH/m/OM/5nwi/+Z74v/me+L/5nvi/+V6of/ecxx/3K+a/9fZFb/WEtPn1NH + UAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nv + i/+a8Yz/isZ6/0h1fP8cocX/ZoBo/5fpiP+Z74v/me+L/5nvi/+Z74v/me+L/5Xqh/95zHH/cr5r/19k + Vv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nw + i/+Z74v/me+L/5nvi/+Y64n/bIlq/0Nmdv91mW3/mvCL/5nvi/+Z74v/me+L/5nvi/+Z74v/leqH/3nM + cf9yvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2Ro + Wv+U4ob/mfCL/5nvi/+Z74v/me+L/5rxjP+Iwnv/XVZT/4K2dv+a8oz/me+L/5nvi/+Z74v/me+L/5nv + i/+V6of/ecxx/3K+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNH + UAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nvi/+Z74v/me+L/5fpif9yi2f/jM9//5rxjP+Z74v/me+L/5nv + i/+Z74v/me+L/5Xqh/95zHH/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYTFAAUkdQAFhKT55kaFr/leSH/5ryjP+a8Yz/mvGM/5rxjP+a8Yz/mvKM/5DYg/+W6Ij/mvKM/5rx + jP+a8Yz/mvGM/5rxjP+a8oz/leyI/3nNcf9zwGz/X2RW/1hKT55SR1AAWExQAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhMUABXSVABWEtPoWFhV/+FvHj/icd8/4nGfP+Jxnz/icZ8/4nGfP+Jxnz/icd8/4nH + fP+Jxnz/icZ8/4nGfP+Jxnz/icZ8/4nHfP+Gw3n/caxp/2yiZP9dXlT/WUtQoVdJUAFYTFAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWUxQAFlLUAJZTVCnWk5R/1xTU/9cU1L/XFNS/1xTUv9cU1L/XFNS/1xT + Uv9cU1L/XFNS/1xTUv9cU1L/XFNS/1xTUv9cU1L/XFNS/1tTUv9aUlH/WlJR/1lOUP9ZTVCnWUtQAllM + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAW05QAFlMUJldUlT/gYF8/42Qif+MkIj/jJCI/4yQ + iP+MkIj/jJCI/4yQiP+MkIj/jJCI/4yQiP+MkIj/jJCI/4yQiP+MkIj/jJCI/42Qif+BgXz/XVJU/1lM + UJlbTlEAWU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFtGTQBZTVAAWU1QVFpOUfdtZ2b/fn15/35+ + ef9+fnn/fn55/39+ef9+fnn/fn55/35+ef9+fnn/fn55/35+ef9/fnn/fn55/35+ef9+fnn/fn15/21n + Zv9aTlH3WU1QVFlNUABbRk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVlNTAFlNUABZTVAHWU1Qb1hM + T9JXS07lV0tO5FdLTuVYS074WExP/1pOUf9aTlH/Wk5R/1pOUf9aTlH/Wk5R/1hMT/9YS074V0tO5VdL + TuRXS07lWExP0llNUG9ZTVAGWU1QAFZTUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWU1QAFlN + UABbTk8AWU1QFllNUCNZTVAjWU1QKVhMT8JiV1n/fHN2/311d/99dXf/fXV3/311d/98dHb/Ylda/1hM + T8JZTVApWU1QI1lNUCNZTVAVXE5QAFlNUABZTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAWU1QAFlNUABZTVAAWU1QAFlNUABWSlAAWExPpV5TVv9yaGr/c2ps/3NqbP9zamz/c2ps/3Jo + av9eU1b/WExPpVZKUQFZTVAAWU1QAFlNUABYTVAAWU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVklRAFlNUABZTVA7WU1QwlhMT+BYTE/gWExP4FhM + T+BYTE/gWExP4FlNUMJZTVA7WU1QAFZKUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFEAWE1QAFlNUABZTVAPWU1QH1lN + UB9ZTVAfWU1QH1lNUB9ZTVAfWU1QD1lNUABYTFEAWExRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAWE1QAFlN + UABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA+AAAH/AAAA/gAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH8AAAD/gAAB//gAH//4AB///AA/8= + + + \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmHistoricalDataQuery.cs b/JY.Inspection/Frm/FrmHistoricalDataQuery.cs new file mode 100644 index 0000000..4da8337 --- /dev/null +++ b/JY.Inspection/Frm/FrmHistoricalDataQuery.cs @@ -0,0 +1,349 @@ +using System; +using System.Data; +using System.IO; +using System.Threading; +using System.Windows.Forms; +using JY.DAL; +using JY.Utility; +using System.Drawing; +using Newtonsoft.Json; +using JYControl; +using JY.MES.Entity; +using JY.MES; +using OfficeOpenXml; +using MiniExcelLibs; + +namespace JY.Inspection.Frm +{ + public partial class FrmHistoricalDataQuery : MetroFramework.Forms.MetroForm + { + public delegate void myDelegate(DataTable t); + public delegate void PDelegate(); + Thread tSo; + int type = 0;//查询类型 + int resulttype = 0;//结果类型 + DataTable dts = null; + /// + /// 用于电芯进站时设备与FMS校验电芯合法性 + /// + string CheckBarCodeInUrl = ""; + /// + /// 用于电芯出站时向FMS上报出站及生产数据 + /// + string BarCodeOutUrl = ""; + /// + /// MES上传验证码 + /// + string authorization = ""; + + /// + /// 数据库访问接口 + /// + private IDbHelper dbHelper = new OpSqlDataBase(); + public FrmHistoricalDataQuery() + { + InitializeComponent(); + CheckForIllegalCrossThreadCalls = false; + } + /// + /// 窗体加载事件 + /// + /// + /// + private void FrmHistoricalDataQuery_Load(object sender, EventArgs e) + { + cbSelectType.SelectedIndex = 0; + resultSelectType.SelectedIndex = 0; + cmbFlag.SelectedIndex = 0; + dtStartTime.Value = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm")); + dtEndTime.Value = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm")); + //为dgv添加复选框列 + DataGridViewCheckBoxColumn checkbox = new DataGridViewCheckBoxColumn(); + //列显示名称 + checkbox.HeaderText = "选择"; + checkbox.Name = "IsChecked"; + checkbox.TrueValue = true; + checkbox.FalseValue = false; + checkbox.DataPropertyName = "IsChecked"; + //列宽 + checkbox.Width = 30; + //列大小不改变 + checkbox.Resizable = DataGridViewTriState.False; + //添加的checkbox在dgv的第一列 + this.dgvData.Columns.Insert(0, checkbox); + } + + private void btnSelect_Click(object sender, EventArgs e) + { + + try + { + tSo = new Thread(new ThreadStart(ThreadWork)); + tSo.IsBackground = true; + tSo.Start(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message.ToString() + ",数据查询失败", "查询提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + this.dgvData.DataSource = null; + type = cbSelectType.SelectedIndex; + resulttype = resultSelectType.SelectedIndex; + } + + + private void ThreadWork() + { + lblSelectStures.BeginInvoke(new PDelegate(aa)); + + string strDate1 = dtStartTime.Value.ToString("yyyy-MM-dd HH:mm") + ":01"; + string strDate2 = dtEndTime.Value.ToString("yyyy-MM-dd HH:mm") + ":01"; + if (dtEndTime.Value.Year != dtStartTime.Value.Year) + { + MessageBox.Show("请选择日期必须在同一年份内!"); + lblSelectStures.BeginInvoke(new PDelegate(bb)); + return; + } + string flag = cmbFlag.Text; + string strBarcode = txtBarCode.Text.Trim(); + // var dt = dbHelper.GetTestData(type, strBarcode, strDate1, strDate2, flag); + var dt = dbHelper.GetTestData2(type,resulttype, strBarcode, strDate1, strDate2, flag); + if (dt == null || dt.Rows.Count == 0) + { + MessageBox.Show("此时间段无数据或无此条码数据", "系统提示"); + lblSelectStures.BeginInvoke(new PDelegate(bb)); + return; + } + this.dgvData.BeginInvoke(new myDelegate(FillData), new object[] { dt });//异步调用(来填充) + lblSelectStures.BeginInvoke(new PDelegate(bb)); + + } + + + + private void FillData(DataTable dt) + { + dts = dt; + this.dgvData.DataSource = dt.DefaultView; + } + + private void aa() + { + this.lblSelectStures.Text = "正在查询数据..."; + } + private void bb() + { + this.lblSelectStures.Text = "查询结束"; + } + + + private void btnExcel_Click(object sender, EventArgs e) + { + if (dts != null && dgvData.Columns.Count <= 0) + { + MessageBox.Show("请先查询数据,再进行导出", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + SaveFileDialog saveFileDialog = new SaveFileDialog(); + saveFileDialog.Title = "导出Excel"; + saveFileDialog.Filter = "Excel文件(*.xlsx)|*.xlsx"; + saveFileDialog.FilterIndex = 1; + //保存对话框是否记忆上次打开的目录 + saveFileDialog.RestoreDirectory = true; + //设置默认的文件名 + saveFileDialog.DefaultExt = "xlsx"; + //saveFileDialog.DefaultFileName = "查询结果" + DateTime.Now.ToString("yyyyMMddHHmmss"); + var dialogResult = saveFileDialog.ShowDialog(this); + + if (dialogResult == DialogResult.OK) + { + + //string filter = saveFileDialog.FileName.Substring(saveFileDialog.FileName.LastIndexOf(".") + 1); + try + { + MiniExcel.SaveAs(saveFileDialog.FileName, dts); + //ExcelPackage.License.SetNonCommercialOrganization("My Noncommercial organization"); + //EPPlusExcelHelper excelHelper = new EPPlusExcelHelper(saveFileDialog.FileName); + //excelHelper.ExportDataTable("sheet1", dts); + Thread.Sleep(50); + MessageBox.Show("数据导出成功!"); + } + catch (Exception ex) + { + MessageBox.Show("保存的EXCEL已有数据,无法覆盖,重新创建" + ex.Message); + } + + + //if (MessageBox.Show("保存成功,是否打开文件?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes) + //{ + // System.Diagnostics.Process.Start(saveFileDialog.FileName); + //} + } + } + + private void dgvData_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) + { + //自动编号,与数据无关 + Rectangle rectangle = new Rectangle(e.RowBounds.Location.X, + e.RowBounds.Location.Y, + dgvData.RowHeadersWidth - 4, + e.RowBounds.Height); + TextRenderer.DrawText(e.Graphics, + (e.RowIndex + 1).ToString(), + dgvData.RowHeadersDefaultCellStyle.Font, + rectangle, + dgvData.RowHeadersDefaultCellStyle.ForeColor, + TextFormatFlags.VerticalCenter | TextFormatFlags.Right); + } + /// + /// 上传MES按钮设置 + /// + /// + /// + private void btnUpMES_Click(object sender, EventArgs e) + { + if (dgvData.Columns.Count <= 1) + { + MessageBox.Show("请先查询数据,再进行上传MES操作", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + try + { + if (cbSelectType.Text=="查询进站数据")//上料 + { + foreach (DataGridViewRow row in dgvData.Rows) + { + if (Convert.ToBoolean(row.Cells[0].Value)) + { + if (Convert.ToInt32(row.Cells["状态"].Value) == 1 || Convert.ToInt32(row.Cells["状态"].Value) == 2) + { + MessageBox.Show("勾选电芯数据已上传", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + else + { + + JY.MES.FMS.FMS_In fMS_In = new MES.FMS.FMS_In(); + + //fMS_In.systemCode = Global.systemConfig.systemCode; + //fMS_In.houseCode = Global.systemConfig.houseCode; + //fMS_In.skuCode = Convert.ToString(row.Cells["条码"].Value); + //fMS_In.deviceCode = Global.systemConfig.deviceCode; + //fMS_In.processCode = Global.systemConfig.processCode; + + + string strJosn = JsonConvert.SerializeObject(fMS_In); + LogManagerControl.AddLog($"PC->FMS[电芯出站]:{strJosn}", LogAddtype.MES); + var result = JY.MES.FMS.MesHelper_EVE.MES_Inbound(fMS_In); + string strRes = "statusCode:" + "[" + result.statusCode + "]" + "statusMessage" + "[" + result.statusMessage + "]"; + LogManagerControl.AddLog($"FMS->PC[电芯出站]:{strRes}", LogAddtype.MES); + + + string NowTime = DateTime.Now.ToString("yyyy - MM - dd HH: mm: ss"); + var result1 = @" UPDATE FeedingData set Flag=2,UploadMESTime='" + NowTime + "' where[ID]=" + Convert.ToString(row.Cells["唯一ID"].Value); + //var result2 = @" UPDATE FeedingData set UploadMESTime='" + NowTime + "' where[ID]='" + Convert.ToString(row.Cells["唯一ID"].Value) + "'"; + DataTable dt = SqlHelper.QueryTable(result1); + } + } + } + } + else//下料 + { + foreach (DataGridViewRow row in dgvData.Rows) + { + if (Convert.ToBoolean(row.Cells[0].Value)) + { + if (Convert.ToInt32(row.Cells["状态"].Value) == 1 || Convert.ToInt32(row.Cells["状态"].Value) == 2) + { + MessageBox.Show("勾选电芯数据已上传", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + else + { + + JY.MES.FMS.FMS_Out fMS_Out = new MES.FMS.FMS_Out(); + //fMS_In.deviceCode = Global.systemConfig.eqp_code; + //fMS_In.houseCode = "test11"; + //fMS_In.skuCode = m.BarCode; + //fMS_In.systemCode = "win10"; + //fMS_In.processCode = Global.systemConfig.seq_code; + //fMS_In.ngCode = ""; + //fMS_Out.systemCode = Global.systemConfig.systemCode; + //fMS_Out.houseCode = Global.systemConfig.houseCode; + //fMS_Out.skuCode = Convert.ToString(row.Cells["条码"].Value); + //fMS_Out.deviceCode = Global.systemConfig.deviceCode; + //fMS_Out.processCode = Global.systemConfig.processCode; + fMS_Out.testResult = "NG"; + fMS_Out.ngCode = "0"; + + JY.MES.FMS.processData ProData = new JY.MES.FMS.processData(); + + ProData.inTime = Convert.ToString(row.Cells["进站时间"].Value); + ProData.outTime = Convert.ToString(row.Cells["进站时间"].Value); + ProData.cspdjg = Convert.ToString(row.Cells["综合结果"].Value); + ProData.cssj = ""; + ProData.cspc = ""; + ProData.csjg = Convert.ToString(row.Cells["综合结果"].Value); + ProData.fcbj = ""; + ProData.fccs = ""; + ProData.fcsj = ""; + ProData.fcyy = ""; + ProData.ngyy = Convert.ToString(row.Cells["备注"].Value); + ProData.ngsj = ""; + ProData.ngwz = ""; + ProData.hjwd = ""; + ProData.hjsd = ""; + ProData.kqjjd = ""; + ProData.workShift = Convert.ToString(row.Cells["班次"].Value); + fMS_Out.processData = ProData; + + string strJosn = JsonConvert.SerializeObject(fMS_Out); + LogManagerControl.AddLog($"PC->FMS[电芯出站]:{strJosn}", LogAddtype.MES); + var result = JY.MES.FMS.MesHelper_EVE.MES_Outbound(fMS_Out); + string strRes = "statusCode:" + "[" + result.statusCode + "]" + "statusMessage" + "[" + result.statusMessage + "]"; + LogManagerControl.AddLog($"FMS->PC[电芯出站]:{strRes}", LogAddtype.MES); + + string NowTime = DateTime.Now.ToString("yyyy - MM - dd HH: mm: ss"); + var result1 = @" UPDATE BlankingData set Flag=2,strUploadMESTime='" + NowTime + "' where[ID]=" + Convert.ToInt32(row.Cells["唯一ID"].Value); + //var result2 = @" UPDATE BlankingData set UploadMESTime='" + NowTime + "' where[ID]='" + Convert.ToString(row.Cells["唯一ID"].Value) + "'"; + DataTable dt = SqlHelper.QueryTable(result1); + } + } + } + } + } + catch + { + MessageBox.Show("手动上传MES失败", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + MessageBox.Show("手动上传MES成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + + + } + /// + /// dgvCellMouseClick鼠标点击列事件 + /// + /// + /// + private void dgvData_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) + { + //不是序号列和标题列时才执行 + if (e.RowIndex != -1 && e.ColumnIndex != -1) + { + //checkbox勾上 + if ((bool)dgvData.Rows[e.RowIndex].Cells[0].EditedFormattedValue == true) + { + //选中改为不选中 + this.dgvData.Rows[e.RowIndex].Cells[0].Value = false; + } + else + { + //不选中改为选中 + this.dgvData.Rows[e.RowIndex].Cells[0].Value = true; + } + } + } + } +} diff --git a/JY.Inspection/Frm/FrmHistoricalDataQuery.designer.cs b/JY.Inspection/Frm/FrmHistoricalDataQuery.designer.cs new file mode 100644 index 0000000..f73a1b9 --- /dev/null +++ b/JY.Inspection/Frm/FrmHistoricalDataQuery.designer.cs @@ -0,0 +1,386 @@ + +namespace JY.Inspection.Frm +{ + partial class FrmHistoricalDataQuery + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmHistoricalDataQuery)); + this.txtBarCode = new MetroFramework.Controls.MetroTextBox(); + this.metroLabel1 = new MetroFramework.Controls.MetroLabel(); + this.metroLabel3 = new MetroFramework.Controls.MetroLabel(); + this.btnSelect = new MetroFramework.Controls.MetroButton(); + this.btnExcel = new MetroFramework.Controls.MetroButton(); + this.metroLabel4 = new MetroFramework.Controls.MetroLabel(); + this.cbSelectType = new MetroFramework.Controls.MetroComboBox(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.dgvData = new MetroFramework.Controls.MetroGrid(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.metroLabel5 = new MetroFramework.Controls.MetroLabel(); + this.btnUpMES = new MetroFramework.Controls.MetroButton(); + this.cmbFlag = new MetroFramework.Controls.MetroComboBox(); + this.dtEndTime = new System.Windows.Forms.DateTimePicker(); + this.dtStartTime = new System.Windows.Forms.DateTimePicker(); + this.lblSelectStures = new System.Windows.Forms.Label(); + this.metroLabel2 = new MetroFramework.Controls.MetroLabel(); + this.resultSelectType = new MetroFramework.Controls.MetroComboBox(); + this.metroLabel6 = new MetroFramework.Controls.MetroLabel(); + this.tableLayoutPanel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgvData)).BeginInit(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // txtBarCode + // + // + // + // + this.txtBarCode.CustomButton.Image = null; + this.txtBarCode.CustomButton.Location = new System.Drawing.Point(171, 1); + this.txtBarCode.CustomButton.Name = ""; + this.txtBarCode.CustomButton.Size = new System.Drawing.Size(21, 21); + this.txtBarCode.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.txtBarCode.CustomButton.TabIndex = 1; + this.txtBarCode.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.txtBarCode.CustomButton.UseSelectable = true; + this.txtBarCode.CustomButton.Visible = false; + this.txtBarCode.FontSize = MetroFramework.MetroTextBoxSize.Medium; + this.txtBarCode.Lines = new string[0]; + this.txtBarCode.Location = new System.Drawing.Point(7, 186); + this.txtBarCode.MaxLength = 32767; + this.txtBarCode.Name = "txtBarCode"; + this.txtBarCode.PasswordChar = '\0'; + this.txtBarCode.PromptText = "输入要查询的条码"; + this.txtBarCode.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.txtBarCode.SelectedText = ""; + this.txtBarCode.SelectionLength = 0; + this.txtBarCode.SelectionStart = 0; + this.txtBarCode.ShortcutsEnabled = true; + this.txtBarCode.Size = new System.Drawing.Size(193, 23); + this.txtBarCode.TabIndex = 1; + this.txtBarCode.UseSelectable = true; + this.txtBarCode.WaterMark = "输入要查询的条码"; + this.txtBarCode.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.txtBarCode.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // metroLabel1 + // + this.metroLabel1.AutoSize = true; + this.metroLabel1.Location = new System.Drawing.Point(7, 34); + this.metroLabel1.Name = "metroLabel1"; + this.metroLabel1.Size = new System.Drawing.Size(107, 19); + this.metroLabel1.TabIndex = 4; + this.metroLabel1.Text = "查询起始时间:"; + // + // metroLabel3 + // + this.metroLabel3.AutoSize = true; + this.metroLabel3.Location = new System.Drawing.Point(9, 164); + this.metroLabel3.Name = "metroLabel3"; + this.metroLabel3.Size = new System.Drawing.Size(79, 19); + this.metroLabel3.TabIndex = 6; + this.metroLabel3.Text = "查询条码:"; + // + // btnSelect + // + this.btnSelect.Location = new System.Drawing.Point(10, 360); + this.btnSelect.Name = "btnSelect"; + this.btnSelect.Size = new System.Drawing.Size(75, 23); + this.btnSelect.TabIndex = 7; + this.btnSelect.Text = "查 询"; + this.btnSelect.UseSelectable = true; + this.btnSelect.Click += new System.EventHandler(this.btnSelect_Click); + // + // btnExcel + // + this.btnExcel.Location = new System.Drawing.Point(123, 360); + this.btnExcel.Name = "btnExcel"; + this.btnExcel.Size = new System.Drawing.Size(75, 23); + this.btnExcel.TabIndex = 8; + this.btnExcel.Text = "导 出"; + this.btnExcel.UseSelectable = true; + this.btnExcel.Click += new System.EventHandler(this.btnExcel_Click); + // + // metroLabel4 + // + this.metroLabel4.AutoSize = true; + this.metroLabel4.Location = new System.Drawing.Point(9, 230); + this.metroLabel4.Name = "metroLabel4"; + this.metroLabel4.Size = new System.Drawing.Size(79, 19); + this.metroLabel4.TabIndex = 11; + this.metroLabel4.Text = "查询类型:"; + // + // cbSelectType + // + this.cbSelectType.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.cbSelectType.FormattingEnabled = true; + this.cbSelectType.ItemHeight = 23; + this.cbSelectType.Items.AddRange(new object[] { + "查询进站数据", + "查询出站数据"}); + this.cbSelectType.Location = new System.Drawing.Point(7, 252); + this.cbSelectType.Name = "cbSelectType"; + this.cbSelectType.Size = new System.Drawing.Size(193, 29); + this.cbSelectType.TabIndex = 12; + this.cbSelectType.UseSelectable = true; + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 2; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 220F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanel1.Controls.Add(this.dgvData, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.groupBox1, 0, 0); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(20, 60); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 1; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(1044, 546); + this.tableLayoutPanel1.TabIndex = 13; + // + // dgvData + // + this.dgvData.AllowUserToAddRows = false; + this.dgvData.AllowUserToDeleteRows = false; + this.dgvData.AllowUserToResizeRows = false; + this.dgvData.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.dgvData.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dgvData.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.None; + this.dgvData.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle1.BackColor = System.Drawing.Color.SkyBlue; + dataGridViewCellStyle1.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + dataGridViewCellStyle1.ForeColor = System.Drawing.Color.Black; + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(198)))), ((int)(((byte)(247))))); + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvData.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + this.dgvData.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + dataGridViewCellStyle2.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + dataGridViewCellStyle2.ForeColor = System.Drawing.Color.Black; + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(198)))), ((int)(((byte)(247))))); + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvData.DefaultCellStyle = dataGridViewCellStyle2; + this.dgvData.Dock = System.Windows.Forms.DockStyle.Fill; + this.dgvData.EnableHeadersVisualStyles = false; + this.dgvData.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + this.dgvData.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.dgvData.Location = new System.Drawing.Point(223, 3); + this.dgvData.Name = "dgvData"; + this.dgvData.ReadOnly = true; + this.dgvData.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None; + dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle3.BackColor = System.Drawing.Color.White; + dataGridViewCellStyle3.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + dataGridViewCellStyle3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + dataGridViewCellStyle3.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(198)))), ((int)(((byte)(247))))); + dataGridViewCellStyle3.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvData.RowHeadersDefaultCellStyle = dataGridViewCellStyle3; + this.dgvData.RowHeadersWidth = 51; + this.dgvData.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; + this.dgvData.RowTemplate.Height = 23; + this.dgvData.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgvData.Size = new System.Drawing.Size(819, 540); + this.dgvData.TabIndex = 16; + this.dgvData.CellMouseClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.dgvData_CellMouseClick); + this.dgvData.RowPostPaint += new System.Windows.Forms.DataGridViewRowPostPaintEventHandler(this.dgvData_RowPostPaint); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.resultSelectType); + this.groupBox1.Controls.Add(this.metroLabel6); + this.groupBox1.Controls.Add(this.metroLabel5); + this.groupBox1.Controls.Add(this.btnUpMES); + this.groupBox1.Controls.Add(this.cmbFlag); + this.groupBox1.Controls.Add(this.dtEndTime); + this.groupBox1.Controls.Add(this.dtStartTime); + this.groupBox1.Controls.Add(this.lblSelectStures); + this.groupBox1.Controls.Add(this.metroLabel2); + this.groupBox1.Controls.Add(this.btnExcel); + this.groupBox1.Controls.Add(this.btnSelect); + this.groupBox1.Controls.Add(this.cbSelectType); + this.groupBox1.Controls.Add(this.metroLabel1); + this.groupBox1.Controls.Add(this.metroLabel4); + this.groupBox1.Controls.Add(this.txtBarCode); + this.groupBox1.Controls.Add(this.metroLabel3); + this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBox1.Location = new System.Drawing.Point(3, 3); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(214, 540); + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "查询条件"; + // + // metroLabel5 + // + this.metroLabel5.AutoSize = true; + this.metroLabel5.Location = new System.Drawing.Point(9, 425); + this.metroLabel5.Name = "metroLabel5"; + this.metroLabel5.Size = new System.Drawing.Size(91, 19); + this.metroLabel5.TabIndex = 53; + this.metroLabel5.Text = "上传MES状态"; + this.metroLabel5.Visible = false; + // + // btnUpMES + // + this.btnUpMES.Location = new System.Drawing.Point(10, 392); + this.btnUpMES.Name = "btnUpMES"; + this.btnUpMES.Size = new System.Drawing.Size(75, 23); + this.btnUpMES.TabIndex = 51; + this.btnUpMES.Text = "上传MES"; + this.btnUpMES.UseSelectable = true; + this.btnUpMES.Visible = false; + this.btnUpMES.Click += new System.EventHandler(this.btnUpMES_Click); + // + // cmbFlag + // + this.cmbFlag.FormattingEnabled = true; + this.cmbFlag.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.cmbFlag.ItemHeight = 23; + this.cmbFlag.Items.AddRange(new object[] { + "全部", + "自动上传MES数据", + "手动上传MES数据", + "未上传MES数据"}); + this.cmbFlag.Location = new System.Drawing.Point(6, 447); + this.cmbFlag.Name = "cmbFlag"; + this.cmbFlag.Size = new System.Drawing.Size(192, 29); + this.cmbFlag.TabIndex = 50; + this.cmbFlag.UseSelectable = true; + this.cmbFlag.Visible = false; + // + // dtEndTime + // + this.dtEndTime.CustomFormat = "yyyy-MM-dd HH:mm:ss"; + this.dtEndTime.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.dtEndTime.Format = System.Windows.Forms.DateTimePickerFormat.Custom; + this.dtEndTime.Location = new System.Drawing.Point(10, 118); + this.dtEndTime.Name = "dtEndTime"; + this.dtEndTime.Size = new System.Drawing.Size(189, 26); + this.dtEndTime.TabIndex = 17; + // + // dtStartTime + // + this.dtStartTime.CalendarForeColor = System.Drawing.SystemColors.ControlLight; + this.dtStartTime.CustomFormat = "yyyy-MM-dd HH:mm:ss"; + this.dtStartTime.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.dtStartTime.Format = System.Windows.Forms.DateTimePickerFormat.Custom; + this.dtStartTime.Location = new System.Drawing.Point(10, 56); + this.dtStartTime.Name = "dtStartTime"; + this.dtStartTime.Size = new System.Drawing.Size(189, 26); + this.dtStartTime.TabIndex = 16; + // + // lblSelectStures + // + this.lblSelectStures.AutoSize = true; + this.lblSelectStures.Location = new System.Drawing.Point(59, 354); + this.lblSelectStures.Name = "lblSelectStures"; + this.lblSelectStures.Size = new System.Drawing.Size(0, 12); + this.lblSelectStures.TabIndex = 15; + // + // metroLabel2 + // + this.metroLabel2.AutoSize = true; + this.metroLabel2.Location = new System.Drawing.Point(7, 96); + this.metroLabel2.Name = "metroLabel2"; + this.metroLabel2.Size = new System.Drawing.Size(107, 19); + this.metroLabel2.TabIndex = 5; + this.metroLabel2.Text = "查询结束时间:"; + // + // resultSelectType + // + this.resultSelectType.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.resultSelectType.FormattingEnabled = true; + this.resultSelectType.ItemHeight = 23; + this.resultSelectType.Items.AddRange(new object[] { + "全部", + "OK", + "NG"}); + this.resultSelectType.Location = new System.Drawing.Point(8, 317); + this.resultSelectType.Name = "resultSelectType"; + this.resultSelectType.Size = new System.Drawing.Size(193, 29); + this.resultSelectType.TabIndex = 55; + this.resultSelectType.UseSelectable = true; + // + // metroLabel6 + // + this.metroLabel6.AutoSize = true; + this.metroLabel6.Location = new System.Drawing.Point(10, 295); + this.metroLabel6.Name = "metroLabel6"; + this.metroLabel6.Size = new System.Drawing.Size(79, 19); + this.metroLabel6.TabIndex = 54; + this.metroLabel6.Text = "结果类型:"; + // + // FrmHistoricalDataQuery + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1084, 626); + this.Controls.Add(this.tableLayoutPanel1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Movable = false; + this.Name = "FrmHistoricalDataQuery"; + this.Text = "历史数据查询"; + this.Load += new System.EventHandler(this.FrmHistoricalDataQuery_Load); + this.tableLayoutPanel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dgvData)).EndInit(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + private MetroFramework.Controls.MetroTextBox txtBarCode; + private MetroFramework.Controls.MetroLabel metroLabel1; + private MetroFramework.Controls.MetroLabel metroLabel3; + private MetroFramework.Controls.MetroButton btnSelect; + private MetroFramework.Controls.MetroButton btnExcel; + private MetroFramework.Controls.MetroLabel metroLabel4; + private MetroFramework.Controls.MetroComboBox cbSelectType; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.GroupBox groupBox1; + private MetroFramework.Controls.MetroLabel metroLabel2; + private MetroFramework.Controls.MetroGrid dgvData; + private System.Windows.Forms.Label lblSelectStures; + private System.Windows.Forms.DateTimePicker dtStartTime; + private System.Windows.Forms.DateTimePicker dtEndTime; + private MetroFramework.Controls.MetroButton btnUpMES; + private MetroFramework.Controls.MetroComboBox cmbFlag; + private MetroFramework.Controls.MetroLabel metroLabel5; + private MetroFramework.Controls.MetroComboBox resultSelectType; + private MetroFramework.Controls.MetroLabel metroLabel6; + } +} \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmHistoricalDataQuery.resx b/JY.Inspection/Frm/FrmHistoricalDataQuery.resx new file mode 100644 index 0000000..acb5bb2 --- /dev/null +++ b/JY.Inspection/Frm/FrmHistoricalDataQuery.resx @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlN + UABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAWU1QAFpNUABZTVASWU1QH1lNUB9ZTVAfWU1QH1lN + UB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUBJaTVAAWU1QAFlN + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXE5OAFlNUABZTVAFWU1QaFlLUM1YS0/gWEtQ4FhL + UOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS0/gWUtQzVlN + UGhZTVAFWU1QAFxOTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWS1EAWU1QAFlNUE5ZTlD0YGxY/2eH + Xv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eH + Xv9gbFj/WU5Q9FlNUE5ZTVAAVktRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhNUABaTVAAWUtQkl1c + VP9xtWn/dchu/3TIbf90yG3/dMht/3TIbf90yG3/dMht/3THbf91yG7/dMht/3TIbf90yG3/dMht/3TI + bf90yG3/dchu/3G1af9dXFT/WUtQklpNUABYTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNH + UAFYS0+fX2RW/3K+a/9zxm3/c8Vs/3PFbP9zxWz/c8Vs/3PFbP90xm3/b7Fo/3G6av90xm3/c8Vs/3PF + bf90xm3/dMZt/3TGbf90xm3/c79s/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYTFAAU0dQAVhKT59gZVf/fsp1/4HVd/+B1Hf/gdR3/4HUd/+B1Hf/gdR3/4HWd/9tnWX/Z4lf/3/S + dv+B1Hf/fdF1/3fJb/90xm3/dMZt/3TGbf9zvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+T4Yb/mfCL/5nvi/+Z74v/me+L/5nvi/+Z74v/lu2J/3Cg + aP9cV1L/gr92/5nwi/+Y7or/keaF/3/Sdv90xm3/dMZt/3O+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nvi/+Z74v/me+L/5nv + i/+T6ob/bp5l/09ZYv9ieGL/keCD/5rwjP+a8Iv/leuI/3zPdP90xm3/c75r/19kVv9YS0+fU0dQAVhM + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nwi/+Z74v/me+L/5nv + i/+Z74v/mvCM/4/lg/9tmmH/OXuO/zp6jf92nmn/mO6K/5nvi/+a8Iz/jOCA/3XHbf9zvmv/X2RW/1hL + T59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+U4ob/mfCL/5nv + i/+Z74v/me+L/5nvi/+U64f/gtl5/2yYX/82gJT/ELXe/1Nsaf+HyXn/mvGM/5nvi/+T6Ib/d8pw/3K+ + a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Ti + hv+Z8Iv/me+L/5nvi/+T6ob/hdZ6/3W0av9pj17/XGtb/y+Ko/8Az///J5Ox/2iAYf+T5Yb/mvCM/5Tq + h/95y3H/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhK + T59kaFr/lOKG/5nwi/+Z8Iv/idZ9/22aZf9ed1//SnB0/zCHoP8Xq9D/Bcb0/wDP//8Fx/b/P3aE/3uq + bv+Z8Iv/leqH/3nMcf9yvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhM + UABTR1ABWEpPn2RoWv+U4ob/mfCL/5rxjP+Kzn3/WWJe/yGau/8GxPL/AM///wDR//8Az///BMf3/w63 + 4v8wgpz/X2VY/4zVf/+V64j/ecxx/3K+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5jtiv9wjmj/JZWz/wDQ//8Azv//FLHX/zCI + oP9GdX7/XHZp/26MaP9+r3L/kd+E/5XriP95zHH/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nwi/+Z74v/mvGM/4vKe/9McnX/CMHv/wLL + +/9AdoP/dpRk/4vJe/+T4YX/mO6K/5rxjP+a8Iz/lOqH/3nMcf9yvmv/X2RW/1hLT59TR1ABWExQAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+U4ob/mfCL/5nvi/+Z74v/mOyK/2+K + Z/8jmLn/CMDt/1Nzbv+Q2oH/m/OM/5nwi/+Z74v/me+L/5nvi/+V6of/ecxx/3K+a/9fZFb/WEtPn1NH + UAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nv + i/+a8Yz/isZ6/0h1fP8cocX/ZoBo/5fpiP+Z74v/me+L/5nvi/+Z74v/me+L/5Xqh/95zHH/cr5r/19k + Vv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nw + i/+Z74v/me+L/5nvi/+Y64n/bIlq/0Nmdv91mW3/mvCL/5nvi/+Z74v/me+L/5nvi/+Z74v/leqH/3nM + cf9yvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2Ro + Wv+U4ob/mfCL/5nvi/+Z74v/me+L/5rxjP+Iwnv/XVZT/4K2dv+a8oz/me+L/5nvi/+Z74v/me+L/5nv + i/+V6of/ecxx/3K+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNH + UAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nvi/+Z74v/me+L/5fpif9yi2f/jM9//5rxjP+Z74v/me+L/5nv + i/+Z74v/me+L/5Xqh/95zHH/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYTFAAUkdQAFhKT55kaFr/leSH/5ryjP+a8Yz/mvGM/5rxjP+a8Yz/mvKM/5DYg/+W6Ij/mvKM/5rx + jP+a8Yz/mvGM/5rxjP+a8oz/leyI/3nNcf9zwGz/X2RW/1hKT55SR1AAWExQAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhMUABXSVABWEtPoWFhV/+FvHj/icd8/4nGfP+Jxnz/icZ8/4nGfP+Jxnz/icd8/4nH + fP+Jxnz/icZ8/4nGfP+Jxnz/icZ8/4nHfP+Gw3n/caxp/2yiZP9dXlT/WUtQoVdJUAFYTFAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWUxQAFlLUAJZTVCnWk5R/1xTU/9cU1L/XFNS/1xTUv9cU1L/XFNS/1xT + Uv9cU1L/XFNS/1xTUv9cU1L/XFNS/1xTUv9cU1L/XFNS/1tTUv9aUlH/WlJR/1lOUP9ZTVCnWUtQAllM + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAW05QAFlMUJldUlT/gYF8/42Qif+MkIj/jJCI/4yQ + iP+MkIj/jJCI/4yQiP+MkIj/jJCI/4yQiP+MkIj/jJCI/4yQiP+MkIj/jJCI/42Qif+BgXz/XVJU/1lM + UJlbTlEAWU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFtGTQBZTVAAWU1QVFpOUfdtZ2b/fn15/35+ + ef9+fnn/fn55/39+ef9+fnn/fn55/35+ef9+fnn/fn55/35+ef9/fnn/fn55/35+ef9+fnn/fn15/21n + Zv9aTlH3WU1QVFlNUABbRk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVlNTAFlNUABZTVAHWU1Qb1hM + T9JXS07lV0tO5FdLTuVYS074WExP/1pOUf9aTlH/Wk5R/1pOUf9aTlH/Wk5R/1hMT/9YS074V0tO5VdL + TuRXS07lWExP0llNUG9ZTVAGWU1QAFZTUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWU1QAFlN + UABbTk8AWU1QFllNUCNZTVAjWU1QKVhMT8JiV1n/fHN2/311d/99dXf/fXV3/311d/98dHb/Ylda/1hM + T8JZTVApWU1QI1lNUCNZTVAVXE5QAFlNUABZTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAWU1QAFlNUABZTVAAWU1QAFlNUABWSlAAWExPpV5TVv9yaGr/c2ps/3NqbP9zamz/c2ps/3Jo + av9eU1b/WExPpVZKUQFZTVAAWU1QAFlNUABYTVAAWU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVklRAFlNUABZTVA7WU1QwlhMT+BYTE/gWExP4FhM + T+BYTE/gWExP4FlNUMJZTVA7WU1QAFZKUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFEAWE1QAFlNUABZTVAPWU1QH1lN + UB9ZTVAfWU1QH1lNUB9ZTVAfWU1QD1lNUABYTFEAWExRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAWE1QAFlN + UABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA+AAAH/AAAA/gAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH8AAAD/gAAB//gAH//4AB///AA/8= + + + \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmParaConfig.cs b/JY.Inspection/Frm/FrmParaConfig.cs new file mode 100644 index 0000000..d1c0480 --- /dev/null +++ b/JY.Inspection/Frm/FrmParaConfig.cs @@ -0,0 +1,182 @@ +using JY.DAL; +using JY.Model; +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 JY.Inspection.Frm +{ + public partial class FrmParaConfig : MetroFramework.Forms.MetroForm + { + public delegate void SendParamIN(); + public SendParamIN sendParamIN; + + /// + /// 数据库访问接口 + /// + private IDbHelper dbHelper = new OpSqlDataBase(); + /// + /// 定义DataGridView数据源 + /// + private BindingList blPLCConfigBaseList = new BindingList(); + + + public FrmParaConfig() + { + InitializeComponent(); + } + + private void FrmParaEdit_Load(object sender, EventArgs e) + { + this.dgvEdit.AutoGenerateColumns = false; + this.dgvEdit.DataSource = blPLCConfigBaseList; + setComb(); + } + /// + /// 加载产品型号下拉 + /// + private void setComb() + { + var list = dbHelper.GetProductModelList(); + + cmbProductModel.DataSource = list; + cmbProductModel.DisplayMember = "ModelName"; + cmbProductModel.ValueMember = "ModelName"; + } + + /// + /// 保存数据 + /// + /// + /// + private void btnOK_Click(object sender, EventArgs e) + { + string strModelType = cmbProductModel.Text.Trim(); + if (string.IsNullOrEmpty(strModelType) || blPLCConfigBaseList.Count <= 0) + { + MessageBox.Show("产品型号和参数列表不能为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + try + { + dbHelper.AddProductParaList(blPLCConfigBaseList.ToList()); + MessageBox.Show("保存成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + catch (Exception ex) + { + MessageBox.Show("保存失败:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + /// + /// 添加型号 + /// + /// + /// + private void btnAddProductModel_Click(object sender, EventArgs e) + { + var productModel = new ProductModel(); + productModel.ModelName = txtProductModel.Text; + productModel.Remark = txtProductModel.Text; + + if (string.IsNullOrEmpty(productModel.ModelName)) + { + MessageBox.Show("产品型号不能为空!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + + try + { + dbHelper.AddProductModel(productModel); + setComb(); + MessageBox.Show("新增成功!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + catch (Exception ex) + { + MessageBox.Show("新增失败:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + //同步刷新主界面的类型选项 + sendParamIN(); + } + + /// + /// 删除型号 + /// + /// + /// + private void btnDelProductModel_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(cmbProductModel.Text.Trim())) + { + MessageBox.Show("产品型号不能为空!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + if (MessageBox.Show("删除该型号设置将无法恢复,确定要删除该产品型号?", "系统提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK) + { + try + { + dbHelper.DelProductModel(cmbProductModel.Text); + + setComb(); + MessageBox.Show("删除成功!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + catch (Exception ex) + { + MessageBox.Show("删除失败:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + + /// + /// 产品型号下拉框选择变更事件 + /// + /// + /// + private void cmbProductModel_SelectedIndexChanged(object sender, EventArgs e) + { + var list = dbHelper.GetProductParaByProdModel(cmbProductModel.Text); + blPLCConfigBaseList.Clear(); + foreach (var item in list) + { + blPLCConfigBaseList.Add(item); + } + } + + /// + /// 关闭事件 + /// + /// + /// + private void FrmParaEdit_FormClosing(object sender, FormClosingEventArgs e) + { + this.DialogResult = DialogResult.OK; + } + + /// + /// DataGrid自动添加行号 + /// + /// + /// + private void dgvEdit_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) + { + //自动编号,与数据无关 + Rectangle rectangle = new Rectangle(e.RowBounds.Location.X, + e.RowBounds.Location.Y, + dgvEdit.RowHeadersWidth - 4, + e.RowBounds.Height); + TextRenderer.DrawText(e.Graphics, + (e.RowIndex + 1).ToString(), + dgvEdit.RowHeadersDefaultCellStyle.Font, + rectangle, + dgvEdit.RowHeadersDefaultCellStyle.ForeColor, + TextFormatFlags.VerticalCenter | TextFormatFlags.Right); + } + } +} diff --git a/JY.Inspection/Frm/FrmParaConfig.designer.cs b/JY.Inspection/Frm/FrmParaConfig.designer.cs new file mode 100644 index 0000000..6e27654 --- /dev/null +++ b/JY.Inspection/Frm/FrmParaConfig.designer.cs @@ -0,0 +1,263 @@ + +namespace JY.Inspection.Frm +{ + partial class FrmParaConfig + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle4 = new System.Windows.Forms.DataGridViewCellStyle(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmParaConfig)); + this.btnAddProductModel = new MetroFramework.Controls.MetroButton(); + this.txtProductModel = new MetroFramework.Controls.MetroTextBox(); + this.metroLabel1 = new MetroFramework.Controls.MetroLabel(); + this.dgvEdit = new MetroFramework.Controls.MetroGrid(); + this.ParaName = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.ParaValue = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.btnDelProductModel = new MetroFramework.Controls.MetroButton(); + this.cmbProductModel = new MetroFramework.Controls.MetroComboBox(); + this.metroLabel2 = new MetroFramework.Controls.MetroLabel(); + this.btnOK = new MetroFramework.Controls.MetroButton(); + ((System.ComponentModel.ISupportInitialize)(this.dgvEdit)).BeginInit(); + this.SuspendLayout(); + // + // btnAddProductModel + // + this.btnAddProductModel.Location = new System.Drawing.Point(811, 420); + this.btnAddProductModel.Margin = new System.Windows.Forms.Padding(4); + this.btnAddProductModel.Name = "btnAddProductModel"; + this.btnAddProductModel.Size = new System.Drawing.Size(100, 29); + this.btnAddProductModel.TabIndex = 1; + this.btnAddProductModel.Text = "添 加"; + this.btnAddProductModel.UseSelectable = true; + this.btnAddProductModel.Click += new System.EventHandler(this.btnAddProductModel_Click); + // + // txtProductModel + // + // + // + // + this.txtProductModel.CustomButton.Image = null; + this.txtProductModel.CustomButton.Location = new System.Drawing.Point(185, 1); + this.txtProductModel.CustomButton.Margin = new System.Windows.Forms.Padding(4); + this.txtProductModel.CustomButton.Name = ""; + this.txtProductModel.CustomButton.Size = new System.Drawing.Size(27, 27); + this.txtProductModel.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.txtProductModel.CustomButton.TabIndex = 1; + this.txtProductModel.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.txtProductModel.CustomButton.UseSelectable = true; + this.txtProductModel.CustomButton.Visible = false; + this.txtProductModel.Lines = new string[0]; + this.txtProductModel.Location = new System.Drawing.Point(891, 352); + this.txtProductModel.Margin = new System.Windows.Forms.Padding(4); + this.txtProductModel.MaxLength = 32767; + this.txtProductModel.Name = "txtProductModel"; + this.txtProductModel.PasswordChar = '\0'; + this.txtProductModel.PromptText = "请输入新增加的产品型号"; + this.txtProductModel.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.txtProductModel.SelectedText = ""; + this.txtProductModel.SelectionLength = 0; + this.txtProductModel.SelectionStart = 0; + this.txtProductModel.ShortcutsEnabled = true; + this.txtProductModel.Size = new System.Drawing.Size(213, 29); + this.txtProductModel.TabIndex = 2; + this.txtProductModel.UseSelectable = true; + this.txtProductModel.WaterMark = "请输入新增加的产品型号"; + this.txtProductModel.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.txtProductModel.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // metroLabel1 + // + this.metroLabel1.AutoSize = true; + this.metroLabel1.Location = new System.Drawing.Point(757, 352); + this.metroLabel1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.metroLabel1.Name = "metroLabel1"; + this.metroLabel1.Size = new System.Drawing.Size(114, 20); + this.metroLabel1.TabIndex = 3; + this.metroLabel1.Text = "新增产品型号:"; + // + // dgvEdit + // + this.dgvEdit.AllowUserToAddRows = false; + this.dgvEdit.AllowUserToDeleteRows = false; + this.dgvEdit.AllowUserToResizeRows = false; + this.dgvEdit.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.dgvEdit.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dgvEdit.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.None; + this.dgvEdit.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(174)))), ((int)(((byte)(219))))); + dataGridViewCellStyle1.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + dataGridViewCellStyle1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(198)))), ((int)(((byte)(247))))); + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvEdit.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + this.dgvEdit.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dgvEdit.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.ParaName, + this.ParaValue}); + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + dataGridViewCellStyle2.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + dataGridViewCellStyle2.ForeColor = System.Drawing.Color.Black; + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(198)))), ((int)(((byte)(247))))); + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvEdit.DefaultCellStyle = dataGridViewCellStyle2; + this.dgvEdit.EnableHeadersVisualStyles = false; + this.dgvEdit.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + this.dgvEdit.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.dgvEdit.Location = new System.Drawing.Point(15, 79); + this.dgvEdit.Margin = new System.Windows.Forms.Padding(4); + this.dgvEdit.Name = "dgvEdit"; + this.dgvEdit.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None; + dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle3.BackColor = System.Drawing.Color.White; + dataGridViewCellStyle3.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + dataGridViewCellStyle3.ForeColor = System.Drawing.Color.Black; + dataGridViewCellStyle3.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(198)))), ((int)(((byte)(247))))); + dataGridViewCellStyle3.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvEdit.RowHeadersDefaultCellStyle = dataGridViewCellStyle3; + this.dgvEdit.RowHeadersWidth = 51; + this.dgvEdit.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; + dataGridViewCellStyle4.BackColor = System.Drawing.Color.White; + dataGridViewCellStyle4.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + dataGridViewCellStyle4.ForeColor = System.Drawing.Color.Black; + this.dgvEdit.RowsDefaultCellStyle = dataGridViewCellStyle4; + this.dgvEdit.RowTemplate.Height = 23; + this.dgvEdit.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgvEdit.Size = new System.Drawing.Size(731, 866); + this.dgvEdit.TabIndex = 4; + this.dgvEdit.RowPostPaint += new System.Windows.Forms.DataGridViewRowPostPaintEventHandler(this.dgvEdit_RowPostPaint); + // + // ParaName + // + this.ParaName.DataPropertyName = "ParaName"; + this.ParaName.HeaderText = "名称"; + this.ParaName.MinimumWidth = 6; + this.ParaName.Name = "ParaName"; + this.ParaName.ReadOnly = true; + this.ParaName.Width = 350; + // + // ParaValue + // + this.ParaValue.DataPropertyName = "ParaValue"; + this.ParaValue.HeaderText = "值"; + this.ParaValue.MinimumWidth = 6; + this.ParaValue.Name = "ParaValue"; + this.ParaValue.Width = 125; + // + // btnDelProductModel + // + this.btnDelProductModel.Location = new System.Drawing.Point(941, 420); + this.btnDelProductModel.Margin = new System.Windows.Forms.Padding(4); + this.btnDelProductModel.Name = "btnDelProductModel"; + this.btnDelProductModel.Size = new System.Drawing.Size(100, 29); + this.btnDelProductModel.TabIndex = 5; + this.btnDelProductModel.Text = "删 除"; + this.btnDelProductModel.UseSelectable = true; + this.btnDelProductModel.Click += new System.EventHandler(this.btnDelProductModel_Click); + // + // cmbProductModel + // + this.cmbProductModel.FormattingEnabled = true; + this.cmbProductModel.ItemHeight = 24; + this.cmbProductModel.Location = new System.Drawing.Point(867, 112); + this.cmbProductModel.Margin = new System.Windows.Forms.Padding(4); + this.cmbProductModel.Name = "cmbProductModel"; + this.cmbProductModel.Size = new System.Drawing.Size(228, 30); + this.cmbProductModel.TabIndex = 6; + this.cmbProductModel.UseSelectable = true; + this.cmbProductModel.SelectedIndexChanged += new System.EventHandler(this.cmbProductModel_SelectedIndexChanged); + // + // metroLabel2 + // + this.metroLabel2.AutoSize = true; + this.metroLabel2.Location = new System.Drawing.Point(753, 115); + this.metroLabel2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.metroLabel2.Name = "metroLabel2"; + this.metroLabel2.Size = new System.Drawing.Size(84, 20); + this.metroLabel2.TabIndex = 8; + this.metroLabel2.Text = "产品型号:"; + // + // btnOK + // + this.btnOK.Location = new System.Drawing.Point(811, 204); + this.btnOK.Margin = new System.Windows.Forms.Padding(4); + this.btnOK.Name = "btnOK"; + this.btnOK.Size = new System.Drawing.Size(229, 41); + this.btnOK.TabIndex = 10; + this.btnOK.Text = "保 存"; + this.btnOK.UseSelectable = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // FrmParaConfig + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1200, 961); + this.Controls.Add(this.txtProductModel); + this.Controls.Add(this.btnOK); + this.Controls.Add(this.metroLabel2); + this.Controls.Add(this.cmbProductModel); + this.Controls.Add(this.btnDelProductModel); + this.Controls.Add(this.dgvEdit); + this.Controls.Add(this.metroLabel1); + this.Controls.Add(this.btnAddProductModel); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(4); + this.MinimizeBox = false; + this.Movable = false; + this.Name = "FrmParaConfig"; + this.Padding = new System.Windows.Forms.Padding(27, 75, 27, 25); + this.Text = "参数编辑"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmParaEdit_FormClosing); + this.Load += new System.EventHandler(this.FrmParaEdit_Load); + ((System.ComponentModel.ISupportInitialize)(this.dgvEdit)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private MetroFramework.Controls.MetroButton btnAddProductModel; + private MetroFramework.Controls.MetroTextBox txtProductModel; + private MetroFramework.Controls.MetroLabel metroLabel1; + private MetroFramework.Controls.MetroGrid dgvEdit; + private MetroFramework.Controls.MetroButton btnDelProductModel; + private MetroFramework.Controls.MetroComboBox cmbProductModel; + private MetroFramework.Controls.MetroLabel metroLabel2; + private MetroFramework.Controls.MetroButton btnOK; + private System.Windows.Forms.DataGridViewTextBoxColumn ParaName; + private System.Windows.Forms.DataGridViewTextBoxColumn ParaValue; + } +} \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmParaConfig.resx b/JY.Inspection/Frm/FrmParaConfig.resx new file mode 100644 index 0000000..3148922 --- /dev/null +++ b/JY.Inspection/Frm/FrmParaConfig.resx @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + True + + + + + AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlN + UABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAWU1QAFpNUABZTVASWU1QH1lNUB9ZTVAfWU1QH1lN + UB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUBJaTVAAWU1QAFlN + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXE5OAFlNUABZTVAFWU1QaFlLUM1YS0/gWEtQ4FhL + UOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS0/gWUtQzVlN + UGhZTVAFWU1QAFxOTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWS1EAWU1QAFlNUE5ZTlD0YGxY/2eH + Xv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eH + Xv9gbFj/WU5Q9FlNUE5ZTVAAVktRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhNUABaTVAAWUtQkl1c + VP9xtWn/dchu/3TIbf90yG3/dMht/3TIbf90yG3/dMht/3THbf91yG7/dMht/3TIbf90yG3/dMht/3TI + bf90yG3/dchu/3G1af9dXFT/WUtQklpNUABYTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNH + UAFYS0+fX2RW/3K+a/9zxm3/c8Vs/3PFbP9zxWz/c8Vs/3PFbP90xm3/b7Fo/3G6av90xm3/c8Vs/3PF + bf90xm3/dMZt/3TGbf90xm3/c79s/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYTFAAU0dQAVhKT59gZVf/fsp1/4HVd/+B1Hf/gdR3/4HUd/+B1Hf/gdR3/4HWd/9tnWX/Z4lf/3/S + dv+B1Hf/fdF1/3fJb/90xm3/dMZt/3TGbf9zvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+T4Yb/mfCL/5nvi/+Z74v/me+L/5nvi/+Z74v/lu2J/3Cg + aP9cV1L/gr92/5nwi/+Y7or/keaF/3/Sdv90xm3/dMZt/3O+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nvi/+Z74v/me+L/5nv + i/+T6ob/bp5l/09ZYv9ieGL/keCD/5rwjP+a8Iv/leuI/3zPdP90xm3/c75r/19kVv9YS0+fU0dQAVhM + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nwi/+Z74v/me+L/5nv + i/+Z74v/mvCM/4/lg/9tmmH/OXuO/zp6jf92nmn/mO6K/5nvi/+a8Iz/jOCA/3XHbf9zvmv/X2RW/1hL + T59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+U4ob/mfCL/5nv + i/+Z74v/me+L/5nvi/+U64f/gtl5/2yYX/82gJT/ELXe/1Nsaf+HyXn/mvGM/5nvi/+T6Ib/d8pw/3K+ + a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Ti + hv+Z8Iv/me+L/5nvi/+T6ob/hdZ6/3W0av9pj17/XGtb/y+Ko/8Az///J5Ox/2iAYf+T5Yb/mvCM/5Tq + h/95y3H/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhK + T59kaFr/lOKG/5nwi/+Z8Iv/idZ9/22aZf9ed1//SnB0/zCHoP8Xq9D/Bcb0/wDP//8Fx/b/P3aE/3uq + bv+Z8Iv/leqH/3nMcf9yvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhM + UABTR1ABWEpPn2RoWv+U4ob/mfCL/5rxjP+Kzn3/WWJe/yGau/8GxPL/AM///wDR//8Az///BMf3/w63 + 4v8wgpz/X2VY/4zVf/+V64j/ecxx/3K+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5jtiv9wjmj/JZWz/wDQ//8Azv//FLHX/zCI + oP9GdX7/XHZp/26MaP9+r3L/kd+E/5XriP95zHH/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nwi/+Z74v/mvGM/4vKe/9McnX/CMHv/wLL + +/9AdoP/dpRk/4vJe/+T4YX/mO6K/5rxjP+a8Iz/lOqH/3nMcf9yvmv/X2RW/1hLT59TR1ABWExQAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+U4ob/mfCL/5nvi/+Z74v/mOyK/2+K + Z/8jmLn/CMDt/1Nzbv+Q2oH/m/OM/5nwi/+Z74v/me+L/5nvi/+V6of/ecxx/3K+a/9fZFb/WEtPn1NH + UAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nv + i/+a8Yz/isZ6/0h1fP8cocX/ZoBo/5fpiP+Z74v/me+L/5nvi/+Z74v/me+L/5Xqh/95zHH/cr5r/19k + Vv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nw + i/+Z74v/me+L/5nvi/+Y64n/bIlq/0Nmdv91mW3/mvCL/5nvi/+Z74v/me+L/5nvi/+Z74v/leqH/3nM + cf9yvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2Ro + Wv+U4ob/mfCL/5nvi/+Z74v/me+L/5rxjP+Iwnv/XVZT/4K2dv+a8oz/me+L/5nvi/+Z74v/me+L/5nv + i/+V6of/ecxx/3K+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNH + UAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nvi/+Z74v/me+L/5fpif9yi2f/jM9//5rxjP+Z74v/me+L/5nv + i/+Z74v/me+L/5Xqh/95zHH/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYTFAAUkdQAFhKT55kaFr/leSH/5ryjP+a8Yz/mvGM/5rxjP+a8Yz/mvKM/5DYg/+W6Ij/mvKM/5rx + jP+a8Yz/mvGM/5rxjP+a8oz/leyI/3nNcf9zwGz/X2RW/1hKT55SR1AAWExQAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhMUABXSVABWEtPoWFhV/+FvHj/icd8/4nGfP+Jxnz/icZ8/4nGfP+Jxnz/icd8/4nH + fP+Jxnz/icZ8/4nGfP+Jxnz/icZ8/4nHfP+Gw3n/caxp/2yiZP9dXlT/WUtQoVdJUAFYTFAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWUxQAFlLUAJZTVCnWk5R/1xTU/9cU1L/XFNS/1xTUv9cU1L/XFNS/1xT + Uv9cU1L/XFNS/1xTUv9cU1L/XFNS/1xTUv9cU1L/XFNS/1tTUv9aUlH/WlJR/1lOUP9ZTVCnWUtQAllM + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAW05QAFlMUJldUlT/gYF8/42Qif+MkIj/jJCI/4yQ + iP+MkIj/jJCI/4yQiP+MkIj/jJCI/4yQiP+MkIj/jJCI/4yQiP+MkIj/jJCI/42Qif+BgXz/XVJU/1lM + UJlbTlEAWU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFtGTQBZTVAAWU1QVFpOUfdtZ2b/fn15/35+ + ef9+fnn/fn55/39+ef9+fnn/fn55/35+ef9+fnn/fn55/35+ef9/fnn/fn55/35+ef9+fnn/fn15/21n + Zv9aTlH3WU1QVFlNUABbRk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVlNTAFlNUABZTVAHWU1Qb1hM + T9JXS07lV0tO5FdLTuVYS074WExP/1pOUf9aTlH/Wk5R/1pOUf9aTlH/Wk5R/1hMT/9YS074V0tO5VdL + TuRXS07lWExP0llNUG9ZTVAGWU1QAFZTUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWU1QAFlN + UABbTk8AWU1QFllNUCNZTVAjWU1QKVhMT8JiV1n/fHN2/311d/99dXf/fXV3/311d/98dHb/Ylda/1hM + T8JZTVApWU1QI1lNUCNZTVAVXE5QAFlNUABZTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAWU1QAFlNUABZTVAAWU1QAFlNUABWSlAAWExPpV5TVv9yaGr/c2ps/3NqbP9zamz/c2ps/3Jo + av9eU1b/WExPpVZKUQFZTVAAWU1QAFlNUABYTVAAWU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVklRAFlNUABZTVA7WU1QwlhMT+BYTE/gWExP4FhM + T+BYTE/gWExP4FlNUMJZTVA7WU1QAFZKUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFEAWE1QAFlNUABZTVAPWU1QH1lN + UB9ZTVAfWU1QH1lNUB9ZTVAfWU1QD1lNUABYTFEAWExRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAWE1QAFlN + UABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA+AAAH/AAAA/gAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH8AAAD/gAAB//gAH//4AB///AA/8= + + + \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmPwd.Designer.cs b/JY.Inspection/Frm/FrmPwd.Designer.cs new file mode 100644 index 0000000..297cb7e --- /dev/null +++ b/JY.Inspection/Frm/FrmPwd.Designer.cs @@ -0,0 +1,103 @@ +namespace JY.Inspection.Frm +{ + partial class FrmPwd + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.txtPwd = new System.Windows.Forms.TextBox(); + this.btOK = new System.Windows.Forms.Button(); + this.btExit = new System.Windows.Forms.Button(); + this.metroLabel6 = new MetroFramework.Controls.MetroLabel(); + this.SuspendLayout(); + // + // txtPwd + // + this.txtPwd.Location = new System.Drawing.Point(28, 32); + this.txtPwd.Name = "txtPwd"; + this.txtPwd.PasswordChar = '*'; + this.txtPwd.Size = new System.Drawing.Size(203, 21); + this.txtPwd.TabIndex = 0; + // + // btOK + // + this.btOK.Location = new System.Drawing.Point(41, 59); + this.btOK.Name = "btOK"; + this.btOK.Size = new System.Drawing.Size(75, 23); + this.btOK.TabIndex = 1; + this.btOK.Text = "确定"; + this.btOK.UseVisualStyleBackColor = true; + this.btOK.Click += new System.EventHandler(this.btOK_Click); + // + // btExit + // + this.btExit.Location = new System.Drawing.Point(134, 59); + this.btExit.Name = "btExit"; + this.btExit.Size = new System.Drawing.Size(75, 23); + this.btExit.TabIndex = 2; + this.btExit.Text = "退出"; + this.btExit.UseVisualStyleBackColor = true; + this.btExit.Click += new System.EventHandler(this.btExit_Click); + // + // metroLabel6 + // + this.metroLabel6.AutoSize = true; + this.metroLabel6.BackColor = System.Drawing.SystemColors.Control; + this.metroLabel6.Location = new System.Drawing.Point(98, 9); + this.metroLabel6.Name = "metroLabel6"; + this.metroLabel6.Size = new System.Drawing.Size(65, 19); + this.metroLabel6.TabIndex = 11; + this.metroLabel6.Text = "输入密码"; + // + // FrmPwd + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(243, 94); + this.Controls.Add(this.metroLabel6); + this.Controls.Add(this.btExit); + this.Controls.Add(this.btOK); + this.Controls.Add(this.txtPwd); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmPwd"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "FrmPwd"; + this.Load += new System.EventHandler(this.FrmPwd_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox txtPwd; + private System.Windows.Forms.Button btOK; + private System.Windows.Forms.Button btExit; + private MetroFramework.Controls.MetroLabel metroLabel6; + } +} \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmPwd.cs b/JY.Inspection/Frm/FrmPwd.cs new file mode 100644 index 0000000..ebab1b7 --- /dev/null +++ b/JY.Inspection/Frm/FrmPwd.cs @@ -0,0 +1,42 @@ +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 JY.Inspection.Frm +{ + public partial class FrmPwd : Form + { + public FrmPwd() + { + InitializeComponent(); + } + + private void FrmPwd_Load(object sender, EventArgs e) + { + + } + + private void btOK_Click(object sender, EventArgs e) + { + if (txtPwd.Text.ToLower().Trim() == "eve@2022") + { + this.DialogResult = DialogResult.OK; + } + else + { + MessageBox.Show("输入的密码不正确!"); + } + } + + private void btExit_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + } +} diff --git a/JY.Inspection/Frm/FrmPwd.resx b/JY.Inspection/Frm/FrmPwd.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JY.Inspection/Frm/FrmPwd.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmStatistics.cs b/JY.Inspection/Frm/FrmStatistics.cs new file mode 100644 index 0000000..13a8a61 --- /dev/null +++ b/JY.Inspection/Frm/FrmStatistics.cs @@ -0,0 +1,551 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Windows.Forms; +using System.Windows.Forms.DataVisualization.Charting; +using JY.DAL; +using JY.Model; +using JY.Utility; +using MetroFramework.Forms; + +namespace JY.Inspection.Frm +{ + public partial class FrmStatistics : MetroForm + { + /// + /// 数据库访问接口 + /// + private IDbHelper dbHelper = new OpSqlDataBase(); + /// + /// 读取成功 + /// + public bool isReadOK = true; + /// + /// Timer是否运行 + /// + public bool isEnabled = false; + /// + /// chart图表Y轴的上限值 + /// + int iChartHeight = 5000; + + + /// + /// 读取 + /// + public System.Timers.Timer timerStatistics1; + /// + /// 读取24小时产能统计 + /// + public System.Timers.Timer timer_HourProd; + + /// + /// 投入产出饼状图显示委托 + /// + /// + /// + private delegate void UpdateDataChart2(List xData, List yData); + /// + /// 各不良统计NG显示委托 + /// + /// + private delegate void UpdateDataChart3(List xData, List yData); + /// + /// 不良统计项目 + /// + List NGList = new List(); + /// + /// 生产统计项目 + /// + List ProductionList = new List(); + + + public FrmStatistics() + { + InitializeComponent(); + + } + + /// + /// 窗体实例 + /// + private static FrmStatistics _instance; + internal static FrmStatistics Instance + { + get + { + if (_instance == null) + _instance = new FrmStatistics(); + return _instance; + } + } + + private void FrmStatistics_Load(object sender, EventArgs e) + { + + //SetProductionList(); + //OrgChart(); + //GetValue(); + //InitTimer(); + } + + /// + /// 初始化Timer控件 + /// + internal void InitTimer() + { + + OrgChart(); + SetProductionList(); + isEnabled = true; + + + } + + /// + ///定义饼图和右上角柱状图显示类型 + /// + /// + internal void SetProductionList() + { + //不良统计项目 + NGList.Add(new ChartDataType() { DataType = "线扫扫码NG" }); + NGList.Add(new ChartDataType() { DataType = "分档扫码NG" }); + NGList.Add(new ChartDataType() { DataType = "侧面不良" }); + NGList.Add(new ChartDataType() { DataType = "正极不良" }); + NGList.Add(new ChartDataType() { DataType = "负极不良" }); + //生产统计项目 + ProductionList.Add(new ChartDataType() { DataType = "生产总数" }); + ProductionList.Add(new ChartDataType() { DataType = "良品数" }); + ProductionList.Add(new ChartDataType() { DataType = "不良数" }); + } + + /// + /// Chart控件初始化 + /// + internal void OrgChart() + { + #region 24小时统计 + chart1.Series.Clear(); + chart1.Titles.Clear(); + chart1.ChartAreas[0].AxisY.Minimum = 0; + chart1.ChartAreas[0].AxisY.Maximum = iChartHeight + 500; + + ChartHelper.AddSeries(chart1, "投入", SeriesChartType.Column, Color.DodgerBlue, Color.Red, true); + ChartHelper.AddSeries(chart1, "产出", SeriesChartType.Column, Color.Lime, Color.Red, true); + ChartHelper.AddSeries(chart1, "优率", SeriesChartType.Spline, Color.Red, Color.Red); + + ChartHelper.SetTitle(chart1, "当日每2小时投入与产出", new Font("微软雅黑", 18), Docking.Top, Color.Black); + ChartHelper.SetStyle(chart1, Color.White, Color.Black); + ChartHelper.SetLegend(chart1, Docking.Top, StringAlignment.Center, Color.White, Color.Black); + ChartHelper.SetXY(chart1, "时间", "数值", StringAlignment.Far, Color.Black, Color.Black, AxisArrowStyle.None, 1, 2); + ChartHelper.SetMajorGrid(chart1, Color.White, 20, 2); + #endregion + + #region 数据统计 + chartNgShow.Series.Clear(); + chartNgShow.Titles.Clear(); + chartNgShow.ChartAreas[0].AxisY.Minimum = 0; + chartNgShow.ChartAreas[0].AxisY.Maximum = iChartHeight + 500; + foreach (var item in NGList) + { + ChartHelper.AddSeries(chartNgShow, item.DataType, SeriesChartType.Column, Color.Red, Color.Red, true); + } + ChartHelper.SetTitle(chartNgShow, "各不良项", new Font("微软雅黑", 22), Docking.Top, Color.Black); + ChartHelper.SetStyle(chartNgShow, Color.White, Color.Black); + ChartHelper.SetLegend(chartNgShow, Docking.Top, StringAlignment.Center, Color.White, Color.Black); + ChartHelper.SetXY(chartNgShow, "不良项", "数值", StringAlignment.Far, Color.Black, Color.Black, AxisArrowStyle.None, 1, 2); + ChartHelper.SetMajorGrid(chartNgShow, Color.White, 20, 2); + #endregion + + //投入产出统计 + ChartHelper.SetTitle(chartToalShow, "投入产出", new Font("微软雅黑", 22), Docking.Top, Color.Black); + chartToalShow.Series[0].ChartType = SeriesChartType.Pie;//设置图表类型为饼图 + //chart2.Series[0].CustomProperties="PieLabel"+"PieSize = 50";//设置饼图参数 + chartToalShow.Series[0].CustomProperties = "DoughnutRadius=60, PieLabelStyle=Disabled, PieDrawingStyle=SoftEdge"; + chartToalShow.Series[0]["PieLabelStyle"] = "Inside";//将文字移到外侧 + chartToalShow.Series[0].XValueType = ChartValueType.String; + } + + /// + /// 读取PLC产能统计 + /// + /// + /// + private void TimerUpGetData() + { + if (!HomeForm.startup) + { + return; + } + if (isReadOK) + { + isReadOK = false; + GetValue(); + } + + } + + /// + /// 获取图表数据 + /// + public void GetValue() + { + try + { + if (isEnabled) + { + + int ProdAllQty = HomeForm.omronPLCCom.lstMcUI[0].ReadIntDReg("HMI.生产总数"); + int ProdOKQty = HomeForm.omronPLCCom.lstMcUI[0].ReadIntDReg("HMI.OK总数"); + int ProdNGQty= HomeForm.omronPLCCom.lstMcUI[0].ReadIntDReg("HMI.NG总数"); + int ProdSanNgQty = 123;//扫码NG + int ProdVolNgQty = 145;//电压NG + + //從PLC讀取數據賦值給到NGList + ProductionList.Where(p => p.DataType == "生产总数").FirstOrDefault().DataCount = ProdAllQty; + ProductionList.Where(p => p.DataType == "良品数").FirstOrDefault().DataCount = ProdOKQty; + ProductionList.Where(p => p.DataType == "不良数").FirstOrDefault().DataCount = ProdNGQty; + + + + //從PLC讀取數據賦值給到NGList + NGList.Where(p => p.DataType == "线扫扫码NG").FirstOrDefault().DataCount = ProdSanNgQty; + NGList.Where(p => p.DataType == "分档扫码NG").FirstOrDefault().DataCount = ProdSanNgQty; + NGList.Where(p => p.DataType == "侧面不良").FirstOrDefault().DataCount = ProdVolNgQty; + NGList.Where(p => p.DataType == "正极不良").FirstOrDefault().DataCount = ProdVolNgQty; + NGList.Where(p => p.DataType == "负极不良").FirstOrDefault().DataCount = ProdSanNgQty; + + ShowChartData(); + //------------------------------每小时产能------------------------------------------ + string strErr = ""; + DateTime dateTime = DateTime.Now; + string strDate = dateTime.ToString("yyyy-MM-dd"); + int Hour = dateTime.Hour; + + //读取PLC投入总数 + int ProdCurrAllQty = GetToDayHourQty(Hour, true); + //读取PLC产出数 + int ProdCurrOKQty = GetToDayHourQty(Hour, false); + HourprodEntity mh = new HourprodEntity(); + mh.FDate = strDate; + mh.FHour = Hour; + mh.ProdIn = ProdCurrAllQty; + mh.ProdOut = ProdCurrOKQty; + mh.TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + + var iResult = dbHelper.UpdateHourprodData(mh); + if (iResult <= 0) + { + MessageBox.Show("存储每小时产能失败" + strErr, "系统异常", MessageBoxButtons.OK, MessageBoxIcon.Hand); + LogHelper.Error("存储每小时产能失败" + strErr, new Exception("异常信息")); + } + isReadOK = true; + } + + } + catch (Exception ex) + { + LogHelper.Error(ex.Message, new Exception("异常信息")); + timerStatistics1.Enabled = false; + isReadOK = true; + } + } + + /// + /// 每小时产能读取处理 + /// + /// + /// + /// + private int GetToDayHourQty(int hour, bool flag) + { + try + { + string strAddr = ""; + if (hour == 0) + { + hour = 24; + } + //else + //{ + // hour = hour - 1; + //} + if (flag)//产出 + { + strAddr = "W" + (1040 + hour); + } + else//良品数 + { + strAddr = "W" + (1070 + hour); + } + int ProdNGQty = HomeForm.omronPLCCom.lstMcUI[0].ReadIntDReg(strAddr);//生产NG数量 + return ProdNGQty; + + } + catch (Exception ex) + { + LogHelper.Error(ex.Message, new Exception("异常信息")); + MessageBox.Show(ex.Message, "系统异常", MessageBoxButtons.OK, MessageBoxIcon.Hand); + } + return 0; + } + + /// + /// 刷新饼图生产统计信息;刷新生产不良统计信息 + /// + public void ShowChartData() + { + try + { + //不良类型统计 + List xData = NGList.Select(c => c.DataType).ToList(); + List yData = NGList.Select(c => c.DataCount).ToList(); + ShowNGChart(xData, yData); + + //生产总数统计 + var xlist = ProductionList.Select(c => c.DataType).ToList(); + var ylist = ProductionList.Select(c => c.DataCount).ToList(); + ShowChartToal(xlist, ylist); + } + catch (Exception ex) + { + LogHelper.Error(ex.Message, new Exception("异常信息")); + MessageBox.Show(ex.Message, "系统异常", MessageBoxButtons.OK, MessageBoxIcon.Hand); + } + + } + + /// + /// 投入产出饼状图显示 + /// + /// + /// + private void ShowChartToal(List xData, List yData) + { + if (chartToalShow.InvokeRequired) + { + UpdateDataChart2 c = new UpdateDataChart2(ShowChartToal); + this.Invoke(c, new object[] { xData, yData }); + } + else + { + chartToalShow.Series[0].Points.DataBindXY(xData, yData); + } + + + } + + /// + /// 不良数统计显示 + /// + /// + private void ShowNGChart(List xData, List yData) + { + if (chartNgShow.InvokeRequired) + { + UpdateDataChart3 c = new UpdateDataChart3(ShowNGChart); + this.Invoke(c, new object[] { xData, yData }); + } + else + { + chartNgShow.Series[0].Points.DataBindXY(xData, yData); + } + } + + + /// + /// 读取产入产出 + /// + /// + /// + /// + private void TimerUpHourProd() + { + try + { + if (isEnabled) + { + List chart24Hours = new List(); + DateTime dtTime = DateTime.Now; + string strDate = dtTime.ToString("yyyy-MM-dd"); + int Hour = dtTime.Hour; + var listTotal = dbHelper.GetProdTotal(strDate, 0);// 查询稼动率表中total数据 + + if (listTotal != null && listTotal.Count > 0) + { + for (int i = 1; i <= 12; i++) + { + if (!isEnabled) + { + break; + } + int j = i * 2; + int m = j - 2; + int n = j - 1; + //当前时段第一个小时 + var hour1 = listTotal.Where(p => p.FHour == m).FirstOrDefault(); + //当前时段第二个小时 + var hour2 = listTotal.Where(p => p.FHour == n).FirstOrDefault(); + int ProdALLQty = 0; + int ProdOKQty = 0; + int ProdNGQty = 0; + string strOkRatio = "0"; + + if (hour1 != null) + { + ProdALLQty += hour1.ProdIn; + ProdOKQty += hour1.ProdOut; + } + if (hour2 != null) + { + ProdALLQty += hour2.ProdIn; + ProdOKQty += hour2.ProdOut; + } + ProdNGQty = ProdALLQty - ProdOKQty; + if (ProdNGQty > 0) + { + strOkRatio = Math.Round((ProdOKQty * 1.0 / ProdALLQty) * 100, 2) + "%"; + } + + chart24Hours.Add(new Chart24HourData() + { + DisplayTime = m + ":00~" + n + ":59", + ProdIn = ProdALLQty, + ProdOut = ProdOKQty, + ProdNg = ProdNGQty, + OKRatio = strOkRatio + }); + } + } + else + { + Random rand = new Random(); + for (int i = 1; i < 13; i++) + { + if (!isEnabled) + { + break; + } + int j = i * 2; + int m = j - 2; + int n = j - 1; + + int ranOK = rand.Next(1000, 3000); + int ranNG = rand.Next(400, 1200); + int total = ranOK + ranNG; + + chart24Hours.Add(new Chart24HourData() + { + DisplayTime = m + ":00~" + n + ":59", + ProdIn = ranOK + ranNG, + ProdOut = ranOK, + ProdNg = ranNG, + OKRatio = Math.Round((ranOK * 1.0 / total) * 100, 2) + "%" + }); + } + } + if (!isEnabled) + { + return; + } + UpdateGV(chart24Hours); + BindChart(chart24Hours); + } + } + catch (Exception ex) + { + LogHelper.Error(ex.Message, new Exception("异常信息")); + MessageBox.Show(ex.Message, "系统异常", MessageBoxButtons.OK, MessageBoxIcon.Hand); + timer_HourProd.Enabled = false; + + } + } + /// + /// 更新24小时产能 + /// + /// + private void UpdateGV(List list) + { + if (this.InvokeRequired) + { + this.BeginInvoke(new EventHandler(delegate + { + DataTable dtsShow = new DataTable(); + for (int i = 1; i <= 13; i++) + { + dtsShow.Columns.Add("Col" + i); + } + dtsShow.Rows.Add(new object[] { "优率", list[0].OKRatio, list[1].OKRatio, list[2].OKRatio, list[3].OKRatio, list[4].OKRatio, list[5].OKRatio + ,list[6].OKRatio, list[7].OKRatio, list[8].OKRatio, list[9].OKRatio, list[10].OKRatio, list[11].OKRatio }); + dtsShow.Rows.Add(new object[] { "产出" , list[0].ProdOut, list[1].ProdOut, list[2].ProdOut, list[3].ProdOut, list[4].ProdOut, list[5].ProdOut + ,list[6].ProdOut, list[7].ProdOut, list[8].ProdOut, list[9].ProdOut, list[10].ProdOut, list[11].ProdOut }); + dtsShow.Rows.Add(new object[] { "投入", list[0].ProdIn, list[1].ProdIn, list[2].ProdIn, list[3].ProdIn, list[4].ProdIn, list[5].ProdIn + ,list[6].ProdIn, list[7].ProdIn, list[8].ProdIn, list[9].ProdIn, list[10].ProdIn, list[11].ProdIn}); + dtsShow.Rows.Add(new object[] { "时间" , list[0].DisplayTime, list[1].DisplayTime, list[2].DisplayTime, list[3].DisplayTime, list[4].DisplayTime, list[5].DisplayTime + ,list[6].DisplayTime, list[7].DisplayTime, list[8].DisplayTime, list[9].DisplayTime, list[10].DisplayTime, list[11].DisplayTime }); + dgvHShow.DataSource = dtsShow; + dgvHShow.Refresh(); + })); + } + } + + /// + /// 更新24小时产能Chart柱状图显示 + /// + /// + public void BindChart(List list) + { + if (this.InvokeRequired) + { + this.BeginInvoke(new EventHandler(delegate + { + var x1 = list.Select(c => c.DisplayTime).ToList(); + var y1 = list.Select(c => c.ProdIn).ToList(); + var y2 = list.Select(c => c.ProdOut).ToList(); + + chart1.Series[0].Points.DataBindXY(x1, y1); + chart1.Series[1].Points.DataBindXY(x1, y2); + chart1.Series[2].Points.DataBindXY(x1, y2); + })); + } + } + + /// + /// 窗口渐变透明 + /// + /// + /// + private void timerOpacity_Tick(object sender, EventArgs e) + { + this.Opacity += 0.1; + if (this.Opacity == 1.0) + { + timerOpacity.Stop(); + } + } + + /// + /// 关闭界面 + /// + /// + /// + public void FrmStatistics_FormClosing(object sender, FormClosingEventArgs e) + { + this.Visible = false; + e.Cancel = true; + } + + public void timerStatistics_Tick(object sender, EventArgs e) + { + TimerUpGetData(); + } + + public void timer_HourProd2_Tick(object sender, EventArgs e) + { + TimerUpHourProd(); + } + } +} diff --git a/JY.Inspection/Frm/FrmStatistics.designer.cs b/JY.Inspection/Frm/FrmStatistics.designer.cs new file mode 100644 index 0000000..a02e35b --- /dev/null +++ b/JY.Inspection/Frm/FrmStatistics.designer.cs @@ -0,0 +1,319 @@ + +namespace JY.Inspection.Frm +{ + partial class FrmStatistics + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea7 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); + System.Windows.Forms.DataVisualization.Charting.Legend legend7 = new System.Windows.Forms.DataVisualization.Charting.Legend(); + System.Windows.Forms.DataVisualization.Charting.Series series7 = new System.Windows.Forms.DataVisualization.Charting.Series(); + System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea8 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); + System.Windows.Forms.DataVisualization.Charting.Legend legend8 = new System.Windows.Forms.DataVisualization.Charting.Legend(); + System.Windows.Forms.DataVisualization.Charting.Series series8 = new System.Windows.Forms.DataVisualization.Charting.Series(); + System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea9 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); + System.Windows.Forms.DataVisualization.Charting.Legend legend9 = new System.Windows.Forms.DataVisualization.Charting.Legend(); + System.Windows.Forms.DataVisualization.Charting.Series series9 = new System.Windows.Forms.DataVisualization.Charting.Series(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle7 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle8 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle9 = new System.Windows.Forms.DataGridViewCellStyle(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmStatistics)); + this.chartToalShow = new System.Windows.Forms.DataVisualization.Charting.Chart(); + this.chartNgShow = new System.Windows.Forms.DataVisualization.Charting.Chart(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.splitContainer2 = new System.Windows.Forms.SplitContainer(); + this.splitContainer3 = new System.Windows.Forms.SplitContainer(); + this.chart1 = new System.Windows.Forms.DataVisualization.Charting.Chart(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.dgvHShow = new MetroFramework.Controls.MetroGrid(); + this.timerOpacity = new System.Windows.Forms.Timer(this.components); + this.timerStatistics = new System.Windows.Forms.Timer(this.components); + this.timer_HourProd2 = new System.Windows.Forms.Timer(this.components); + ((System.ComponentModel.ISupportInitialize)(this.chartToalShow)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.chartNgShow)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit(); + this.splitContainer2.Panel1.SuspendLayout(); + this.splitContainer2.Panel2.SuspendLayout(); + this.splitContainer2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer3)).BeginInit(); + this.splitContainer3.Panel1.SuspendLayout(); + this.splitContainer3.Panel2.SuspendLayout(); + this.splitContainer3.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.chart1)).BeginInit(); + this.groupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgvHShow)).BeginInit(); + this.SuspendLayout(); + // + // chartToalShow + // + chartArea7.Name = "ChartArea1"; + this.chartToalShow.ChartAreas.Add(chartArea7); + this.chartToalShow.Dock = System.Windows.Forms.DockStyle.Fill; + legend7.Font = new System.Drawing.Font("Microsoft Sans Serif", 14F); + legend7.IsTextAutoFit = false; + legend7.Name = "Legend1"; + this.chartToalShow.Legends.Add(legend7); + this.chartToalShow.Location = new System.Drawing.Point(0, 0); + this.chartToalShow.Name = "chartToalShow"; + series7.ChartArea = "ChartArea1"; + series7.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Doughnut; + series7.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F); + series7.IsValueShownAsLabel = true; + series7.Label = "#VALX:#VAL"; + series7.Legend = "Legend1"; + series7.Name = "Series1"; + this.chartToalShow.Series.Add(series7); + this.chartToalShow.Size = new System.Drawing.Size(618, 299); + this.chartToalShow.TabIndex = 4; + this.chartToalShow.Text = "chart1"; + // + // chartNgShow + // + chartArea8.Name = "ChartArea1"; + this.chartNgShow.ChartAreas.Add(chartArea8); + this.chartNgShow.Dock = System.Windows.Forms.DockStyle.Fill; + legend8.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + legend8.IsTextAutoFit = false; + legend8.Name = "Legend1"; + this.chartNgShow.Legends.Add(legend8); + this.chartNgShow.Location = new System.Drawing.Point(0, 0); + this.chartNgShow.Name = "chartNgShow"; + series8.ChartArea = "ChartArea1"; + series8.Legend = "Legend1"; + series8.Name = "Series1"; + this.chartNgShow.Series.Add(series8); + this.chartNgShow.Size = new System.Drawing.Size(746, 299); + this.chartNgShow.TabIndex = 5; + this.chartNgShow.Text = "chart2"; + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.Location = new System.Drawing.Point(20, 60); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.splitContainer2); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.splitContainer3); + this.splitContainer1.Size = new System.Drawing.Size(1368, 745); + this.splitContainer1.SplitterDistance = 299; + this.splitContainer1.TabIndex = 6; + // + // splitContainer2 + // + this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer2.Location = new System.Drawing.Point(0, 0); + this.splitContainer2.Name = "splitContainer2"; + // + // splitContainer2.Panel1 + // + this.splitContainer2.Panel1.Controls.Add(this.chartToalShow); + // + // splitContainer2.Panel2 + // + this.splitContainer2.Panel2.Controls.Add(this.chartNgShow); + this.splitContainer2.Size = new System.Drawing.Size(1368, 299); + this.splitContainer2.SplitterDistance = 618; + this.splitContainer2.TabIndex = 0; + // + // splitContainer3 + // + this.splitContainer3.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer3.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.splitContainer3.Location = new System.Drawing.Point(0, 0); + this.splitContainer3.Name = "splitContainer3"; + this.splitContainer3.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer3.Panel1 + // + this.splitContainer3.Panel1.Controls.Add(this.chart1); + // + // splitContainer3.Panel2 + // + this.splitContainer3.Panel2.Controls.Add(this.groupBox1); + this.splitContainer3.Panel2MinSize = 50; + this.splitContainer3.Size = new System.Drawing.Size(1368, 442); + this.splitContainer3.SplitterDistance = 300; + this.splitContainer3.TabIndex = 0; + // + // chart1 + // + chartArea9.Name = "ChartArea1"; + this.chart1.ChartAreas.Add(chartArea9); + this.chart1.Dock = System.Windows.Forms.DockStyle.Fill; + legend9.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + legend9.IsTextAutoFit = false; + legend9.Name = "Legend1"; + this.chart1.Legends.Add(legend9); + this.chart1.Location = new System.Drawing.Point(0, 0); + this.chart1.Name = "chart1"; + series9.ChartArea = "ChartArea1"; + series9.Font = new System.Drawing.Font("Microsoft Sans Serif", 22F); + series9.IsValueShownAsLabel = true; + series9.Legend = "Legend1"; + series9.Name = "Series1"; + this.chart1.Series.Add(series9); + this.chart1.Size = new System.Drawing.Size(1368, 300); + this.chart1.TabIndex = 7; + this.chart1.Text = "chart1"; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.dgvHShow); + this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBox1.Font = new System.Drawing.Font("宋体", 9F); + this.groupBox1.Location = new System.Drawing.Point(0, 0); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(1368, 138); + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "每2小时产能"; + // + // dgvHShow + // + this.dgvHShow.AllowUserToAddRows = false; + this.dgvHShow.AllowUserToDeleteRows = false; + this.dgvHShow.AllowUserToResizeColumns = false; + this.dgvHShow.AllowUserToResizeRows = false; + this.dgvHShow.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.dgvHShow.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dgvHShow.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.None; + this.dgvHShow.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None; + dataGridViewCellStyle7.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle7.BackColor = System.Drawing.Color.SkyBlue; + dataGridViewCellStyle7.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + dataGridViewCellStyle7.ForeColor = System.Drawing.Color.Black; + dataGridViewCellStyle7.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(198)))), ((int)(((byte)(247))))); + dataGridViewCellStyle7.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle7.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvHShow.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle7; + this.dgvHShow.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dgvHShow.ColumnHeadersVisible = false; + dataGridViewCellStyle8.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle8.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + dataGridViewCellStyle8.Font = new System.Drawing.Font("Segoe UI", 11F); + dataGridViewCellStyle8.ForeColor = System.Drawing.Color.Black; + dataGridViewCellStyle8.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(198)))), ((int)(((byte)(247))))); + dataGridViewCellStyle8.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle8.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvHShow.DefaultCellStyle = dataGridViewCellStyle8; + this.dgvHShow.Dock = System.Windows.Forms.DockStyle.Fill; + this.dgvHShow.EnableHeadersVisualStyles = false; + this.dgvHShow.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + this.dgvHShow.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.dgvHShow.Location = new System.Drawing.Point(3, 17); + this.dgvHShow.Name = "dgvHShow"; + this.dgvHShow.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None; + dataGridViewCellStyle9.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle9.BackColor = System.Drawing.Color.White; + dataGridViewCellStyle9.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + dataGridViewCellStyle9.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + dataGridViewCellStyle9.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(198)))), ((int)(((byte)(247))))); + dataGridViewCellStyle9.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle9.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvHShow.RowHeadersDefaultCellStyle = dataGridViewCellStyle9; + this.dgvHShow.RowHeadersWidth = 51; + this.dgvHShow.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; + this.dgvHShow.RowTemplate.Height = 23; + this.dgvHShow.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgvHShow.Size = new System.Drawing.Size(1362, 118); + this.dgvHShow.TabIndex = 14; + // + // timerOpacity + // + this.timerOpacity.Tick += new System.EventHandler(this.timerOpacity_Tick); + // + // timerStatistics + // + this.timerStatistics.Tick += new System.EventHandler(this.timerStatistics_Tick); + // + // timer_HourProd2 + // + this.timer_HourProd2.Tick += new System.EventHandler(this.timer_HourProd2_Tick); + // + // FrmStatistics + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1408, 825); + this.Controls.Add(this.splitContainer1); + this.Font = new System.Drawing.Font("宋体", 9F); + this.ForeColor = System.Drawing.SystemColors.ControlLight; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmStatistics"; + this.Resizable = false; + this.ShowInTaskbar = false; + this.Text = "数据统计"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmStatistics_FormClosing); + this.Load += new System.EventHandler(this.FrmStatistics_Load); + ((System.ComponentModel.ISupportInitialize)(this.chartToalShow)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.chartNgShow)).EndInit(); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.splitContainer2.Panel1.ResumeLayout(false); + this.splitContainer2.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit(); + this.splitContainer2.ResumeLayout(false); + this.splitContainer3.Panel1.ResumeLayout(false); + this.splitContainer3.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer3)).EndInit(); + this.splitContainer3.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.chart1)).EndInit(); + this.groupBox1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dgvHShow)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.SplitContainer splitContainer2; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Timer timerOpacity; + private System.Windows.Forms.SplitContainer splitContainer3; + internal System.Windows.Forms.DataVisualization.Charting.Chart chartToalShow; + internal System.Windows.Forms.DataVisualization.Charting.Chart chartNgShow; + internal System.Windows.Forms.DataVisualization.Charting.Chart chart1; + internal MetroFramework.Controls.MetroGrid dgvHShow; + internal System.Windows.Forms.Timer timerStatistics; + internal System.Windows.Forms.Timer timer_HourProd2; + } +} \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmStatistics.resx b/JY.Inspection/Frm/FrmStatistics.resx new file mode 100644 index 0000000..b25921a --- /dev/null +++ b/JY.Inspection/Frm/FrmStatistics.resx @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 145, 17 + + + 282, 11 + + + 48 + + + + + AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlN + UABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAWU1QAFpNUABZTVASWU1QH1lNUB9ZTVAfWU1QH1lN + UB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUBJaTVAAWU1QAFlN + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXE5OAFlNUABZTVAFWU1QaFlLUM1YS0/gWEtQ4FhL + UOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS0/gWUtQzVlN + UGhZTVAFWU1QAFxOTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWS1EAWU1QAFlNUE5ZTlD0YGxY/2eH + Xv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eH + Xv9gbFj/WU5Q9FlNUE5ZTVAAVktRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhNUABaTVAAWUtQkl1c + VP9xtWn/dchu/3TIbf90yG3/dMht/3TIbf90yG3/dMht/3THbf91yG7/dMht/3TIbf90yG3/dMht/3TI + bf90yG3/dchu/3G1af9dXFT/WUtQklpNUABYTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNH + UAFYS0+fX2RW/3K+a/9zxm3/c8Vs/3PFbP9zxWz/c8Vs/3PFbP90xm3/b7Fo/3G6av90xm3/c8Vs/3PF + bf90xm3/dMZt/3TGbf90xm3/c79s/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYTFAAU0dQAVhKT59gZVf/fsp1/4HVd/+B1Hf/gdR3/4HUd/+B1Hf/gdR3/4HWd/9tnWX/Z4lf/3/S + dv+B1Hf/fdF1/3fJb/90xm3/dMZt/3TGbf9zvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+T4Yb/mfCL/5nvi/+Z74v/me+L/5nvi/+Z74v/lu2J/3Cg + aP9cV1L/gr92/5nwi/+Y7or/keaF/3/Sdv90xm3/dMZt/3O+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nvi/+Z74v/me+L/5nv + i/+T6ob/bp5l/09ZYv9ieGL/keCD/5rwjP+a8Iv/leuI/3zPdP90xm3/c75r/19kVv9YS0+fU0dQAVhM + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nwi/+Z74v/me+L/5nv + i/+Z74v/mvCM/4/lg/9tmmH/OXuO/zp6jf92nmn/mO6K/5nvi/+a8Iz/jOCA/3XHbf9zvmv/X2RW/1hL + T59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+U4ob/mfCL/5nv + i/+Z74v/me+L/5nvi/+U64f/gtl5/2yYX/82gJT/ELXe/1Nsaf+HyXn/mvGM/5nvi/+T6Ib/d8pw/3K+ + a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Ti + hv+Z8Iv/me+L/5nvi/+T6ob/hdZ6/3W0av9pj17/XGtb/y+Ko/8Az///J5Ox/2iAYf+T5Yb/mvCM/5Tq + h/95y3H/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhK + T59kaFr/lOKG/5nwi/+Z8Iv/idZ9/22aZf9ed1//SnB0/zCHoP8Xq9D/Bcb0/wDP//8Fx/b/P3aE/3uq + bv+Z8Iv/leqH/3nMcf9yvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhM + UABTR1ABWEpPn2RoWv+U4ob/mfCL/5rxjP+Kzn3/WWJe/yGau/8GxPL/AM///wDR//8Az///BMf3/w63 + 4v8wgpz/X2VY/4zVf/+V64j/ecxx/3K+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5jtiv9wjmj/JZWz/wDQ//8Azv//FLHX/zCI + oP9GdX7/XHZp/26MaP9+r3L/kd+E/5XriP95zHH/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nwi/+Z74v/mvGM/4vKe/9McnX/CMHv/wLL + +/9AdoP/dpRk/4vJe/+T4YX/mO6K/5rxjP+a8Iz/lOqH/3nMcf9yvmv/X2RW/1hLT59TR1ABWExQAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+U4ob/mfCL/5nvi/+Z74v/mOyK/2+K + Z/8jmLn/CMDt/1Nzbv+Q2oH/m/OM/5nwi/+Z74v/me+L/5nvi/+V6of/ecxx/3K+a/9fZFb/WEtPn1NH + UAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nv + i/+a8Yz/isZ6/0h1fP8cocX/ZoBo/5fpiP+Z74v/me+L/5nvi/+Z74v/me+L/5Xqh/95zHH/cr5r/19k + Vv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nw + i/+Z74v/me+L/5nvi/+Y64n/bIlq/0Nmdv91mW3/mvCL/5nvi/+Z74v/me+L/5nvi/+Z74v/leqH/3nM + cf9yvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2Ro + Wv+U4ob/mfCL/5nvi/+Z74v/me+L/5rxjP+Iwnv/XVZT/4K2dv+a8oz/me+L/5nvi/+Z74v/me+L/5nv + i/+V6of/ecxx/3K+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNH + UAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nvi/+Z74v/me+L/5fpif9yi2f/jM9//5rxjP+Z74v/me+L/5nv + i/+Z74v/me+L/5Xqh/95zHH/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYTFAAUkdQAFhKT55kaFr/leSH/5ryjP+a8Yz/mvGM/5rxjP+a8Yz/mvKM/5DYg/+W6Ij/mvKM/5rx + jP+a8Yz/mvGM/5rxjP+a8oz/leyI/3nNcf9zwGz/X2RW/1hKT55SR1AAWExQAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhMUABXSVABWEtPoWFhV/+FvHj/icd8/4nGfP+Jxnz/icZ8/4nGfP+Jxnz/icd8/4nH + fP+Jxnz/icZ8/4nGfP+Jxnz/icZ8/4nHfP+Gw3n/caxp/2yiZP9dXlT/WUtQoVdJUAFYTFAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWUxQAFlLUAJZTVCnWk5R/1xTU/9cU1L/XFNS/1xTUv9cU1L/XFNS/1xT + Uv9cU1L/XFNS/1xTUv9cU1L/XFNS/1xTUv9cU1L/XFNS/1tTUv9aUlH/WlJR/1lOUP9ZTVCnWUtQAllM + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAW05QAFlMUJldUlT/gYF8/42Qif+MkIj/jJCI/4yQ + iP+MkIj/jJCI/4yQiP+MkIj/jJCI/4yQiP+MkIj/jJCI/4yQiP+MkIj/jJCI/42Qif+BgXz/XVJU/1lM + UJlbTlEAWU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFtGTQBZTVAAWU1QVFpOUfdtZ2b/fn15/35+ + ef9+fnn/fn55/39+ef9+fnn/fn55/35+ef9+fnn/fn55/35+ef9/fnn/fn55/35+ef9+fnn/fn15/21n + Zv9aTlH3WU1QVFlNUABbRk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVlNTAFlNUABZTVAHWU1Qb1hM + T9JXS07lV0tO5FdLTuVYS074WExP/1pOUf9aTlH/Wk5R/1pOUf9aTlH/Wk5R/1hMT/9YS074V0tO5VdL + TuRXS07lWExP0llNUG9ZTVAGWU1QAFZTUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWU1QAFlN + UABbTk8AWU1QFllNUCNZTVAjWU1QKVhMT8JiV1n/fHN2/311d/99dXf/fXV3/311d/98dHb/Ylda/1hM + T8JZTVApWU1QI1lNUCNZTVAVXE5QAFlNUABZTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAWU1QAFlNUABZTVAAWU1QAFlNUABWSlAAWExPpV5TVv9yaGr/c2ps/3NqbP9zamz/c2ps/3Jo + av9eU1b/WExPpVZKUQFZTVAAWU1QAFlNUABYTVAAWU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVklRAFlNUABZTVA7WU1QwlhMT+BYTE/gWExP4FhM + T+BYTE/gWExP4FlNUMJZTVA7WU1QAFZKUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFEAWE1QAFlNUABZTVAPWU1QH1lN + UB9ZTVAfWU1QH1lNUB9ZTVAfWU1QD1lNUABYTFEAWExRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAWE1QAFlN + UABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA+AAAH/AAAA/gAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH8AAAD/gAAB//gAH//4AB///AA/8= + + + \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmTest.Designer.cs b/JY.Inspection/Frm/FrmTest.Designer.cs new file mode 100644 index 0000000..e7bd0f6 --- /dev/null +++ b/JY.Inspection/Frm/FrmTest.Designer.cs @@ -0,0 +1,86 @@ +namespace JY.Inspection.Frm +{ + partial class FrmTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.btn_readCollectItemCfg = new MetroFramework.Controls.MetroButton(); + this.btn_stationExit = new MetroFramework.Controls.MetroButton(); + this.btn_stationArrival = new MetroFramework.Controls.MetroButton(); + this.SuspendLayout(); + // + // btn_readCollectItemCfg + // + this.btn_readCollectItemCfg.Location = new System.Drawing.Point(87, 127); + this.btn_readCollectItemCfg.Name = "btn_readCollectItemCfg"; + this.btn_readCollectItemCfg.Size = new System.Drawing.Size(125, 53); + this.btn_readCollectItemCfg.TabIndex = 0; + this.btn_readCollectItemCfg.Text = "读取采集项配置"; + this.btn_readCollectItemCfg.UseSelectable = true; + this.btn_readCollectItemCfg.Click += new System.EventHandler(this.btn_readCollectItemCfg_Click); + // + // btn_stationExit + // + this.btn_stationExit.Location = new System.Drawing.Point(426, 127); + this.btn_stationExit.Name = "btn_stationExit"; + this.btn_stationExit.Size = new System.Drawing.Size(125, 53); + this.btn_stationExit.TabIndex = 1; + this.btn_stationExit.Text = "电池出站"; + this.btn_stationExit.UseSelectable = true; + this.btn_stationExit.Click += new System.EventHandler(this.btn_stationArrival_Click); + // + // btn_stationArrival + // + this.btn_stationArrival.Location = new System.Drawing.Point(263, 127); + this.btn_stationArrival.Name = "btn_stationArrival"; + this.btn_stationArrival.Size = new System.Drawing.Size(125, 53); + this.btn_stationArrival.TabIndex = 2; + this.btn_stationArrival.Text = "电池进站"; + this.btn_stationArrival.UseSelectable = true; + this.btn_stationArrival.Click += new System.EventHandler(this.btn_stationArrival_Click_1); + // + // FrmTest + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(998, 586); + this.Controls.Add(this.btn_stationArrival); + this.Controls.Add(this.btn_stationExit); + this.Controls.Add(this.btn_readCollectItemCfg); + this.Name = "FrmTest"; + this.Text = "FrmTest"; + this.ResumeLayout(false); + + } + + #endregion + + private MetroFramework.Controls.MetroButton btn_readCollectItemCfg; + private MetroFramework.Controls.MetroButton btn_stationExit; + private MetroFramework.Controls.MetroButton btn_stationArrival; + } +} \ No newline at end of file diff --git a/JY.Inspection/Frm/FrmTest.cs b/JY.Inspection/Frm/FrmTest.cs new file mode 100644 index 0000000..63f1e66 --- /dev/null +++ b/JY.Inspection/Frm/FrmTest.cs @@ -0,0 +1,54 @@ +using JY.Model.Excel; +using JY.Utility; +using MetroFramework.Forms; +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 JY.Inspection.Frm +{ + public partial class FrmTest : MetroForm + { + public FrmTest() + { + InitializeComponent(); + } + + private void btn_readCollectItemCfg_Click(object sender, EventArgs e) + { + string fileName = @"Config/采集项参照表.xlsx"; + //string fileName = @"Config/Device.xlsx"; + List list = ExcelImporter.Import(fileName); + } + + private void btn_stationArrival_Click(object sender, EventArgs e) + { + try + { + throw new NotImplementedException(); + } + catch (Exception ex) + { + MessageBox.Show(ex.ToString()); + } + } + + private void btn_stationArrival_Click_1(object sender, EventArgs e) + { + try + { + throw new NotImplementedException(); + } + catch (Exception ex) + { + MessageBox.Show(ex.ToString()); + } + } + } +} diff --git a/JY.Inspection/Frm/FrmTest.resx b/JY.Inspection/Frm/FrmTest.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JY.Inspection/Frm/FrmTest.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JY.Inspection/Frm/ListViewBuff.cs b/JY.Inspection/Frm/ListViewBuff.cs new file mode 100644 index 0000000..43bd4f7 --- /dev/null +++ b/JY.Inspection/Frm/ListViewBuff.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace JY.Inspection +{ + class ListViewBuff: MetroFramework.Controls.MetroListView + { + public ListViewBuff() + { + this.SetStyle( //设置控件的样式和行为 + ControlStyles.DoubleBuffer | //绘制在缓冲区中进行,完成后将结果输出到屏幕上。双重缓冲区可防止由控件重绘引起的闪烁 + ControlStyles.OptimizedDoubleBuffer | //控件首先在缓冲区中绘制,而不是直接绘制到屏幕上,这样可以减少闪烁 + ControlStyles.AllPaintingInWmPaint, true); //控件将忽略WM_ERASEBKGND(当窗口背景必须被擦除时 例如窗口改变大小时)窗口消息以减少闪烁 + UpdateStyles(); //更新控件的样式和行为 + } + } + + /// + /// GridView + /// + class GridViewBuff : MetroFramework.Controls.MetroGrid + { + public GridViewBuff() + { + this.SetStyle( //设置控件的样式和行为 + ControlStyles.DoubleBuffer | //绘制在缓冲区中进行,完成后将结果输出到屏幕上。双重缓冲区可防止由控件重绘引起的闪烁 + ControlStyles.OptimizedDoubleBuffer | //控件首先在缓冲区中绘制,而不是直接绘制到屏幕上,这样可以减少闪烁 + ControlStyles.AllPaintingInWmPaint, true); //控件将忽略WM_ERASEBKGND(当窗口背景必须被擦除时 例如窗口改变大小时)窗口消息以减少闪烁 + UpdateStyles(); //更新控件的样式和行为 + } + } +} diff --git a/JY.Inspection/Frm/LoginForm.cs b/JY.Inspection/Frm/LoginForm.cs new file mode 100644 index 0000000..c7d7c7d --- /dev/null +++ b/JY.Inspection/Frm/LoginForm.cs @@ -0,0 +1,131 @@ +using System; +using System.Windows.Forms; +using JY.Inspection.Common; +using JY.Utility; +using MetroFramework.Forms; + +namespace JY.Inspection.Frm +{ + public delegate void SendLoginIN(User user); + public partial class LoginForm : MetroForm + { + public SendLoginIN sendLogin; + + private int loginFailedCount = 0; + public LoginForm() + { + InitializeComponent(); + + pLogin_card.Location = new System.Drawing.Point(81, 282); + + chkIsSK.CheckedChanged += chkIsSK_CheckedChanged; + txtPassword2.KeyUp += txtPassWord_KeyUp; + txtPassword2.KeyDown += txtPassword2_KeyDown; + btLogin.Click += btLogin_Click; + } + + private void LoginForm_Load(object sender, EventArgs e) + { + + chkIsSK.Checked = IniFileHelper.ReadIniData("SYSTEM_CONFIGURE", "IsSK") == "1" ? true : false; + chkIsSK_CheckedChanged(null, null); + //loginFailedCount = 0; + //txtPassWord.Focus(); + //txtPassWord.Text = null; + //lblICCard.Visible = txtPassword2.Visible = true; + //btLogin.Visible = pLogin_pwd.Visible = false; + } + + private void txtPassWord_KeyUp(object sender, KeyEventArgs e) + { + + DateTime _tempDt = DateTime.Now; + TimeSpan ts = _tempDt.Subtract(_dt); + if (ts.Milliseconds > 100) + { + + txtPassword2.Text = "";//清空 + } + else + { + if (e.KeyCode == Keys.Enter) + { + + if (txtPassword2.Text == string.Empty) + { + txtPassword2.Focus(); + MessageBox.Show("IC卡号为空", "系统提示"); + return; + } + UserHelper helper = new UserHelper(""); + string strErr = ""; + var res = helper.CheckUserLogin("user.pt", "", txtPassword2.Text.Trim(), ref strErr); + if (res == null) + { + txtPassword2.Text = ""; + txtPassword2.Focus(); + MessageBox.Show("IC卡号不正确" + strErr, "系统提示"); + return; + } + sendLogin(res); + + this.Close(); + } + } + } + private void btLogin_Click(object sender, EventArgs e) + { + + if (string.IsNullOrEmpty(txtUserID.Text) | string.IsNullOrEmpty(txtPassWord.Text)) + { + txtUserID.Focus(); + MessageBox.Show("用户名或密码为空", "系统提示"); + return; + } + UserHelper helper = new UserHelper(""); + string strErr = ""; + var res = helper.CheckUserLogin("user.pt", txtUserID.Text.Trim(), txtPassWord.Text.Trim(), ref strErr); + if (res == null) + { + txtPassWord.Focus(); + loginFailedCount++; + MessageBox.Show($"用户名或密码不正确,登录失败({loginFailedCount})次!", "系统提示"); + return; + } + + sendLogin(res); + this.Close(); + } + + private void btExit_Click(object sender, EventArgs e) + { + this.Close(); + } + + + private void chkIsSK_CheckedChanged(object sender, EventArgs e) + { + //IniFileHelper.WriteIniData("SYSTEM_CONFIGURE", "IsSK", chkIsSK.Checked ? "1" : "0"); + //lblICCard.Visible = txtPassword2.Visible = chkIsSK.Checked; + //btLogin.Visible = pLogin_pwd.Visible = !chkIsSK.Checked; + //lblICCard.Visible = txtPassword2.Visible = true; + //btLogin.Visible = pLogin.Visible = false; + if (chkIsSK.Checked) + { + pLogin_card.Visible = true; + pLogin_pwd.Visible = false; + } + else + { + pLogin_pwd.Visible = true; + pLogin_card.Visible = false; + } + + } + //定义输入时间变量 + private DateTime _dt; + private void txtPassword2_KeyDown(object sender, KeyEventArgs e) + { + } + } +} diff --git a/JY.Inspection/Frm/LoginForm.designer.cs b/JY.Inspection/Frm/LoginForm.designer.cs new file mode 100644 index 0000000..24fe8fd --- /dev/null +++ b/JY.Inspection/Frm/LoginForm.designer.cs @@ -0,0 +1,294 @@ + +namespace JY.Inspection.Frm +{ + partial class LoginForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LoginForm)); + this.chkIsSK = new MetroFramework.Controls.MetroCheckBox(); + this.btExit = new MetroFramework.Controls.MetroButton(); + this.btLogin = new MetroFramework.Controls.MetroButton(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.txtUserID = new MetroFramework.Controls.MetroTextBox(); + this.txtPassWord = new MetroFramework.Controls.MetroTextBox(); + this.metroLabel1 = new MetroFramework.Controls.MetroLabel(); + this.metroLabel3 = new MetroFramework.Controls.MetroLabel(); + this.pLogin_pwd = new System.Windows.Forms.Panel(); + this.pLogin_card = new System.Windows.Forms.Panel(); + this.lblICCard = new MetroFramework.Controls.MetroLabel(); + this.txtPassword2 = new MetroFramework.Controls.MetroTextBox(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.pLogin_pwd.SuspendLayout(); + this.pLogin_card.SuspendLayout(); + this.SuspendLayout(); + // + // chkIsSK + // + this.chkIsSK.AutoSize = true; + this.chkIsSK.Location = new System.Drawing.Point(237, 390); + this.chkIsSK.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.chkIsSK.Name = "chkIsSK"; + this.chkIsSK.Size = new System.Drawing.Size(168, 17); + this.chkIsSK.TabIndex = 20; + this.chkIsSK.Text = "是否启用刷卡模式?"; + this.chkIsSK.UseSelectable = true; + // + // btExit + // + this.btExit.Location = new System.Drawing.Point(279, 428); + this.btExit.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btExit.Name = "btExit"; + this.btExit.Size = new System.Drawing.Size(127, 46); + this.btExit.TabIndex = 22; + this.btExit.Text = "退 出"; + this.btExit.UseSelectable = true; + this.btExit.Click += new System.EventHandler(this.btExit_Click); + // + // btLogin + // + this.btLogin.Location = new System.Drawing.Point(81, 428); + this.btLogin.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btLogin.Name = "btLogin"; + this.btLogin.Size = new System.Drawing.Size(127, 46); + this.btLogin.TabIndex = 21; + this.btLogin.Text = "登 录"; + this.btLogin.UseSelectable = true; + // + // pictureBox1 + // + this.pictureBox1.Image = global::JY.Inspection.Properties.Resources.登录; + this.pictureBox1.Location = new System.Drawing.Point(153, 55); + this.pictureBox1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(168, 165); + this.pictureBox1.TabIndex = 18; + this.pictureBox1.TabStop = false; + // + // txtUserID + // + // + // + // + this.txtUserID.CustomButton.Image = null; + this.txtUserID.CustomButton.Location = new System.Drawing.Point(236, 1); + this.txtUserID.CustomButton.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txtUserID.CustomButton.Name = ""; + this.txtUserID.CustomButton.Size = new System.Drawing.Size(36, 34); + this.txtUserID.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.txtUserID.CustomButton.TabIndex = 1; + this.txtUserID.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.txtUserID.CustomButton.UseSelectable = true; + this.txtUserID.CustomButton.Visible = false; + this.txtUserID.Lines = new string[] { + "Admin"}; + this.txtUserID.Location = new System.Drawing.Point(108, 16); + this.txtUserID.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txtUserID.MaxLength = 32767; + this.txtUserID.Name = "txtUserID"; + this.txtUserID.PasswordChar = '\0'; + this.txtUserID.PromptText = "请输入员工号"; + this.txtUserID.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.txtUserID.SelectedText = ""; + this.txtUserID.SelectionLength = 0; + this.txtUserID.SelectionStart = 0; + this.txtUserID.ShortcutsEnabled = true; + this.txtUserID.Size = new System.Drawing.Size(205, 29); + this.txtUserID.TabIndex = 0; + this.txtUserID.Text = "Admin"; + this.txtUserID.UseSelectable = true; + this.txtUserID.WaterMark = "请输入员工号"; + this.txtUserID.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.txtUserID.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // txtPassWord + // + // + // + // + this.txtPassWord.CustomButton.Image = null; + this.txtPassWord.CustomButton.Location = new System.Drawing.Point(236, 1); + this.txtPassWord.CustomButton.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txtPassWord.CustomButton.Name = ""; + this.txtPassWord.CustomButton.Size = new System.Drawing.Size(36, 34); + this.txtPassWord.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.txtPassWord.CustomButton.TabIndex = 1; + this.txtPassWord.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.txtPassWord.CustomButton.UseSelectable = true; + this.txtPassWord.CustomButton.Visible = false; + this.txtPassWord.Lines = new string[] { + "Admin"}; + this.txtPassWord.Location = new System.Drawing.Point(108, 60); + this.txtPassWord.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txtPassWord.MaxLength = 32767; + this.txtPassWord.Name = "txtPassWord"; + this.txtPassWord.PasswordChar = '*'; + this.txtPassWord.PromptText = "请输入密码"; + this.txtPassWord.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.txtPassWord.SelectedText = ""; + this.txtPassWord.SelectionLength = 0; + this.txtPassWord.SelectionStart = 0; + this.txtPassWord.ShortcutsEnabled = true; + this.txtPassWord.Size = new System.Drawing.Size(205, 29); + this.txtPassWord.TabIndex = 1; + this.txtPassWord.Text = "Admin"; + this.txtPassWord.UseSelectable = true; + this.txtPassWord.WaterMark = "请输入密码"; + this.txtPassWord.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.txtPassWord.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // metroLabel1 + // + this.metroLabel1.AutoSize = true; + this.metroLabel1.Location = new System.Drawing.Point(12, 66); + this.metroLabel1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.metroLabel1.Name = "metroLabel1"; + this.metroLabel1.Size = new System.Drawing.Size(54, 20); + this.metroLabel1.TabIndex = 11; + this.metroLabel1.Text = "密码:"; + // + // metroLabel3 + // + this.metroLabel3.AutoSize = true; + this.metroLabel3.Location = new System.Drawing.Point(12, 22); + this.metroLabel3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.metroLabel3.Name = "metroLabel3"; + this.metroLabel3.Size = new System.Drawing.Size(69, 20); + this.metroLabel3.TabIndex = 10; + this.metroLabel3.Text = "员工号:"; + // + // pLogin_pwd + // + this.pLogin_pwd.Controls.Add(this.txtUserID); + this.pLogin_pwd.Controls.Add(this.txtPassWord); + this.pLogin_pwd.Controls.Add(this.metroLabel1); + this.pLogin_pwd.Controls.Add(this.metroLabel3); + this.pLogin_pwd.Location = new System.Drawing.Point(81, 278); + this.pLogin_pwd.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.pLogin_pwd.Name = "pLogin_pwd"; + this.pLogin_pwd.Size = new System.Drawing.Size(333, 94); + this.pLogin_pwd.TabIndex = 26; + // + // pLogin_card + // + this.pLogin_card.Controls.Add(this.lblICCard); + this.pLogin_card.Controls.Add(this.txtPassword2); + this.pLogin_card.Location = new System.Drawing.Point(81, 207); + this.pLogin_card.Name = "pLogin_card"; + this.pLogin_card.Size = new System.Drawing.Size(333, 50); + this.pLogin_card.TabIndex = 27; + // + // lblICCard + // + this.lblICCard.AutoSize = true; + this.lblICCard.Location = new System.Drawing.Point(12, 24); + this.lblICCard.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblICCard.Name = "lblICCard"; + this.lblICCard.Size = new System.Drawing.Size(51, 20); + this.lblICCard.TabIndex = 25; + this.lblICCard.Text = "IC卡:"; + // + // txtPassword2 + // + // + // + // + this.txtPassword2.CustomButton.Image = null; + this.txtPassword2.CustomButton.Location = new System.Drawing.Point(177, 1); + this.txtPassword2.CustomButton.Margin = new System.Windows.Forms.Padding(4); + this.txtPassword2.CustomButton.Name = ""; + this.txtPassword2.CustomButton.Size = new System.Drawing.Size(27, 27); + this.txtPassword2.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.txtPassword2.CustomButton.TabIndex = 1; + this.txtPassword2.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.txtPassword2.CustomButton.UseSelectable = true; + this.txtPassword2.CustomButton.Visible = false; + this.txtPassword2.Lines = new string[0]; + this.txtPassword2.Location = new System.Drawing.Point(105, 17); + this.txtPassword2.Margin = new System.Windows.Forms.Padding(4); + this.txtPassword2.MaxLength = 32767; + this.txtPassword2.Name = "txtPassword2"; + this.txtPassword2.PasswordChar = '*'; + this.txtPassword2.PromptText = "请刷卡"; + this.txtPassword2.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.txtPassword2.SelectedText = ""; + this.txtPassword2.SelectionLength = 0; + this.txtPassword2.SelectionStart = 0; + this.txtPassword2.ShortcutsEnabled = true; + this.txtPassword2.Size = new System.Drawing.Size(205, 29); + this.txtPassword2.TabIndex = 24; + this.txtPassword2.UseSelectable = true; + this.txtPassword2.WaterMark = "请刷卡"; + this.txtPassword2.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.txtPassword2.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // LoginForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(472, 529); + this.Controls.Add(this.pLogin_pwd); + this.Controls.Add(this.pLogin_card); + this.Controls.Add(this.chkIsSK); + this.Controls.Add(this.btExit); + this.Controls.Add(this.btLogin); + this.Controls.Add(this.pictureBox1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "LoginForm"; + this.Padding = new System.Windows.Forms.Padding(27, 75, 27, 25); + this.Resizable = false; + this.Text = "登录"; + this.Load += new System.EventHandler(this.LoginForm_Load); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.pLogin_pwd.ResumeLayout(false); + this.pLogin_pwd.PerformLayout(); + this.pLogin_card.ResumeLayout(false); + this.pLogin_card.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private MetroFramework.Controls.MetroCheckBox chkIsSK; + private MetroFramework.Controls.MetroButton btExit; + private MetroFramework.Controls.MetroButton btLogin; + private System.Windows.Forms.PictureBox pictureBox1; + private MetroFramework.Controls.MetroTextBox txtUserID; + private MetroFramework.Controls.MetroTextBox txtPassWord; + private MetroFramework.Controls.MetroLabel metroLabel1; + private MetroFramework.Controls.MetroLabel metroLabel3; + private System.Windows.Forms.Panel pLogin_pwd; + private System.Windows.Forms.Panel pLogin_card; + private MetroFramework.Controls.MetroLabel lblICCard; + private MetroFramework.Controls.MetroTextBox txtPassword2; + } +} \ No newline at end of file diff --git a/JY.Inspection/Frm/LoginForm.resx b/JY.Inspection/Frm/LoginForm.resx new file mode 100644 index 0000000..acb5bb2 --- /dev/null +++ b/JY.Inspection/Frm/LoginForm.resx @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlN + UABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAWU1QAFpNUABZTVASWU1QH1lNUB9ZTVAfWU1QH1lN + UB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUBJaTVAAWU1QAFlN + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXE5OAFlNUABZTVAFWU1QaFlLUM1YS0/gWEtQ4FhL + UOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS0/gWUtQzVlN + UGhZTVAFWU1QAFxOTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWS1EAWU1QAFlNUE5ZTlD0YGxY/2eH + Xv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eH + Xv9gbFj/WU5Q9FlNUE5ZTVAAVktRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhNUABaTVAAWUtQkl1c + VP9xtWn/dchu/3TIbf90yG3/dMht/3TIbf90yG3/dMht/3THbf91yG7/dMht/3TIbf90yG3/dMht/3TI + bf90yG3/dchu/3G1af9dXFT/WUtQklpNUABYTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNH + UAFYS0+fX2RW/3K+a/9zxm3/c8Vs/3PFbP9zxWz/c8Vs/3PFbP90xm3/b7Fo/3G6av90xm3/c8Vs/3PF + bf90xm3/dMZt/3TGbf90xm3/c79s/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYTFAAU0dQAVhKT59gZVf/fsp1/4HVd/+B1Hf/gdR3/4HUd/+B1Hf/gdR3/4HWd/9tnWX/Z4lf/3/S + dv+B1Hf/fdF1/3fJb/90xm3/dMZt/3TGbf9zvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+T4Yb/mfCL/5nvi/+Z74v/me+L/5nvi/+Z74v/lu2J/3Cg + aP9cV1L/gr92/5nwi/+Y7or/keaF/3/Sdv90xm3/dMZt/3O+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nvi/+Z74v/me+L/5nv + i/+T6ob/bp5l/09ZYv9ieGL/keCD/5rwjP+a8Iv/leuI/3zPdP90xm3/c75r/19kVv9YS0+fU0dQAVhM + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nwi/+Z74v/me+L/5nv + i/+Z74v/mvCM/4/lg/9tmmH/OXuO/zp6jf92nmn/mO6K/5nvi/+a8Iz/jOCA/3XHbf9zvmv/X2RW/1hL + T59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+U4ob/mfCL/5nv + i/+Z74v/me+L/5nvi/+U64f/gtl5/2yYX/82gJT/ELXe/1Nsaf+HyXn/mvGM/5nvi/+T6Ib/d8pw/3K+ + a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Ti + hv+Z8Iv/me+L/5nvi/+T6ob/hdZ6/3W0av9pj17/XGtb/y+Ko/8Az///J5Ox/2iAYf+T5Yb/mvCM/5Tq + h/95y3H/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhK + T59kaFr/lOKG/5nwi/+Z8Iv/idZ9/22aZf9ed1//SnB0/zCHoP8Xq9D/Bcb0/wDP//8Fx/b/P3aE/3uq + bv+Z8Iv/leqH/3nMcf9yvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhM + UABTR1ABWEpPn2RoWv+U4ob/mfCL/5rxjP+Kzn3/WWJe/yGau/8GxPL/AM///wDR//8Az///BMf3/w63 + 4v8wgpz/X2VY/4zVf/+V64j/ecxx/3K+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5jtiv9wjmj/JZWz/wDQ//8Azv//FLHX/zCI + oP9GdX7/XHZp/26MaP9+r3L/kd+E/5XriP95zHH/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nwi/+Z74v/mvGM/4vKe/9McnX/CMHv/wLL + +/9AdoP/dpRk/4vJe/+T4YX/mO6K/5rxjP+a8Iz/lOqH/3nMcf9yvmv/X2RW/1hLT59TR1ABWExQAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+U4ob/mfCL/5nvi/+Z74v/mOyK/2+K + Z/8jmLn/CMDt/1Nzbv+Q2oH/m/OM/5nwi/+Z74v/me+L/5nvi/+V6of/ecxx/3K+a/9fZFb/WEtPn1NH + UAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nv + i/+a8Yz/isZ6/0h1fP8cocX/ZoBo/5fpiP+Z74v/me+L/5nvi/+Z74v/me+L/5Xqh/95zHH/cr5r/19k + Vv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nw + i/+Z74v/me+L/5nvi/+Y64n/bIlq/0Nmdv91mW3/mvCL/5nvi/+Z74v/me+L/5nvi/+Z74v/leqH/3nM + cf9yvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2Ro + Wv+U4ob/mfCL/5nvi/+Z74v/me+L/5rxjP+Iwnv/XVZT/4K2dv+a8oz/me+L/5nvi/+Z74v/me+L/5nv + i/+V6of/ecxx/3K+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNH + UAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nvi/+Z74v/me+L/5fpif9yi2f/jM9//5rxjP+Z74v/me+L/5nv + i/+Z74v/me+L/5Xqh/95zHH/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYTFAAUkdQAFhKT55kaFr/leSH/5ryjP+a8Yz/mvGM/5rxjP+a8Yz/mvKM/5DYg/+W6Ij/mvKM/5rx + jP+a8Yz/mvGM/5rxjP+a8oz/leyI/3nNcf9zwGz/X2RW/1hKT55SR1AAWExQAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhMUABXSVABWEtPoWFhV/+FvHj/icd8/4nGfP+Jxnz/icZ8/4nGfP+Jxnz/icd8/4nH + fP+Jxnz/icZ8/4nGfP+Jxnz/icZ8/4nHfP+Gw3n/caxp/2yiZP9dXlT/WUtQoVdJUAFYTFAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWUxQAFlLUAJZTVCnWk5R/1xTU/9cU1L/XFNS/1xTUv9cU1L/XFNS/1xT + Uv9cU1L/XFNS/1xTUv9cU1L/XFNS/1xTUv9cU1L/XFNS/1tTUv9aUlH/WlJR/1lOUP9ZTVCnWUtQAllM + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAW05QAFlMUJldUlT/gYF8/42Qif+MkIj/jJCI/4yQ + iP+MkIj/jJCI/4yQiP+MkIj/jJCI/4yQiP+MkIj/jJCI/4yQiP+MkIj/jJCI/42Qif+BgXz/XVJU/1lM + UJlbTlEAWU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFtGTQBZTVAAWU1QVFpOUfdtZ2b/fn15/35+ + ef9+fnn/fn55/39+ef9+fnn/fn55/35+ef9+fnn/fn55/35+ef9/fnn/fn55/35+ef9+fnn/fn15/21n + Zv9aTlH3WU1QVFlNUABbRk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVlNTAFlNUABZTVAHWU1Qb1hM + T9JXS07lV0tO5FdLTuVYS074WExP/1pOUf9aTlH/Wk5R/1pOUf9aTlH/Wk5R/1hMT/9YS074V0tO5VdL + TuRXS07lWExP0llNUG9ZTVAGWU1QAFZTUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWU1QAFlN + UABbTk8AWU1QFllNUCNZTVAjWU1QKVhMT8JiV1n/fHN2/311d/99dXf/fXV3/311d/98dHb/Ylda/1hM + T8JZTVApWU1QI1lNUCNZTVAVXE5QAFlNUABZTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAWU1QAFlNUABZTVAAWU1QAFlNUABWSlAAWExPpV5TVv9yaGr/c2ps/3NqbP9zamz/c2ps/3Jo + av9eU1b/WExPpVZKUQFZTVAAWU1QAFlNUABYTVAAWU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVklRAFlNUABZTVA7WU1QwlhMT+BYTE/gWExP4FhM + T+BYTE/gWExP4FlNUMJZTVA7WU1QAFZKUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFEAWE1QAFlNUABZTVAPWU1QH1lN + UB9ZTVAfWU1QH1lNUB9ZTVAfWU1QD1lNUABYTFEAWExRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAWE1QAFlN + UABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA+AAAH/AAAA/gAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH8AAAD/gAAB//gAH//4AB///AA/8= + + + \ No newline at end of file diff --git a/JY.Inspection/Frm/SetForm.cs b/JY.Inspection/Frm/SetForm.cs new file mode 100644 index 0000000..a4a0c71 --- /dev/null +++ b/JY.Inspection/Frm/SetForm.cs @@ -0,0 +1,207 @@ +using JY.Inspection.Common; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Windows.Forms; + +namespace JY.Inspection.Frm +{ + public partial class SetForm : MetroFramework.Forms.MetroForm + { + UserHelper helper = new UserHelper(""); + List ListUser = new List(); + DataTable dt = new DataTable(); + public SetForm() + { + InitializeComponent(); + + if (File.Exists("user.pt")) + { + ListUser = helper.DeSerializedUser("user.pt"); + ShowUserList(ListUser); + } + } + + private void SetForm_Load(object sender, EventArgs e) + { + + } + + public void ShowUserList(List List) + { + + List UpList = new List(); + for (int i = 0; i < List.Count; i++) + { + if (i>0) + { + UpList.Add(List[i]); + } + } + dgvManger.DataSource = null; + dgvManger.DataSource = UpList; + } + + /// + /// + /// + /// + /// + /// + public static DataTable ToDataTable(IEnumerable collection) + { + var props = typeof(T).GetProperties(); + var dt = new DataTable(); + dt.Columns.AddRange(props.Select(p => new DataColumn(p.Name, p.PropertyType)).ToArray()); + if (collection.Count() > 0) + { + for (int i = 0; i < collection.Count(); i++) + { + ArrayList tempList = new ArrayList(); + foreach (PropertyInfo pi in props) + { + object obj = pi.GetValue(collection.ElementAt(i), null); + tempList.Add(obj); + } + object[] array = tempList.ToArray(); + dt.LoadDataRow(array, true); + } + } + return dt; + } + + private User GetUser(List list) + { + if (txtUser.Text == string.Empty | txtPassWord.Text == string.Empty) + { + return null; + } + User user = new User(); + user.Index = list[list.Count - 1].Index + 1; + user.UserName = txtUser.Text; + user.PassWord = txtPassWord.Text; + switch (cmbLevel.SelectedIndex) + { + case 0: + user.Level = Autuority.管理员; + break; + case 1: + user.Level = Autuority.工程师; + break; + case 2: + user.Level = Autuority.操作员; + break; + default: + break; + } + return user; + } + + /// + /// 获取表格选中行单元格数据 + /// + private void SetUser() + { + DataGridViewSelectedRowCollection rowCollection = dgvManger.SelectedRows; + if (rowCollection.Count == 0) + { + return; + } + DataGridViewRow row = rowCollection[0]; + txtUser.Text = row.Cells[1].Value.ToString(); + txtPassWord.Text = row.Cells[2].Value.ToString(); + switch (row.Cells[3].Value.ToString()) + { + case "管理员": + cmbLevel.SelectedIndex = 0; + break; + case "工程师": + cmbLevel.SelectedIndex = 1; + break; + case "操作员": + cmbLevel.SelectedIndex = 2; + break; + default: + break; + } + } + + /// + /// 添加用户 + /// + /// + /// + private void btAdd_Click(object sender, EventArgs e) + { + + + User user = GetUser(ListUser); + var res = helper.AddUser("user.pt", ListUser, user); + if (res) + { + MessageBox.Show("添加成功"); + ShowUserList(ListUser); + } + else if (user == null) + { + MessageBox.Show("添加内容为空"); + } + + else + { + MessageBox.Show("添加失败"); + } + } + + /// + /// 删除用户 + /// + /// + /// + private void btDelete_Click(object sender, EventArgs e) + { + + var res = helper.DeleteUser("user.pt", ListUser, txtUser.Text); + if (res) + { + MessageBox.Show("删除成功"); + ShowUserList(ListUser); + } + else + { + MessageBox.Show("删除失败"); + } + } + + private void dgvManger_SelectionChanged(object sender, EventArgs e) + { + SetUser(); + } + + /// + /// 编辑用户 + /// + /// + /// + private void btEdit_Click(object sender, EventArgs e) + { + User user = GetUser(ListUser); + var res = helper.EditUser("user.pt", ListUser, user); + if (res) + { + MessageBox.Show("修改成功"); + ShowUserList(ListUser); + } + else + { + MessageBox.Show("修改失败"); + } + } + + + } +} diff --git a/JY.Inspection/Frm/SetForm.designer.cs b/JY.Inspection/Frm/SetForm.designer.cs new file mode 100644 index 0000000..6abe739 --- /dev/null +++ b/JY.Inspection/Frm/SetForm.designer.cs @@ -0,0 +1,270 @@ + +namespace JY.Inspection.Frm +{ + partial class SetForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SetForm)); + this.dgvManger = new System.Windows.Forms.DataGridView(); + this.txtUser = new MetroFramework.Controls.MetroTextBox(); + this.txtPassWord = new MetroFramework.Controls.MetroTextBox(); + this.cmbLevel = new MetroFramework.Controls.MetroComboBox(); + this.metroLabel1 = new MetroFramework.Controls.MetroLabel(); + this.metroLabel2 = new MetroFramework.Controls.MetroLabel(); + this.metroLabel3 = new MetroFramework.Controls.MetroLabel(); + this.btAdd = new MetroFramework.Controls.MetroButton(); + this.btDelete = new MetroFramework.Controls.MetroButton(); + this.btEdit = new MetroFramework.Controls.MetroButton(); + this.metroTabControl1 = new MetroFramework.Controls.MetroTabControl(); + this.metroTabPage1 = new MetroFramework.Controls.MetroTabPage(); + ((System.ComponentModel.ISupportInitialize)(this.dgvManger)).BeginInit(); + this.metroTabControl1.SuspendLayout(); + this.metroTabPage1.SuspendLayout(); + this.SuspendLayout(); + // + // dgvManger + // + this.dgvManger.AllowUserToAddRows = false; + this.dgvManger.AllowUserToDeleteRows = false; + this.dgvManger.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill; + this.dgvManger.BackgroundColor = System.Drawing.Color.White; + this.dgvManger.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dgvManger.Location = new System.Drawing.Point(3, 12); + this.dgvManger.Name = "dgvManger"; + this.dgvManger.ReadOnly = true; + this.dgvManger.RowHeadersWidth = 51; + this.dgvManger.RowTemplate.Height = 23; + this.dgvManger.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgvManger.Size = new System.Drawing.Size(472, 469); + this.dgvManger.TabIndex = 0; + this.dgvManger.SelectionChanged += new System.EventHandler(this.dgvManger_SelectionChanged); + // + // txtUser + // + // + // + // + this.txtUser.CustomButton.Image = null; + this.txtUser.CustomButton.Location = new System.Drawing.Point(107, 1); + this.txtUser.CustomButton.Name = ""; + this.txtUser.CustomButton.Size = new System.Drawing.Size(16, 17); + this.txtUser.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.txtUser.CustomButton.TabIndex = 1; + this.txtUser.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.txtUser.CustomButton.UseSelectable = true; + this.txtUser.CustomButton.Visible = false; + this.txtUser.Lines = new string[0]; + this.txtUser.Location = new System.Drawing.Point(566, 31); + this.txtUser.MaxLength = 32767; + this.txtUser.Name = "txtUser"; + this.txtUser.PasswordChar = '\0'; + this.txtUser.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.txtUser.SelectedText = ""; + this.txtUser.SelectionLength = 0; + this.txtUser.SelectionStart = 0; + this.txtUser.ShortcutsEnabled = true; + this.txtUser.Size = new System.Drawing.Size(165, 23); + this.txtUser.TabIndex = 1; + this.txtUser.UseSelectable = true; + this.txtUser.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.txtUser.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // txtPassWord + // + // + // + // + this.txtPassWord.CustomButton.Image = null; + this.txtPassWord.CustomButton.Location = new System.Drawing.Point(107, 1); + this.txtPassWord.CustomButton.Name = ""; + this.txtPassWord.CustomButton.Size = new System.Drawing.Size(16, 17); + this.txtPassWord.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.txtPassWord.CustomButton.TabIndex = 1; + this.txtPassWord.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.txtPassWord.CustomButton.UseSelectable = true; + this.txtPassWord.CustomButton.Visible = false; + this.txtPassWord.Lines = new string[0]; + this.txtPassWord.Location = new System.Drawing.Point(566, 89); + this.txtPassWord.MaxLength = 32767; + this.txtPassWord.Name = "txtPassWord"; + this.txtPassWord.PasswordChar = '\0'; + this.txtPassWord.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.txtPassWord.SelectedText = ""; + this.txtPassWord.SelectionLength = 0; + this.txtPassWord.SelectionStart = 0; + this.txtPassWord.ShortcutsEnabled = true; + this.txtPassWord.Size = new System.Drawing.Size(165, 23); + this.txtPassWord.TabIndex = 2; + this.txtPassWord.UseSelectable = true; + this.txtPassWord.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.txtPassWord.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // cmbLevel + // + this.cmbLevel.FormattingEnabled = true; + this.cmbLevel.ItemHeight = 23; + this.cmbLevel.Items.AddRange(new object[] { + "管理员", + "工程师", + "操作员"}); + this.cmbLevel.Location = new System.Drawing.Point(566, 147); + this.cmbLevel.Name = "cmbLevel"; + this.cmbLevel.Size = new System.Drawing.Size(165, 29); + this.cmbLevel.TabIndex = 3; + this.cmbLevel.UseSelectable = true; + // + // metroLabel1 + // + this.metroLabel1.AutoSize = true; + this.metroLabel1.Location = new System.Drawing.Point(501, 31); + this.metroLabel1.Name = "metroLabel1"; + this.metroLabel1.Size = new System.Drawing.Size(65, 19); + this.metroLabel1.TabIndex = 4; + this.metroLabel1.Text = "用户名:"; + // + // metroLabel2 + // + this.metroLabel2.AutoSize = true; + this.metroLabel2.Location = new System.Drawing.Point(501, 92); + this.metroLabel2.Name = "metroLabel2"; + this.metroLabel2.Size = new System.Drawing.Size(51, 19); + this.metroLabel2.TabIndex = 5; + this.metroLabel2.Text = "密码:"; + // + // metroLabel3 + // + this.metroLabel3.AutoSize = true; + this.metroLabel3.Location = new System.Drawing.Point(501, 153); + this.metroLabel3.Name = "metroLabel3"; + this.metroLabel3.Size = new System.Drawing.Size(51, 19); + this.metroLabel3.TabIndex = 6; + this.metroLabel3.Text = "权限:"; + // + // btAdd + // + this.btAdd.Location = new System.Drawing.Point(491, 213); + this.btAdd.Name = "btAdd"; + this.btAdd.Size = new System.Drawing.Size(75, 23); + this.btAdd.TabIndex = 7; + this.btAdd.Text = "添加"; + this.btAdd.UseSelectable = true; + this.btAdd.Click += new System.EventHandler(this.btAdd_Click); + // + // btDelete + // + this.btDelete.Location = new System.Drawing.Point(580, 213); + this.btDelete.Name = "btDelete"; + this.btDelete.Size = new System.Drawing.Size(75, 23); + this.btDelete.TabIndex = 8; + this.btDelete.Text = "删除"; + this.btDelete.UseSelectable = true; + this.btDelete.Click += new System.EventHandler(this.btDelete_Click); + // + // btEdit + // + this.btEdit.Location = new System.Drawing.Point(669, 213); + this.btEdit.Name = "btEdit"; + this.btEdit.Size = new System.Drawing.Size(75, 23); + this.btEdit.TabIndex = 9; + this.btEdit.Text = "编辑"; + this.btEdit.UseSelectable = true; + this.btEdit.Click += new System.EventHandler(this.btEdit_Click); + // + // metroTabControl1 + // + this.metroTabControl1.Controls.Add(this.metroTabPage1); + this.metroTabControl1.Dock = System.Windows.Forms.DockStyle.Fill; + this.metroTabControl1.Location = new System.Drawing.Point(0, 30); + this.metroTabControl1.Name = "metroTabControl1"; + this.metroTabControl1.SelectedIndex = 0; + this.metroTabControl1.Size = new System.Drawing.Size(773, 535); + this.metroTabControl1.TabIndex = 10; + this.metroTabControl1.UseSelectable = true; + // + // metroTabPage1 + // + this.metroTabPage1.Controls.Add(this.btEdit); + this.metroTabPage1.Controls.Add(this.btDelete); + this.metroTabPage1.Controls.Add(this.btAdd); + this.metroTabPage1.Controls.Add(this.dgvManger); + this.metroTabPage1.Controls.Add(this.metroLabel3); + this.metroTabPage1.Controls.Add(this.txtUser); + this.metroTabPage1.Controls.Add(this.metroLabel2); + this.metroTabPage1.Controls.Add(this.txtPassWord); + this.metroTabPage1.Controls.Add(this.metroLabel1); + this.metroTabPage1.Controls.Add(this.cmbLevel); + this.metroTabPage1.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.metroTabPage1.HorizontalScrollbarBarColor = true; + this.metroTabPage1.HorizontalScrollbarHighlightOnWheel = false; + this.metroTabPage1.HorizontalScrollbarSize = 10; + this.metroTabPage1.Location = new System.Drawing.Point(4, 38); + this.metroTabPage1.Name = "metroTabPage1"; + this.metroTabPage1.Size = new System.Drawing.Size(765, 493); + this.metroTabPage1.TabIndex = 0; + this.metroTabPage1.Text = "用户管理"; + this.metroTabPage1.VerticalScrollbarBarColor = true; + this.metroTabPage1.VerticalScrollbarHighlightOnWheel = false; + this.metroTabPage1.VerticalScrollbarSize = 10; + // + // SetForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(773, 565); + this.Controls.Add(this.metroTabControl1); + this.DisplayHeader = false; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.Name = "SetForm"; + this.Padding = new System.Windows.Forms.Padding(0, 30, 0, 0); + this.Text = "用户管理"; + this.Load += new System.EventHandler(this.SetForm_Load); + ((System.ComponentModel.ISupportInitialize)(this.dgvManger)).EndInit(); + this.metroTabControl1.ResumeLayout(false); + this.metroTabPage1.ResumeLayout(false); + this.metroTabPage1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.DataGridView dgvManger; + private MetroFramework.Controls.MetroTextBox txtUser; + private MetroFramework.Controls.MetroTextBox txtPassWord; + private MetroFramework.Controls.MetroComboBox cmbLevel; + private MetroFramework.Controls.MetroLabel metroLabel1; + private MetroFramework.Controls.MetroLabel metroLabel2; + private MetroFramework.Controls.MetroLabel metroLabel3; + private MetroFramework.Controls.MetroButton btAdd; + private MetroFramework.Controls.MetroButton btDelete; + private MetroFramework.Controls.MetroButton btEdit; + private MetroFramework.Controls.MetroTabControl metroTabControl1; + private MetroFramework.Controls.MetroTabPage metroTabPage1; + } +} \ No newline at end of file diff --git a/JY.Inspection/Frm/SetForm.resx b/JY.Inspection/Frm/SetForm.resx new file mode 100644 index 0000000..acb5bb2 --- /dev/null +++ b/JY.Inspection/Frm/SetForm.resx @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlN + UABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAWU1QAFpNUABZTVASWU1QH1lNUB9ZTVAfWU1QH1lN + UB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUB9ZTVAfWU1QH1lNUBJaTVAAWU1QAFlN + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXE5OAFlNUABZTVAFWU1QaFlLUM1YS0/gWEtQ4FhL + UOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS1DgWEtQ4FhLUOBYS0/gWUtQzVlN + UGhZTVAFWU1QAFxOTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWS1EAWU1QAFlNUE5ZTlD0YGxY/2eH + Xv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eHXv9nh17/Z4de/2eH + Xv9gbFj/WU5Q9FlNUE5ZTVAAVktRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhNUABaTVAAWUtQkl1c + VP9xtWn/dchu/3TIbf90yG3/dMht/3TIbf90yG3/dMht/3THbf91yG7/dMht/3TIbf90yG3/dMht/3TI + bf90yG3/dchu/3G1af9dXFT/WUtQklpNUABYTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNH + UAFYS0+fX2RW/3K+a/9zxm3/c8Vs/3PFbP9zxWz/c8Vs/3PFbP90xm3/b7Fo/3G6av90xm3/c8Vs/3PF + bf90xm3/dMZt/3TGbf90xm3/c79s/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYTFAAU0dQAVhKT59gZVf/fsp1/4HVd/+B1Hf/gdR3/4HUd/+B1Hf/gdR3/4HWd/9tnWX/Z4lf/3/S + dv+B1Hf/fdF1/3fJb/90xm3/dMZt/3TGbf9zvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+T4Yb/mfCL/5nvi/+Z74v/me+L/5nvi/+Z74v/lu2J/3Cg + aP9cV1L/gr92/5nwi/+Y7or/keaF/3/Sdv90xm3/dMZt/3O+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nvi/+Z74v/me+L/5nv + i/+T6ob/bp5l/09ZYv9ieGL/keCD/5rwjP+a8Iv/leuI/3zPdP90xm3/c75r/19kVv9YS0+fU0dQAVhM + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nwi/+Z74v/me+L/5nv + i/+Z74v/mvCM/4/lg/9tmmH/OXuO/zp6jf92nmn/mO6K/5nvi/+a8Iz/jOCA/3XHbf9zvmv/X2RW/1hL + T59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+U4ob/mfCL/5nv + i/+Z74v/me+L/5nvi/+U64f/gtl5/2yYX/82gJT/ELXe/1Nsaf+HyXn/mvGM/5nvi/+T6Ib/d8pw/3K+ + a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Ti + hv+Z8Iv/me+L/5nvi/+T6ob/hdZ6/3W0av9pj17/XGtb/y+Ko/8Az///J5Ox/2iAYf+T5Yb/mvCM/5Tq + h/95y3H/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhK + T59kaFr/lOKG/5nwi/+Z8Iv/idZ9/22aZf9ed1//SnB0/zCHoP8Xq9D/Bcb0/wDP//8Fx/b/P3aE/3uq + bv+Z8Iv/leqH/3nMcf9yvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhM + UABTR1ABWEpPn2RoWv+U4ob/mfCL/5rxjP+Kzn3/WWJe/yGau/8GxPL/AM///wDR//8Az///BMf3/w63 + 4v8wgpz/X2VY/4zVf/+V64j/ecxx/3K+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5jtiv9wjmj/JZWz/wDQ//8Azv//FLHX/zCI + oP9GdX7/XHZp/26MaP9+r3L/kd+E/5XriP95zHH/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nwi/+Z74v/mvGM/4vKe/9McnX/CMHv/wLL + +/9AdoP/dpRk/4vJe/+T4YX/mO6K/5rxjP+a8Iz/lOqH/3nMcf9yvmv/X2RW/1hLT59TR1ABWExQAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2RoWv+U4ob/mfCL/5nvi/+Z74v/mOyK/2+K + Z/8jmLn/CMDt/1Nzbv+Q2oH/m/OM/5nwi/+Z74v/me+L/5nvi/+V6of/ecxx/3K+a/9fZFb/WEtPn1NH + UAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNHUAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nv + i/+a8Yz/isZ6/0h1fP8cocX/ZoBo/5fpiP+Z74v/me+L/5nvi/+Z74v/me+L/5Xqh/95zHH/cr5r/19k + Vv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFAAU0dQAVhKT59kaFr/lOKG/5nw + i/+Z74v/me+L/5nvi/+Y64n/bIlq/0Nmdv91mW3/mvCL/5nvi/+Z74v/me+L/5nvi/+Z74v/leqH/3nM + cf9yvmv/X2RW/1hLT59TR1ABWExQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhMUABTR1ABWEpPn2Ro + Wv+U4ob/mfCL/5nvi/+Z74v/me+L/5rxjP+Iwnv/XVZT/4K2dv+a8oz/me+L/5nvi/+Z74v/me+L/5nv + i/+V6of/ecxx/3K+a/9fZFb/WEtPn1NHUAFYTFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWExQAFNH + UAFYSk+fZGha/5Tihv+Z8Iv/me+L/5nvi/+Z74v/me+L/5fpif9yi2f/jM9//5rxjP+Z74v/me+L/5nv + i/+Z74v/me+L/5Xqh/95zHH/cr5r/19kVv9YS0+fU0dQAVhMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYTFAAUkdQAFhKT55kaFr/leSH/5ryjP+a8Yz/mvGM/5rxjP+a8Yz/mvKM/5DYg/+W6Ij/mvKM/5rx + jP+a8Yz/mvGM/5rxjP+a8oz/leyI/3nNcf9zwGz/X2RW/1hKT55SR1AAWExQAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhMUABXSVABWEtPoWFhV/+FvHj/icd8/4nGfP+Jxnz/icZ8/4nGfP+Jxnz/icd8/4nH + fP+Jxnz/icZ8/4nGfP+Jxnz/icZ8/4nHfP+Gw3n/caxp/2yiZP9dXlT/WUtQoVdJUAFYTFAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWUxQAFlLUAJZTVCnWk5R/1xTU/9cU1L/XFNS/1xTUv9cU1L/XFNS/1xT + Uv9cU1L/XFNS/1xTUv9cU1L/XFNS/1xTUv9cU1L/XFNS/1tTUv9aUlH/WlJR/1lOUP9ZTVCnWUtQAllM + UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAW05QAFlMUJldUlT/gYF8/42Qif+MkIj/jJCI/4yQ + iP+MkIj/jJCI/4yQiP+MkIj/jJCI/4yQiP+MkIj/jJCI/4yQiP+MkIj/jJCI/42Qif+BgXz/XVJU/1lM + UJlbTlEAWU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFtGTQBZTVAAWU1QVFpOUfdtZ2b/fn15/35+ + ef9+fnn/fn55/39+ef9+fnn/fn55/35+ef9+fnn/fn55/35+ef9/fnn/fn55/35+ef9+fnn/fn15/21n + Zv9aTlH3WU1QVFlNUABbRk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVlNTAFlNUABZTVAHWU1Qb1hM + T9JXS07lV0tO5FdLTuVYS074WExP/1pOUf9aTlH/Wk5R/1pOUf9aTlH/Wk5R/1hMT/9YS074V0tO5VdL + TuRXS07lWExP0llNUG9ZTVAGWU1QAFZTUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWU1QAFlN + UABbTk8AWU1QFllNUCNZTVAjWU1QKVhMT8JiV1n/fHN2/311d/99dXf/fXV3/311d/98dHb/Ylda/1hM + T8JZTVApWU1QI1lNUCNZTVAVXE5QAFlNUABZTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAWU1QAFlNUABZTVAAWU1QAFlNUABWSlAAWExPpV5TVv9yaGr/c2ps/3NqbP9zamz/c2ps/3Jo + av9eU1b/WExPpVZKUQFZTVAAWU1QAFlNUABYTVAAWU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVklRAFlNUABZTVA7WU1QwlhMT+BYTE/gWExP4FhM + T+BYTE/gWExP4FlNUMJZTVA7WU1QAFZKUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYTFEAWE1QAFlNUABZTVAPWU1QH1lN + UB9ZTVAfWU1QH1lNUB9ZTVAfWU1QD1lNUABYTFEAWExRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZTVAAWE1QAFlN + UABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUABZTVAAWU1QAFlNUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA+AAAH/AAAA/gAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA + AAfgAAAH8AAAD/gAAB//gAH//4AB///AA/8= + + + \ No newline at end of file diff --git a/JY.Inspection/HomeForm.cs b/JY.Inspection/HomeForm.cs new file mode 100644 index 0000000..74d42b3 --- /dev/null +++ b/JY.Inspection/HomeForm.cs @@ -0,0 +1,3794 @@ +//19QTH 930方形外观检测 启东FMS接口开发文档 - 外观检测 +using HslCommunication; +using HslCommunication.Core; +using HslCommunication.ModBus; +using JY.Common.Helper; +using JY.DAL; +using JY.DAL.Repository; +using JY.DAL.Service; +using JY.Inspection.Common; +using JY.Inspection.Entity; +using JY.Inspection.Frm; +using JY.Inspection.Mes; +using JY.MES; +using JY.MES.Entity; +using JY.MES.MES; +using JY.Model; +using JY.Model.Excel; +using JY.Utility; +using JYControl; +using log4net.Repository.Hierarchy; +using MetroFramework.Forms; +using Microsoft.Extensions.DependencyInjection; +using Modbus.Device; +using Newtonsoft.Json; +using NPOI.OpenXmlFormats.Shared; +using NPOI.OpenXmlFormats.Spreadsheet; +using NPOI.SS.Formula.Functions; +using Org.BouncyCastle.Utilities.Net; +using PLCCommunication; +using SimpleCommunication; +using SocketHelper; +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Drawing; +using System.Globalization; +using System.IO; +using System.IO.Ports; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Speech.Synthesis; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using System.Web.UI.WebControls; +using System.Windows.Forms; +using System.Windows.Forms.DataVisualization.Charting; + +namespace JY.Inspection +{ + public partial class HomeForm : MetroForm + { + //用双缓冲绘制窗口的所有控件 + + protected override CreateParams CreateParams + { + get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; return cp; } + } + + private Stopwatch sw = new Stopwatch(); + + UserHelper helper = new UserHelper(""); + List ListUser = new List(); + SynchronizationContext syscContext; + + private static IModbusMaster master; + private static SerialPort port; + private static ModbusTcpNet modbus; + + MESDataCombin ToMesData = new MESDataCombin(); + DateTime dtLogin; + //串口参数 + private string portName; + private int baudRate; + private ushort[] registerBuffer; + private string modbusTcp; + private string modbusTcpPort; + + private System.Timers.Timer timerWatt; + private double timejige = 2000;//2秒 + + private delegate void UpdateLog(int index, string log); + /// + /// 按钮状态委托 + /// + /// + public delegate void ShowButtonHandler(string time); + /// + /// 数据库访问接口 + /// + private IDbHelper dbHelper = new OpSqlDataBase(); + /// + ///上料电芯数据采集显示委托 + /// + /// + private delegate void ChangeFunctionWatthourMeter(List m); + /// + ///上料电芯数据采集显示委托 + /// + /// + private delegate void ChangeFunctionHTestA(List m); + /// + ///下料电芯采集显示委托 + /// + /// + private delegate void ChangeFunctionHTestB(List m); + /// + /// 绑定上料电芯数据 + /// + BindingList listTA = new BindingList(); + /// + /// 绑定空托盘 + /// + BindingList listTB = new BindingList(); + + private Task[] mTaskA = new Task[4]; + private Task[] mTaskC = new Task[1]; + private string MelsecConfigPath = AppDomain.CurrentDomain.BaseDirectory + "Config\\PlcConfig.ini"; + private string ConfigPath = AppDomain.CurrentDomain.BaseDirectory + "Config\\ComConfig.ini"; + + //private Thread thread = null; + + internal static FrmOmronPLCCom omronPLCCom; + private int OmronCount; + + ServiceLog serviceLog = new ServiceLog(); + private bool isEnabled = false; + private delegate void UpdateDataChart3(List xData, List yData); + + private CancellationTokenSource mctsA1 = new CancellationTokenSource(); + private CancellationTokenSource mctsA2 = new CancellationTokenSource(); + private CancellationTokenSource mctsA3 = new CancellationTokenSource(); + private CancellationTokenSource mctsA4 = new CancellationTokenSource(); + private CancellationTokenSource Amcts7 = new CancellationTokenSource(); + + private CancellationTokenSource mctsC1 = new CancellationTokenSource(); + //private CancellationTokenSource mctsC2 = new CancellationTokenSource(); + //private CancellationTokenSource mctsC3 = new CancellationTokenSource(); + //public CancellationTokenSource mCTState = new CancellationTokenSource(); + + public CancellationTokenSource mCOMState = new CancellationTokenSource(); + private ManualResetEvent resetEventRecv = new ManualResetEvent(true); + + private ByteTransformBase TransformBase = new ByteTransformBase(); + + + /// + /// 用于电芯出站时向FMS上报出站及生产数据 + /// + string BarCodeOutUrl = ""; + /// + /// 报警数据上传 + /// + string UpAlarmUrl = ""; + /// + /// 设备状态上传 + /// + string UpStatuesUrl = ""; + /// + /// MES上传验证码 + /// + string authorization = ""; + /// + /// 不良统计项目 + /// + List NGList = new List(); + + /// + /// 报警原始数据 + /// + List listAlamByte = new List(); + //报警表单数据 + List listAlarmForm = null; + //PLC报警状态值 + List listAlarmStatus = null; + + + /// + /// PLC报警状态信号 + /// + public string AlamCode = "0"; + + public bool IsNoOrg = false; + /// + /// 欧姆龙网口链接标志 + /// + public bool startOmronUp = false; + /// + /// 串口链接标志 + /// + public bool startComUp = false; + /// + /// tcpIP链接通知 + /// + public bool startTCPUp = false; + /// + /// 通讯链接标志 + /// + internal static bool startup = false; + /// + /// 测试型号 + /// + public string strProdType;//测试型号 + /// + /// 员工号 + /// + public string strWorker = ""; + + /// + /// 是否开启智能电表 + /// + public bool IsStartZNDB = false; + /// + /// 是否启用分档 + /// + public bool chkCkGrading = false; + /// + /// 班次 + /// + private int No = 0, ClassShift = 0; + /// + /// NG电池不分类排出 + /// + public bool IsStartNGFL = false; + public short[] MESGradingSet = new short[] { (short)1, (short)1, (short)1, (short)1 }; + public short[] MESGradingCCDSet = new short[] { (short)1, (short)1, (short)1, (short)1 }; + //新增 ng 拉带 + public short[] NgGradingSet = new short[] { (short)1, (short)1, (short)1 }; + public string[] strNgBound = new string[] { }; + private SpeechSynthesizer _speech;//异常播报 + + public HomeForm() + { + //设置窗体的双缓冲 + this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint, true); + this.UpdateStyles(); + + InitializeComponent(); + //掩耳盗铃线程控制UI控件 + CheckForIllegalCrossThreadCalls = false; + + //利用反射设置DataGridView的双缓冲 + Type dgvType = this.dgvDataShow_A.GetType(); + PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", + BindingFlags.Instance | BindingFlags.NonPublic); + pi.SetValue(this.dgvDataShow_A, true, null); + + this.dgvDataShow_A.AutoGenerateColumns = false; + dgvDataShow_A.DataSource = listTA; + this.dgvDataShow_A.DataError += delegate (object sender, DataGridViewDataErrorEventArgs e) { }; + + //利用反射设置DataGridView的双缓冲 + Type dgvType1 = this.dgvDataShow_B.GetType(); + PropertyInfo pi1 = dgvType1.GetProperty("DoubleBuffered", + BindingFlags.Instance | BindingFlags.NonPublic); + pi1.SetValue(this.dgvDataShow_B, true, null); + + this.dgvDataShow_B.AutoGenerateColumns = false; + dgvDataShow_B.DataSource = listTB; + this.dgvDataShow_B.DataError += delegate (object sender, DataGridViewDataErrorEventArgs e) { }; + + helper.CheckSupperUser("user.pt", ListUser); + syscContext = SynchronizationContext.Current; + //panel2.Location = new Point(2100, 8);//重新设定标签的位置,这个位置时相对于父控件的右上角 + panel2.Location = new Point(this.Width - 450, 8);//重新设定标签的位置,这个位置时相对于父控件的右上角 + + // 尝试启用控制按钮(最大化/最小化/关闭) + this.ControlBox = true; + // 或设置窗口可调整大小 + this.Resizable = true; + } + + + /// + /// 单例 + /// + private static HomeForm _instance; + internal static HomeForm Instance + { + get + { + if (_instance == null) + _instance = new HomeForm(); + return _instance; + } + } + + #region 柱状图显示屏蔽 + //private void chart() + //{ + // chartNgShow.Series.Clear(); + // chartNgShow.Titles.Clear(); + // chartNgShow.ChartAreas[0].AxisY.Minimum = 0; + // chartNgShow.ChartAreas[0].AxisY.Maximum = 20000; + // foreach (var item in NGList) + // { + // ChartHelper.AddSeries(chartNgShow, item.DataType, SeriesChartType.Column, Color.Red, Color.Red, true); + // } + // ChartHelper.SetTitle(chartNgShow, "各不良项", new Font("微软雅黑", 22), Docking.Top, Color.Black); + // ChartHelper.SetStyle(chartNgShow, Color.White, Color.Black); + // ChartHelper.SetLegend(chartNgShow, Docking.Top, StringAlignment.Center, Color.White, Color.Black); + // ChartHelper.SetXY(chartNgShow, "不良项", "数值", StringAlignment.Far, Color.Black, Color.Black, AxisArrowStyle.None, 1, 2); + // ChartHelper.SetMajorGrid(chartNgShow, Color.White, 20, 2); + //} + + + /// + /// 表格统计目录 + /// + //internal void SetProductionList() + //{ + // //不良统计项目 + // NGList.Add(new ChartDataType() { DataType = "蓝膜气泡不良" }); + // NGList.Add(new ChartDataType() { DataType = "蓝膜凹凸点" }); + // NGList.Add(new ChartDataType() { DataType = "蓝膜褶皱不良" }); + // NGList.Add(new ChartDataType() { DataType = "蓝膜破损不良" }); + // NGList.Add(new ChartDataType() { DataType = "蓝膜划痕不良" }); + // NGList.Add(new ChartDataType() { DataType = "蓝膜重合宽度不良" }); + // NGList.Add(new ChartDataType() { DataType = "蓝膜高度不良" }); + // NGList.Add(new ChartDataType() { DataType = "包膜表面异物不良" }); + // NGList.Add(new ChartDataType() { DataType = "包膜翘起不良" }); + // NGList.Add(new ChartDataType() { DataType = "U型折耳不良" }); + // NGList.Add(new ChartDataType() { DataType = "蓝膜手印不良" }); + // NGList.Add(new ChartDataType() { DataType = "极柱划痕不良" }); + // NGList.Add(new ChartDataType() { DataType = "极柱凹点不良" }); + // NGList.Add(new ChartDataType() { DataType = "极柱焊渣不良" }); + // NGList.Add(new ChartDataType() { DataType = "极柱污染不良" }); + // NGList.Add(new ChartDataType() { DataType = "极柱残缺不良" }); + // NGList.Add(new ChartDataType() { DataType = "极柱胶圈残缺不良" }); + // NGList.Add(new ChartDataType() { DataType = "极柱倾斜不良" }); + // NGList.Add(new ChartDataType() { DataType = "防爆阀不良" }); + // NGList.Add(new ChartDataType() { DataType = "防爆阀PET膜不良" }); + // NGList.Add(new ChartDataType() { DataType = "二维码不良" }); + // NGList.Add(new ChartDataType() { DataType = "绝缘片翘起不良" }); + // NGList.Add(new ChartDataType() { DataType = "绝缘片破损不良" }); + // NGList.Add(new ChartDataType() { DataType = "绝缘片污染不良" }); + //} + + /// + /// 获取图表数据 + /// + /// + /// + /// + //public void GetValue() + //{ + // if (isEnabled) + // { + //Random r = new Random(); + //a1 = r.Next(100, 1200); a2 = r.Next(100, 1300); a3 = r.Next(100, 1050); a4 = r.Next(100, 1090); a5 = r.Next(100, 2000); a6 = r.Next(100, 1000); a7 = r.Next(100, 1000); a8 = r.Next(100, 1000); a9 = r.Next(100, 1000); a10 = r.Next(100, 1000); + //a11 = r.Next(100, 10200); a12 = r.Next(500, 1000); a13 = r.Next(100, 5000); a14 = r.Next(100, 1000); a15 = r.Next(100, 1000); a16 = r.Next(100, 1000); a17 = r.Next(100, 1000); a18 = r.Next(100, 1000); a19 = r.Next(100, 1000); + //a20 = r.Next(100, 8000); a21 = r.Next(100, 7000); a22 = r.Next(100, 4000); a23 = r.Next(100, 10400); a24 = r.Next(100, 10050); + //NGList.Where(p => p.DataType == "蓝膜气泡不良").FirstOrDefault().DataCount = a1; + //NGList.Where(p => p.DataType == "蓝膜凹凸点").FirstOrDefault().DataCount = a2; + //NGList.Where(p => p.DataType == "蓝膜褶皱不良").FirstOrDefault().DataCount = a3; + //NGList.Where(p => p.DataType == "蓝膜破损不良").FirstOrDefault().DataCount = a4; + //NGList.Where(p => p.DataType == "蓝膜划痕不良").FirstOrDefault().DataCount = a5; + //NGList.Where(p => p.DataType == "蓝膜重合宽度不良").FirstOrDefault().DataCount = a6; + //NGList.Where(p => p.DataType == "蓝膜高度不良").FirstOrDefault().DataCount = a7; + //NGList.Where(p => p.DataType == "包膜表面异物不良").FirstOrDefault().DataCount = a8; + //NGList.Where(p => p.DataType == "包膜翘起不良").FirstOrDefault().DataCount = a9; + //NGList.Where(p => p.DataType == "U型折耳不良").FirstOrDefault().DataCount = a10; + //NGList.Where(p => p.DataType == "蓝膜手印不良").FirstOrDefault().DataCount = a11; + //NGList.Where(p => p.DataType == "极柱划痕不良").FirstOrDefault().DataCount = a12; + //NGList.Where(p => p.DataType == "极柱凹点不良").FirstOrDefault().DataCount = a13; + //NGList.Where(p => p.DataType == "极柱焊渣不良").FirstOrDefault().DataCount = a14; + //NGList.Where(p => p.DataType == "极柱污染不良").FirstOrDefault().DataCount = a15; + //NGList.Where(p => p.DataType == "极柱残缺不良").FirstOrDefault().DataCount = a16; + //NGList.Where(p => p.DataType == "极柱胶圈残缺不良").FirstOrDefault().DataCount = a17; + //NGList.Where(p => p.DataType == "极柱倾斜不良").FirstOrDefault().DataCount = a18; + //NGList.Where(p => p.DataType == "防爆阀不良").FirstOrDefault().DataCount = a19; + //NGList.Where(p => p.DataType == "防爆阀PET膜不良").FirstOrDefault().DataCount = a20; + //NGList.Where(p => p.DataType == "二维码不良").FirstOrDefault().DataCount = a21; + //NGList.Where(p => p.DataType == "绝缘片翘起不良").FirstOrDefault().DataCount = a22; + //NGList.Where(p => p.DataType == "绝缘片破损不良").FirstOrDefault().DataCount = a23; + //NGList.Where(p => p.DataType == "绝缘片污染不良").FirstOrDefault().DataCount = a24; + // ShowChartData(); + // } + //} + + //public void ShowChartData() + //{ + // try + // { + // //不良类型统计 + // List xData = NGList.Select(c => c.DataType).ToList(); + // List yData = NGList.Select(c => c.DataCount).ToList(); + // ShowNGChart(xData, yData); ; + // } + // catch (Exception ex) + // { + // MessageBox.Show(ex.Message, "系统异常", MessageBoxButtons.OK, MessageBoxIcon.Hand); + // } + + //} + //private void ShowNGChart(List xData, List yData) + //{ + // if (chartNgShow.InvokeRequired) + // { + // UpdateDataChart3 c = new UpdateDataChart3(ShowNGChart); + // this.Invoke(c, new object[] { xData, yData }); + // } + // else + // { + // chartNgShow.Series[0].Points.DataBindXY(xData, yData); + // } + //} + + #endregion + + + #region 页面事件 + private void HomeForm_Load(object sender, EventArgs e) + { + + txtlog.Controls.Add(LogManagerControl.Manager);//添加自定义日志控件 + LogManagerControl.Manager.Dock = System.Windows.Forms.DockStyle.Fill; + timer_Clock.Enabled = true; + + //SetProductionList(); + //chart(); + ReadIni(); + CheckClassShift(); + InitOmronCom(); + + + CancellationToken token1 = mctsA1.Token; + CancellationToken token2 = mctsA2.Token; + CancellationToken token3 = mctsA3.Token; + CancellationToken token4 = mctsA4.Token; + + //CancellationToken token11 = mCTState.Token; + CancellationToken token15 = mCOMState.Token; + CancellationToken token12 = mctsC1.Token; + //CancellationToken token13 = mctsC2.Token; + //CancellationToken token14 = mctsC3.Token; + CancellationToken tokenCOM = mCOMState.Token; + CancellationToken token7 = Amcts7.Token; + + //mTaskC[0] = Task.Factory.StartNew(delegate + //{ + // processModeStatus(); + //}, mctsC1.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default); + + Task sd = Task.Factory.StartNew(delegate + { + processModeStatus(Amcts7); + }, Amcts7.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default); + + InitialAndConnect(); + IsNoOrg = true; + + //删除日志 + serviceLog.Start(); + + _speech = new SpeechSynthesizer(); + _speech.Volume = 100; //音量 + CultureInfo keyboardCulture = InputLanguage.CurrentInputLanguage.Culture; + InstalledVoice neededVoice = _speech.GetInstalledVoices(keyboardCulture).FirstOrDefault(); + if (neededVoice != null) + { + _speech.SelectVoice(neededVoice.VoiceInfo.Name); + } + + IocConfig.Initialize(); + + LogManagerControl.AddLog("程序已启动", LogAddtype.local); + } + + + public void InitialAndConnect() + { + Task RecvTask = Task.Factory.StartNew(delegate { UpdateDianBiaoByModbus(); }, mCOMState.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default); + if (!isEnabled) + { + resetEventRecv.Reset(); + } + } + /// + /// 读取INI配置文件 + /// + public void ReadIni() + { + authorization = IniFileHelper.ReadIniData("MES配置", "authorization"); + BarCodeOutUrl = IniFileHelper.ReadIniData("MES配置", "BarCodeOutUrl"); + UpAlarmUrl = IniFileHelper.ReadIniData("MES配置", "UpAlarmUrl"); + UpStatuesUrl = IniFileHelper.ReadIniData("MES配置", "UpStatuesUrl"); + + //MES信息 + Global.systemConfig.siteCode = IniFileHelper.ReadIniData("MES配置", "siteCode"); + Global.systemConfig.lineCode = IniFileHelper.ReadIniData("MES配置", "lineCode"); + Global.systemConfig.equipCode = IniFileHelper.ReadIniData("MES配置", "equipCode"); + Global.systemConfig.materialCode = IniFileHelper.ReadIniData("MES配置", "materialCode"); + Global.systemConfig.productType = IniFileHelper.ReadIniData("MES配置", "productType"); + + Global.systemConfig.GradingMesUrl = IniFileHelper.ReadIniData("MES配置", "GradingMesUrl"); + Global.systemConfig.ResultProcessMesUrl = IniFileHelper.ReadIniData("MES配置", "ResultProcessMesUrl"); + Global.systemConfig.StationArrivalUrl = IniFileHelper.ReadIniData("MES配置", "StationArrivalUrl"); + Global.systemConfig.StationExitUrl = IniFileHelper.ReadIniData("MES配置", "StationExitUrl"); + + try + { + Global.systemConfig.CollectItemCfgList = ExcelImporter.Import(Global.CollectItemCfgPath); + } + catch (Exception) + { + LogManagerControl.AddLog("读取采集参照表", LogAddtype.local); + } + + Global.systemConfig.LoginTime = Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "LoginTime")); + Global.systemConfig.MesRequestTime = Convert.ToDouble(IniFileHelper.ReadIniData("MES配置", "MesRequestTime")); + + txtsiteCode.Text = Global.systemConfig.siteCode; + txtlineCode.Text = Global.systemConfig.lineCode; + txtequipCode.Text = Global.systemConfig.equipCode; + txtmaterialCode.Text = Global.systemConfig.materialCode; + + //分档ok档 ccd结果 + string[] boundCCD = IniFileHelper.ReadIniData("MES配置", "CCDResultMessage").Split(','); + txtTensionStrapCCD1.Text = boundCCD[Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrapCCDReslut1"))]; + txtTensionStrapCCD2.Text = boundCCD[Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrapCCDReslut2"))]; + txtTensionStrapCCD3.Text = boundCCD[Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrapCCDReslut3"))]; + txtTensionStrapCCD4.Text = boundCCD[Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrapCCDReslut4"))]; + //分档配置信息 + string[] bound = IniFileHelper.ReadIniData("MES配置", "NGMessage").Split(','); + txtgrading1.Text = IniFileHelper.ReadIniData("MES配置", "Grading1"); + txtgrading2.Text = IniFileHelper.ReadIniData("MES配置", "Grading2"); + txtgrading3.Text = IniFileHelper.ReadIniData("MES配置", "Grading3"); + txtgrading4.Text = IniFileHelper.ReadIniData("MES配置", "Grading4"); + Global.systemConfig.Grading1 = txtgrading1.Text + txtTensionStrapCCD1.Text; + Global.systemConfig.Grading2 = txtgrading2.Text + txtTensionStrapCCD2.Text; + Global.systemConfig.Grading3 = txtgrading3.Text + txtTensionStrapCCD3.Text; + Global.systemConfig.Grading4 = txtgrading4.Text + txtTensionStrapCCD4.Text; + + + MESGradingSet[0] = (short)1; + if (Global.systemConfig.Grading2.Equals(Global.systemConfig.Grading1)) + MESGradingSet[1] = MESGradingSet[0]; + else + MESGradingSet[1] = (short)(MESGradingSet[0] + 1); + + if (Global.systemConfig.Grading3.Equals(Global.systemConfig.Grading1)) + MESGradingSet[2] = MESGradingSet[0]; + else + { + if (Global.systemConfig.Grading3.Equals(Global.systemConfig.Grading2)) + MESGradingSet[2] = MESGradingSet[1]; + else + MESGradingSet[2] = (short)(MESGradingSet[1] + 1); + } + + if (Global.systemConfig.Grading4.Equals(Global.systemConfig.Grading1)) + MESGradingSet[3] = MESGradingSet[0]; + else + { + if (Global.systemConfig.Grading4.Equals(Global.systemConfig.Grading2)) + MESGradingSet[3] = MESGradingSet[1]; + else + { + if (Global.systemConfig.Grading4.Equals(Global.systemConfig.Grading3)) + MESGradingSet[3] = MESGradingSet[2]; + else + MESGradingSet[3] = (short)(MESGradingSet[2] + 1); + } + } + + if (txtTensionStrapCCD1.Text.ToUpper() == "NG") + { + MESGradingSet[0] = (short)(30 + MESGradingSet[0]); + } + if (txtTensionStrapCCD2.Text.ToUpper() == "NG") + { + MESGradingSet[1] = (short)(30 + MESGradingSet[1]); + } + if (txtTensionStrapCCD3.Text.ToUpper() == "NG") + { + MESGradingSet[2] = (short)(30 + MESGradingSet[2]); + } + if (txtTensionStrapCCD4.Text.ToUpper() == "NG") + { + MESGradingSet[3] = (short)(30 + MESGradingSet[3]); + } + + txtTensionStrap1.Text = bound[Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrap1"))]; + txtTensionStrap2.Text = bound[Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrap2"))]; + txtTensionStrap3.Text = bound[Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrap3"))]; + NgGradingSet[0] = (short)(Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrap1")) +10); + NgGradingSet[1] = (short)(Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrap2"))+10); + NgGradingSet[2] = (short)(Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrap3"))+10); + strNgBound = IniFileHelper.ReadIniData("MES配置", "NGMessage").Split(','); + //出站计数 + No = Convert.ToInt32(IniFileHelper.ReadIniData("SYSTEM_CONFIGURE", "No")); + ClassShift = Convert.ToInt32(IniFileHelper.ReadIniData("SYSTEM_CONFIGURE", "ClassShift")); + //是否启用分档 + chkCkGrading = IniFileHelper.ReadIniData("MES配置", "Grading") == "1" ? true : false; + chkIsGarding.Checked = chkCkGrading; + //不分类排除 + IsStartNGFL = IniFileHelper.ReadIniData("MES配置", "StartNGFL") == "1" ? true : false; + chkStartNGFL.Checked = IsStartNGFL; + + listAlamByte = GetListByte(200); + + + Global.systemConfig.isUpMes = IniFileHelper.ReadIniData("SYSTEM_CONFIGURE", "IsMesUP") == "1" ? true : false; + txtTcpClicet.Text = Global.systemConfig.isUpMes ? "MES在线" : "MES离线"; + if (Global.systemConfig.isUpMes) + { + chkIsGarding.Visible = true; + } + else + { + chkIsGarding.Visible = false; + } + //电表 + portName = IniFileHelper.ReadIniData("SYSTEM_CONFIGURE", "portName"); + baudRate = int.Parse(IniFileHelper.ReadIniData("SYSTEM_CONFIGURE", "baudRate")); + IsStartZNDB = IniFileHelper.ReadIniData("MES配置", "StartZNDB") == "1" ? true : false; + modbusTcp = IniFileHelper.ReadIniData("SYSTEM_CONFIGURE", "TCP_IP"); + modbusTcpPort = IniFileHelper.ReadIniData("SYSTEM_CONFIGURE", "TCP_Port"); + ckStartZNDB.Checked = IsStartZNDB; + + + Global.Instructions.Clear(); + Global.Instructions.Add("0x25");//相电压UA + Global.Instructions.Add("0x26");//相电压UB + Global.Instructions.Add("0x27");//相电压UC + Global.Instructions.Add("0x28");//线电压UAB + Global.Instructions.Add("0x29");//线电压UBC + Global.Instructions.Add("0x2A");//线电压UAC + Global.Instructions.Add("0x2B");//电流IA + Global.Instructions.Add("0x2C");//电流IB + Global.Instructions.Add("0x2D");//电流IC + Global.Instructions.Add("0x31");//A相有功功率 + Global.Instructions.Add("0x35");//B相有功功率 + Global.Instructions.Add("0x39");//C相有功功率 + Global.Instructions.Add("0x05");//总有功功率 + + } + + #region 串口初始化 + private SerialPort InitSerialPortParameter() + { + return port; + } + + public bool InitSerialPort(ref string strErr) + { + //return InitSerialPort_TCP( ref strErr); + + try + { + if (port == null) + { + if (!string.IsNullOrEmpty(portName)) + { + port = new SerialPort(portName, baudRate, Parity.None, 8, StopBits.One); + port.ReadTimeout = 500; + port.Open(); + if (port.IsOpen) + { + master = ModbusSerialMaster.CreateRtu(port); + registerBuffer = master.ReadHoldingRegisters((byte)1, (ushort)0, (ushort)2); + if (registerBuffer == null) + { + strErr = "与智能电表通讯异常,请检查串口线路!!!"; + return false; + } + strErr = $"[{registerBuffer[0]}],与智能电表通讯正常!!"; + COMStart(true); + isEnabled = true; + return true; + } + } + } + else + { + COMStart(true); + isEnabled = true; + return true; + } + + } + catch (Exception ex) + { + port.Close(); + port.Dispose(); + port = null; + COMStart(false); + isEnabled = false; + CleardbData(); + strErr = $"初始化串口异常!原因:{ex.Message}\r\n 请检查串口线路!!!"; + } + return false; + } + public bool InitSerialPort_TCP(ref string strErr) + { + try + { + modbus = new ModbusTcpNet(); + modbus.Station = 1; + modbus.IsStringReverse = false; + modbus.DataFormat = DataFormat.CDAB; + modbus.IpAddress = modbusTcp; + modbus.Port = Convert.ToInt32(modbusTcpPort); + modbus.ConnectTimeOut = 5000; + modbus.ReceiveTimeOut = 10000; + modbus.ConnectServer(); + + OperateResult result = new OperateResult(); + var task = Task.Run(async () => { result = await modbus.ReadUInt16Async("0", 68); }); + task.Wait(); + if (result.IsSuccess) + { + COMStart(true); + isEnabled = true; + return true; + } + + } + catch (Exception ex) + { + modbus.ConnectClose(); + COMStart(false); + isEnabled = false; + CleardbData(); + strErr = $"初始化ModbusTCP异常!原因:{ex.Message}\r\n 请检查串口线路!!!"; + } + return false; + } + + /// + /// 链接串口状态 + /// + /// + public void COMStart(bool status) + { + if (status) + { + resetEventRecv.Set(); + } + else + { + resetEventRecv.Reset(); + } + } + + + private void UpdateDianBiao() + { + while (true) + { + + if (mCOMState.Token.IsCancellationRequested) + { + return; + } + resetEventRecv.WaitOne(); + if (isEnabled) + { + if (modbus != null && !string.IsNullOrEmpty(modbus.ConnectionId)) + { + try + { + List resylt = GetListInt(17); + //for (int i = 0; i < Global.Instructions.Count; i++) + //{ + // ushort startAddress = (ushort)System.Convert.ToInt32(Global.Instructions[i], 16); + // registerBuffer = master.ReadHoldingRegisters((byte)1, startAddress, (ushort)1); + // resylt[i] = registerBuffer[0]; + //} + + OperateResult result = new OperateResult(); + while (!result.IsSuccess) + { + var task = Task.Run(async () => { result = await modbus.ReadUInt16Async("0", 68); }); + task.Wait(); + if (result.IsSuccess) + { + for (int i = 0; i < 17; i++) + { + resylt[i] = result.Content[i]; + } + } + } + if (resylt != null) + { + if (startup) + { + for (int i = 0; i < resylt.Count; i++) + { + omronPLCCom.lstMcUI[0].WriteDReg($"W4000[{i.ToString()}]", resylt[i]); + } + } + + + this.Invoke(new Action(() => + { + var index = 0; + //相电压UA + txtPhaseVolUA.Text = (Convert.ToDouble(resylt[index++]) / 10).ToString("F1"); + //相电压UB + txtPhaseVolUB.Text = (Convert.ToDouble(resylt[index++]) / 10).ToString("F1"); + //相电压UC + txtPhaseVolUC.Text = (Convert.ToDouble(resylt[index++]) / 10).ToString("F1"); + + //线电压UAB + txtLineVolUAB.Text = (Convert.ToDouble(resylt[index++]) / 10).ToString("F1"); + //线电压UBC + txtLineVolUBC.Text = (Convert.ToDouble(resylt[index++]) / 10).ToString("F1"); + //线电压UAC + txtLineVolUAC.Text = (Convert.ToDouble(resylt[index++]) / 10).ToString("F1"); + + //电流IA + txtIA.Text = (Convert.ToDouble(resylt[index++]) / 1000).ToString("F3"); + //电流IB + txtIB.Text = (Convert.ToDouble(resylt[index++]) / 1000).ToString("F3"); + //电流IC + txtIC.Text = (Convert.ToDouble(resylt[index++]) / 1000).ToString("F3"); + + //A相有功功率 + index++; + txtPowerA.Text = (Convert.ToDouble(resylt[index++]) / 1000).ToString("F3"); + //B相有功功率 + index++; + txtPowerB.Text = (Convert.ToDouble(resylt[index++]) / 1000).ToString("F3"); + //C相有功功率 + index++; + txtPowerC.Text = (Convert.ToDouble(resylt[index++]) / 1000).ToString("F3"); + + //总有功功率 + index++; + txtTotalPower.Text = (Convert.ToDouble(resylt[index++]) / 1000).ToString("F3"); + + })); + } + } + catch (Exception ex) + { + CleardbData(); + LogManagerControl.AddLog("智能电表通讯异常,请检查串口线路\r\n " + ex.Message, LogAddtype.local, Logtype.Error); + } + } + else + { + // port.Close(); + // port.Dispose(); + modbus.ConnectClose(); + Thread.Sleep(3000); + string strErr = ""; + InitSerialPort(ref strErr); + } + } + Thread.Sleep(1000); + + } + } + + private void UpdateDianBiaoByModbus() + { + while (true) + { + + if (mCOMState.Token.IsCancellationRequested) + { + return; + } + resetEventRecv.WaitOne(); + if (isEnabled) + { + + + if (master !=null) + { + try + { + List resylt = GetListInt(13); + List resylt_float = new List(); + OperateResult result = new OperateResult(); + + + for (int i = 0; i < Global.Instructions.Count; i++) + { + ushort startAddress = (ushort)System.Convert.ToInt32(Global.Instructions[i], 16); + + registerBuffer = master.ReadHoldingRegisters((byte)1, startAddress, (ushort)1); + //var registerBuffer2 = master.ReadHoldingRegisters((byte)1, 0, (ushort)100); + resylt[i] = registerBuffer[0]; + } + if (resylt != null) + { + // toFloat + { + var index = 0; + //相电压UA + resylt_float.Add((Convert.ToDouble(resylt[index++]) / 10)); + //相电压UB + resylt_float.Add((Convert.ToDouble(resylt[index++]) / 10)); + //相电压UC + resylt_float.Add((Convert.ToDouble(resylt[index++]) / 10)); + + //线电压UAB + resylt_float.Add((Convert.ToDouble(resylt[index++]) / 10)); + //线电压UBC + resylt_float.Add((Convert.ToDouble(resylt[index++]) / 10)); + //线电压UAC + resylt_float.Add((Convert.ToDouble(resylt[index++]) / 10)); + ; + //电流IA + resylt_float.Add((Convert.ToDouble(resylt[index++]) / 1000)); + //电流IB + resylt_float.Add((Convert.ToDouble(resylt[index++]) / 1000)); + //电流IC + resylt_float.Add((Convert.ToDouble(resylt[index++]) / 1000)); + + //A相有功功率 + //index++; + resylt_float.Add((Convert.ToDouble(resylt[index++]) / 1000)); + //B相有功功率 + // index++; + resylt_float.Add((Convert.ToDouble(resylt[index++]) / 1000)); + //C相有功功率 + // index++; + resylt_float.Add((Convert.ToDouble(resylt[index++]) / 1000)); + + //总有功功率 + // index++; + resylt_float.Add((Convert.ToDouble(resylt[index++]) / 1000)); + } + // + if (startup) + { + for (int i = 0; i < resylt.Count; i++) + { + omronPLCCom.lstMcUI[0].WriteDReg($"W380[{i.ToString()}]", (float)resylt_float[i]); + + } + } + this.Invoke(new Action(() => + { + var index =0; + //相电压UA + txtPhaseVolUA.Text = resylt_float[index++].ToString("F1"); + //相电压UB + txtPhaseVolUB.Text = resylt_float[index++].ToString("F1"); + //相电压UC + txtPhaseVolUC.Text = resylt_float[index++].ToString("F1"); + + //线电压UAB + txtLineVolUAB.Text = resylt_float[index++].ToString("F1"); + //线电压UBC + txtLineVolUBC.Text = resylt_float[index++].ToString("F1"); + //线电压UAC + txtLineVolUAC.Text = resylt_float[index++].ToString("F1"); + + //电流IA + txtIA.Text = resylt_float[index++].ToString("F3"); + //电流IB + txtIB.Text = resylt_float[index++].ToString("F3"); + //电流IC + txtIC.Text = resylt_float[index++].ToString("F3"); + + //A相有功功率 + //index++; + txtPowerA.Text = resylt_float[index++].ToString("F3"); + //B相有功功率 + // index++; + txtPowerB.Text = resylt_float[index++].ToString("F3"); + //C相有功功率 + // index++; + txtPowerC.Text = resylt_float[index++].ToString("F3"); + + //总有功功率 + // index++; + txtTotalPower.Text = resylt_float[index++].ToString("F3"); + + })); + } + } + catch (Exception ex) + { + CleardbData(); + LogManagerControl.AddLog("智能电表通讯异常,请检查串口线路\r\n " + ex.Message, LogAddtype.local, Logtype.Error); + } + } + else + { + // port.Close(); + // port.Dispose(); + modbus.ConnectClose(); + Thread.Sleep(3000); + string strErr = ""; + InitSerialPort(ref strErr); + } + } + Thread.Sleep(1000); + + } + } + + /// + /// 清除智能电表显示数据 + /// + public void CleardbData() + { + this.Invoke(new Action(() => + { + //相电压UA + txtPhaseVolUA.Text = "0"; + //相电压UB + txtPhaseVolUB.Text = "0"; + //相电压UC + txtPhaseVolUC.Text = "0"; + + //线电压UAB + txtLineVolUAB.Text = "0"; + //线电压UBC + txtLineVolUBC.Text = "0"; + //线电压UAC + txtLineVolUAC.Text = "0"; + + //电流IA + txtIA.Text = "0"; + //电流IB + txtIB.Text = "0"; + //电流IC + txtIC.Text = "0"; + + //A相有功功率 + txtPowerA.Text = "0"; + //B相有功功率 + txtPowerB.Text = "0"; + //C相有功功率 + txtPowerC.Text = "0"; + //总有功功率 + txtTotalPower.Text = "0"; + + })); + } + + + + #endregion + + /// + /// 登录窗口 + /// + /// + /// + private void tsmiLogin_Click(object sender, EventArgs e) + { + if (CurrentInfo.autuority == Autuority.Empty) + { + LoginForm frm = new LoginForm(); + frm.sendLogin += Login; + frm.ShowDialog(); + txtTcpClicet.Text = Global.systemConfig.isUpMes ? "MES在线" : "MES离线"; + } + else + { + LoginOut(); + } + } + + /// + /// 历史数据查询 + /// + /// + /// + private void tsmiHistory_Click(object sender, EventArgs e) + { + if (CurrentInfo.autuority == Autuority.Empty) + { + MessageBox.Show("请先登录!", "系统提示"); + return; + } + FrmHistoricalDataQuery frm = new FrmHistoricalDataQuery(); + frm.ShowDialog(); + } + + /// + /// 报警信息查询 + /// + /// + /// + private void tsmiAlarmSearch_Click(object sender, EventArgs e) + { + if (CurrentInfo.autuority == Autuority.Empty) + { + MessageBox.Show("请先登录!", "系统提示"); + return; + } + FrmAlamQuery frm = new FrmAlamQuery(); + frm.ShowDialog(); + } + + /// + /// 打开统计页面 + /// + /// + /// + private void tsmiChart_Click(object sender, EventArgs e) + { + if (CurrentInfo.autuority == Autuority.Empty) + { + MessageBox.Show("请先登录!", "系统提示"); + return; + } + + FrmStatistics.Instance.ShowDialog(); + } + + /// + /// 打开换形页面 + /// + /// + /// + private void tsmiChangeModel_Click(object sender, EventArgs e) + { + if (!CheckAdminOrEng()) + { + MessageBox.Show("权限不足", "系统提示"); + return; + } + if (!startup) + { + MessageBox.Show("请在联机状态下操作换型", "系统提示"); + return; + } + //FrmChangeModel frm = new FrmChangeModel(omronPLCCom, cmbProductModel.Text.Trim()); + FrmChangeModel frm = new FrmChangeModel(omronPLCCom, ""); + frm.ShowDialog(); + } + + /// + /// 打开系统信息页面 + /// + /// + /// + private void tsmiAbout_Click(object sender, EventArgs e) + { + FrmHelper frm = new FrmHelper(); + frm.ShowDialog(); + } + + /// + /// 打开PLC配置页面 + /// + /// + /// + private void tsmiPLCConfig_Click(object sender, EventArgs e) + { + if (!CheckAdminOrEng()) + { + MessageBox.Show("权限不足", "系统提示"); + return; + } + //FrmPwd frm = new FrmPwd(); + //if (frm.ShowDialog() == DialogResult.Cancel) + //{ + // return; + //} + if (omronPLCCom != null) + { + omronPLCCom.Show(); + return; + } + omronPLCCom = new FrmOmronPLCCom(MelsecConfigPath); + omronPLCCom.Show(); + } + /// + /// 打开数据库配置页面 + /// + /// + /// + private void tsmiDBConfig_Click(object sender, EventArgs e) + { + if (!CheckAdminOrEng()) + { + MessageBox.Show("权限不足", "系统提示"); + return; + } + FrmDBbaseSet frm = new FrmDBbaseSet(); + frm.ShowDialog(); + } + /// + /// 打开MES参数配置页面 + /// + /// + /// + private void tsmiMESConfig_Click(object sender, EventArgs e) + { + if (!CheckAdminOrEng()) + { + MessageBox.Show("权限不足", "系统提示"); + return; + } + FormMesDataSet frm = new FormMesDataSet(); + if (frm.ShowDialog() == DialogResult.OK) + { + ReadIni(); + + } + } + /// + /// 打开参数编辑页面 + /// + /// + /// + private void tsmiParaConfig_Click(object sender, EventArgs e) + { + if (!CheckAdminOrEng()) + { + MessageBox.Show("权限不足", "系统提示"); + return; + } + IsNoOrg = false; + //FrmParaConfig frmPara = new FrmParaConfig(); + //frmPara.sendParamIN += SetCombOrg; + //if (frmPara.ShowDialog() == DialogResult.OK) + //{ + // IsNoOrg = true; + //} + } + + /// + /// 打开用户配置页面 + /// + /// + /// + private void tsmiUserConfig_Click(object sender, EventArgs e) + { + if (!CheckAdmin()) + { + MessageBox.Show("权限不足", "系统提示"); + return; + } + SetForm setForm = new SetForm(); + setForm.ShowDialog(); + } + + /// + /// TCP通讯设置 + /// + /// + /// + private void tsmiSerialPortConfig_Click(object sender, EventArgs e) + { + if (!CheckAdmin()) + { + MessageBox.Show("权限不足", "系统提示"); + return; + } + //FrmPwd frm = new FrmPwd(); + //if (frm.ShowDialog() == DialogResult.Cancel) + //{ + // return; + //} + //com.Show(); + } + + + + /// + /// 统计清零 + /// + /// + /// + private void btSave_Click(object sender, EventArgs e) + { + if (CurrentInfo.autuority == Autuority.Empty) + { + MessageBox.Show("请先登录再进行操作!", "错误提示"); + return; + } + IniFileHelper.WriteIniData("统计计数", "ProdAllQty", "0"); + + } + + /// + /// 刷新页面时间 + /// + /// + /// + private void timer_Clock_Tick(object sender, EventArgs e) + { + string time = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"); + ShowButtonHandler handler = ShowButtonEven_Run; + IAsyncResult result = handler.BeginInvoke(time, null, handler); + string timenow = DateTime.Now.ToString("HH:mm:ss"); + CheckClassShift(); + AgeingCheck(); + GetMESinfo(); + } + + /// + /// 判断班次 + /// + public void CheckClassShift() + { + TimeSpan dsp3 = DateTime.Now.TimeOfDay; + if (dsp3 > DateTime.Parse("08:30").TimeOfDay && dsp3 <= DateTime.Parse("20:30").TimeOfDay) + { + if (ClassShift == 1) + No = 0; + ClassShift = 0; + if (this.InvokeRequired) + { + this.BeginInvoke(new MethodInvoker(delegate + { + txtClassShift.Text = "白班"; + })); + } + else + { + txtClassShift.Text = "白班"; + } + } + else + { + if (ClassShift == 0) + No = 0; + ClassShift = 1; + if (this.InvokeRequired) + { + this.BeginInvoke(new MethodInvoker(delegate + { + txtClassShift.Text = "夜班"; + })); + } + else + { + txtClassShift.Text = "夜班"; + } + } + } + + /// + /// 登录时效检查 + /// + public void AgeingCheck() + { + if (CheckAdminOrEng() && (DateTime.Now - dtLogin).TotalMinutes > Global.systemConfig.LoginTime) + { + + CurrentInfo.autuority = Autuority.操作员; + lblAuthority.Text = "操作员"; + if (startup)//plc链接成功 + // omronPLCCom.lstMcUI[0].WriteDReg("W50", (short)1);//提示PLC进入操作员权限 + omronPLCCom.lstMcUI[0].WriteDReg("D21", (short)1);//提示PLC进入操作员权限 + LogManagerControl.AddLog("管理员登录时效过期已自动降级为操作员权限,请重新登录获取管理员权限。", LogAddtype.local, Logtype.Warning); + + } + } + + /// + /// 告诉PLC MES信息 + /// + public void GetMESinfo() + { + if (startup) + { + if (Global.systemConfig.isUpMes) + { + omronPLCCom.lstMcUI[0].WriteDReg("W250", (short)1); + if (chkCkGrading) + { + omronPLCCom.lstMcUI[0].WriteDReg("W248", (short)1); + } + else + { + omronPLCCom.lstMcUI[0].WriteDReg("W248", (short)2); + } + } + else + { + omronPLCCom.lstMcUI[0].WriteDReg("W250", (short)2); + omronPLCCom.lstMcUI[0].WriteDReg("W248", (short)2); + } + } + } + + /// + /// CCD数据统计 + /// + /// + /// + private void tsmiCCDData_Click(object sender, EventArgs e) + { + if (!CheckAdmin()) + { + MessageBox.Show("权限不足", "系统提示"); + return; + } + FrmCCDQuery frm = new FrmCCDQuery(); + frm.ShowDialog(); + } + + + + #endregion + + #region PLC读写 + /// + /// 初始化通讯接口委托事件 + /// + public void InitOmronCom() + { + #region 欧姆龙MC协议网口 + PLCCommunication.IniHelper iniMelse = new PLCCommunication.IniHelper(MelsecConfigPath); + OmronCount = Convert.ToInt16(iniMelse.IniReadValue("SystemConfig", "ComCount")); + omronPLCCom = new FrmOmronPLCCom(MelsecConfigPath); + for (int i = 0; i < OmronCount; i++) + { + switch (i) + { + case 0: + //外观设备心跳消息接受委托事件 + omronPLCCom.lstMcUI[i].UpHeartBeatEvent += TriggerHeartEvent; + //外观设备数据接收委托事件 + omronPLCCom.lstMcUI[i].ReceiveEvent += OmronRegEvent_Job1; + break; + } + } + #endregion + + #region TCPIP协议网口 + //SimpleCommunication.IniHelper iniCom = new SimpleCommunication.IniHelper(ConfigPath); + //TcpCount = Convert.ToInt16(iniCom.IniReadValue("SystemConfig", "ComCount")); + //com = new FrmCommunication(ConfigPath); + //for (int i = 0; i < TcpCount; i++) + //{ + // switch (i) + // { + // case 0: + // //信息接受委托事件 + // com.lstUI[i].TcoComInfoMsgEvent += InfoEvent_Job; + // com.lstUI[i].TCPOpen(); + // //信息接受委托事件 + // com.lstUI[i].TcoComRecvMsgEvent += RegEvent_Job; + // break; + // case 1: + // //信息接受委托事件 + // com.lstUI[i].TcoComInfoMsgEvent += InfoEvent_Job1; + // com.lstUI[i].TCPOpen(); + // //信息接受委托事件 + // com.lstUI[i].TcoComRecvMsgEvent += RegEvent_Job1; + // break; + + // } + //} + #endregion + } + + + /// + /// 消息悬浮提示 + /// + /// + /// + /// + public void ShowMsg(Logstype logType, string str, int time) + { + if (this.InvokeRequired) + { + this.BeginInvoke(new ThreadStart(delegate () + { + switch (logType) + { + case Logstype.Message: + MessageTip.ShowOk($"{str}", decimal.ToInt32(time)); + break; + case Logstype.Warning: + MessageTip.ShowWarning($"{str}", decimal.ToInt32(time)); + break; + case Logstype.Error: + MessageTip.ShowError($"{str}", decimal.ToInt32(time)); + break; + default: + break; + } + })); + } + else + { + switch (logType) + { + case Logstype.Message: + MessageTip.ShowOk($"{str}", decimal.ToInt32(time)); + break; + case Logstype.Warning: + MessageTip.ShowWarning($"{str}", decimal.ToInt32(time)); + break; + case Logstype.Error: + MessageTip.ShowError($"{str}", decimal.ToInt32(time)); + break; + default: + break; + } + } + } + + /// + ///开始 + /// + /// + /// + private void btStart_Click(object sender, EventArgs e) + { + if (CurrentInfo.autuority == Autuority.Empty) + { + MessageBox.Show("请先登录再进行操作!", "错误提示"); + return; + } + ReadIni(); + if (IsStartZNDB) + { + string strErr = ""; + bool b1 = InitSerialPort(ref strErr); + if (!b1) + { + MessageBox.Show(strErr, "错误提示"); + return; + } + } + if (!startup) + { + SystemStart(); + return; + } + startup = false; + Invoke((Action)delegate + { + btnStart.ButtonCenterColorStart = Color.Red; + btnStart.ButtonCenterColorEnd = Color.Salmon; + lblMsg.Text = "启动联机"; + lblLinkPLCState.IsFlash = false; + lblLinkPLCState.LedStatus = false; + + }); + + + + COMStart(false); + isEnabled = false; + CleardbData(); + + for (int i = 0; i < OmronCount; i++) + { + if (omronPLCCom.lstMcUI[i].IsRun) + { + omronPLCCom.lstMcUI[i].ConnectClose(); + omronPLCCom.lstMcUI[i].OmronStart(false); + omronPLCCom.lstMcUI[i].IsRun = false; + omronPLCCom.lstMcUI[i].btnStart.Text = "启动"; + omronPLCCom.lstMcUI[i].HeartBeat = false; + + + + } + } + } + + /// + /// 启动PLC连接 + /// + private void SystemStart() + { + for (int i = 0; i < OmronCount; i++) + { + if (!omronPLCCom.lstMcUI[i].IsRun) + { + bool b = omronPLCCom.lstMcUI[i].Connect(); + if (b) + { + startOmronUp = true; + omronPLCCom.lstMcUI[i].OmronStart(true); + omronPLCCom.lstMcUI[i].IsRun = true; + omronPLCCom.lstMcUI[i].btnStart.Text = "停止"; + omronPLCCom.lstMcUI[i].HeartBeat = true; + } + else + { + startOmronUp = false; + } + } + } + if (startOmronUp) + { + startup = true; + } + if (startup) + { + SendAuthorityToPLC(); + //SetProductModelEnable(false); + btnStart.ButtonCenterColorStart = Color.OliveDrab; + btnStart.ButtonCenterColorEnd = Color.OliveDrab; + lblMsg.Text = "停止联机"; + #region 开机前告诉PLC当前挡位设置 + //开机前告诉PLC当前挡位设置 + MESGradingSet[0] = (short)1; + if ((txtgrading2.Text.Trim()+ txtTensionStrapCCD2.Text).Equals(txtgrading1.Text.Trim() + txtTensionStrapCCD1.Text)) + MESGradingSet[1] = MESGradingSet[0]; + else + MESGradingSet[1] = (short)(MESGradingSet[0] + 1); + + if ((txtgrading3.Text.Trim() + txtTensionStrapCCD3.Text).Equals(txtgrading1.Text.Trim() + txtTensionStrapCCD1.Text)) + MESGradingSet[2] = MESGradingSet[0]; + else + { + if ((txtgrading3.Text.Trim() + txtTensionStrapCCD3.Text).Equals(txtgrading2.Text.Trim()+txtTensionStrapCCD2.Text)) + MESGradingSet[2] = MESGradingSet[1]; + else + MESGradingSet[2] = (short)(MESGradingSet[1] + 1); + } + + if ((txtgrading4.Text.Trim() + txtTensionStrapCCD4.Text).Equals(txtgrading1.Text.Trim() + txtTensionStrapCCD1.Text)) + MESGradingSet[3] = MESGradingSet[0]; + else + { + if ((txtgrading4.Text.Trim() + txtTensionStrapCCD4.Text).Equals(txtgrading2.Text.Trim() + txtTensionStrapCCD2.Text)) + MESGradingSet[3] = MESGradingSet[1]; + else + { + if ((txtgrading4.Text.Trim() + txtTensionStrapCCD4.Text).Equals(txtgrading3.Text.Trim() + txtTensionStrapCCD3.Text)) + MESGradingSet[3] = MESGradingSet[2]; + else + MESGradingSet[3] = (short)(MESGradingSet[2] + 1); + } + } + // + if (txtTensionStrapCCD1.Text.ToUpper() == "NG") + { + MESGradingSet[0] = (short)(30 + MESGradingSet[0]); + } + if (txtTensionStrapCCD2.Text.ToUpper() == "NG") + { + MESGradingSet[1] = (short)(30 + MESGradingSet[1]); + } + if (txtTensionStrapCCD3.Text.ToUpper() == "NG") + { + MESGradingSet[2] = (short)(30 + MESGradingSet[2]); + } + if (txtTensionStrapCCD4.Text.ToUpper() == "NG") + { + MESGradingSet[3] = (short)(30 + MESGradingSet[3]); + } + + int TensionStrap1 = Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrap1")); + int TensionStrap2 = Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrap2")); + int TensionStrap3 = Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrap3")); + int Grading = Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "Grading")); + int IsMesUP = Convert.ToInt32(IniFileHelper.ReadIniData("SYSTEM_CONFIGURE", "IsMesUP")); + + //告诉PLC当前OK与NG拉带设置挡位 + omronPLCCom.lstMcUI[0].WriteDReg("W241", MESGradingSet[0]); + omronPLCCom.lstMcUI[0].WriteDReg("W242", MESGradingSet[1]); + omronPLCCom.lstMcUI[0].WriteDReg("W243", MESGradingSet[2]); + omronPLCCom.lstMcUI[0].WriteDReg("W244", MESGradingSet[3]); + omronPLCCom.lstMcUI[0].WriteDReg("W245", (short)(TensionStrap1==0?99: TensionStrap1 + 10)); + omronPLCCom.lstMcUI[0].WriteDReg("W246", (short)(TensionStrap2==0?99: TensionStrap2 + 10)); + omronPLCCom.lstMcUI[0].WriteDReg("W247", (short)(TensionStrap3==0?99: TensionStrap3 + 10)); + //omronPLCCom.lstMcUI[0].WriteDReg("W245", 5); + //omronPLCCom.lstMcUI[0].WriteDReg("W246", 6); + //omronPLCCom.lstMcUI[0].WriteDReg("W247", 7); + omronPLCCom.lstMcUI[0].WriteDReg("W248", (short)Grading); + omronPLCCom.lstMcUI[0].WriteDReg("W250", (short)IsMesUP); + + LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}]当前一档,W241[值:{MESGradingSet[0]}-档位:{txtgrading1.Text.Trim()}-{txtTensionStrapCCD1.Text}]", LogAddtype.local, Logtype.Message); + LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}]当前二档,W242[值:{MESGradingSet[1]}-档位:{txtgrading2.Text.Trim()}-{txtTensionStrapCCD2.Text}]", LogAddtype.local, Logtype.Message); + LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}]当前三档,W243[值:{MESGradingSet[2]}-档位:{txtgrading3.Text.Trim()}-{txtTensionStrapCCD3.Text}]", LogAddtype.local, Logtype.Message); + LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}]当前四档,W244[值:{MESGradingSet[3]}-档位:{txtgrading4.Text.Trim()}-{txtTensionStrapCCD4.Text}]", LogAddtype.local, Logtype.Message); + + var ng1 = (short)(TensionStrap1 == 0 ? 99 : TensionStrap1 + 10); + var ng2 = (short)(TensionStrap2 == 0 ? 99 : TensionStrap2 + 10); + var ng3 = (short)(TensionStrap3 == 0 ? 99 : TensionStrap3 + 10); + LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}]当前NG拉带1,W245[值:{ng1}-档位:{txtTensionStrap1.Text.Trim()}]", LogAddtype.local, Logtype.Message); + LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}]当前NG拉带2,W246[值:{ng2}-档位:{txtTensionStrap2.Text.Trim()}]", LogAddtype.local, Logtype.Message); + LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}]当前NG拉带3,W247[值:{ng3}-档位:{txtTensionStrap3.Text.Trim()}]", LogAddtype.local, Logtype.Message); + + if ((short)IsMesUP == 1) + { + LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}],当前W250[值:{(short)IsMesUP}-启用MES模式]", LogAddtype.local, Logtype.Message); + + if ((short)Grading == 1) + { + LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}],当前W248[值:{(short)Grading}-启用分档模式]", LogAddtype.local, Logtype.Message); + } + else + { + LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}],当前W248[值:{(short)Grading}-关闭分档模式]", LogAddtype.local, Logtype.Message); + } + } + else + { + LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}],当前W250[值:{(short)IsMesUP}-关闭MES模式]", LogAddtype.local, Logtype.Message); + } + #endregion + } + else + { + COMStart(false); + isEnabled = false; + CleardbData(); + Invoke((Action)delegate + { + lblLinkPLCState.IsFlash = false; + lblLinkPLCState.LedStatus = false; + + }); + startup = false; + btnStart.ButtonCenterColorStart = Color.Red; + btnStart.ButtonCenterColorEnd = Color.Salmon; + lblMsg.Text = "启动联机"; + MessageBox.Show("PLC通讯未连接!", "系统程序运行错误", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification); + } + } + /// + /// 给PLC写入权限 + /// + private void SendAuthorityToPLC() + { + if (lblAuthority.Text == "操作员") + { + omronPLCCom.lstMcUI[0].WriteDReg("D21", (short)1);//提示PLC进入操作员权限 + } + else if (lblAuthority.Text == "工程师") + { + omronPLCCom.lstMcUI[0].WriteDReg("D21", (short)2);//提示PLC进入工程师权限 + } + else + { + omronPLCCom.lstMcUI[0].WriteDReg("D21", (short)3);//提示PLC进入管理员权限 + } + } + /// + /// 计算CheckSum + /// + /// + /// + public static string GetCheckSum(string st) + { + //ASCII字符转10进制byte + string res = ""; + try + { + int result = 0; + byte[] ba = System.Text.ASCIIEncoding.Default.GetBytes(st); + for (int i = 0; i < ba.Length; i++) + { + result += ba[i]; + } + string dfd = result.ToString(); + if (dfd.Length >= 2) + { + res = dfd.Substring(dfd.Length - 2); + } + else + { + res = "0" + dfd; + } + } + catch (Exception) { } + return res; + } + + #endregion + + /// + /// 设备心跳消息委托更新状态 + /// + /// + private void TriggerHeartEvent(bool b) + { + if (!startup) + { + return; + } + if (this.InvokeRequired) + { + if (b) + { + Invoke((Action)delegate + { + lblLinkPLCState.IsFlash = true; + lblLinkPLCState.LedStatus = true; + }); + } + else + { + Invoke((Action)delegate + { + lblLinkPLCState.IsFlash = false; + lblLinkPLCState.LedStatus = false; + }); + } + } + } + + /// + /// 1#通讯块读取PLC信号 + /// + /// + /// + /// + private void OmronRegEvent_Job1(int Index, string msg, OperateResult resByte) + { + if (!startup) + { + return; + } + if (omronPLCCom.lstMcUI[0].IsConnected) + { + switch (Index) + { + case 1: //1#上料 + if (omronPLCCom.lstMcUI[0].lstTrgUI[0].TrgParams.TriggerCmd == msg) + { + omronPLCCom.lstMcUI[0].WriteDReg(omronPLCCom.lstMcUI[0].lstTrgUI[0].TrgParams.TriggerAddr, (short)2); + mTaskA[0] = Task.Factory.StartNew(delegate + { + processA1(mctsA1, resByte); + }); + } + break; + case 2: //2#下料 + if (omronPLCCom.lstMcUI[0].lstTrgUI[1].TrgParams.TriggerCmd == msg) + { + omronPLCCom.lstMcUI[0].WriteDReg(omronPLCCom.lstMcUI[0].lstTrgUI[1].TrgParams.TriggerAddr, (short)2); + mTaskA[1] = Task.Factory.StartNew(delegate + { + processA2(mctsA2, resByte); + }); + } + break; + //case 3://3#报警 + // if (msg == "1" || msg == "2") + // { + // AlamCode = msg; + // omronPLCCom.lstMcUI[0].WriteDReg(omronPLCCom.lstMcUI[0].lstTrgUI[2].TrgParams.TriggerAddr, (short)3); + // mTaskA[2] = Task.Factory.StartNew(delegate + // { + // AlarmProcess(mctsA3, resByte); + // }); + // } + // break; + //case 4: //4#异常播报 + // if (omronPLCCom.lstMcUI[0].lstTrgUI[3].TrgParams.TriggerCmd == msg) + // { + // omronPLCCom.lstMcUI[0].WriteDReg(omronPLCCom.lstMcUI[0].lstTrgUI[3].TrgParams.TriggerAddr, (short)2); + // mTaskA[3] = Task.Factory.StartNew(delegate + // { + // processA3(mctsA4, resByte); + // }); + // } + // break; + } + } + else + { + Invoke((Action)delegate + { + lblLinkPLCState.IsFlash = false; + lblLinkPLCState.LedStatus = false; + }); + } + } + + + #region 上料数据 + /// + /// 1#通道读取异常条码数据 + /// + /// + /// + private void processA1(CancellationTokenSource mt, OperateResult resByte) + { + if (!mt.IsCancellationRequested) + { + if (resByte.IsSuccess && resByte != null) + { + try + { + sw.Restart(); + List list = new List(); + List listBar = StrUtil.GetListString(2, "NG"); + List listResult = CollectionUtil.GetListUShort(2); + //高低位取反 + byte[] bytes = resByte.Content.ByteReverse(); + //前面有\03\00 标识 占2个字节 + int offset = 0; + listBar[0] = TransformBase.TransString(bytes, 0+ offset, 20*2, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();//1# 条码 + listBar[1] = TransformBase.TransString(bytes, 40+ offset, 20*2, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();//2# 条码 + // listBar[2] = TransformBase.TransString(bytes, 80+ offset, 20 * 2, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();//3# 条码 + //新增 左右通道 + var dtGroup = 0; + try + { + dtGroup = omronPLCCom.lstMcUI[0].ReadshortDReg("W2023"); + } + catch (Exception) + { + + dtGroup = 0; + } + + for (int i = 0; i < listBar.Count; i++) + { + FeedingData m = new FeedingData(); + // m.TD = i + 1; + m.TD = i * 2 + dtGroup;// 主道 =1 通道改为 1,3 主道=2 时 通道该为 2,4 + m.BarCode = listBar[i]; + m.TDGroup = dtGroup; + + m.CreateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + if (String.IsNullOrEmpty(m.BarCode) || m.BarCode.Trim() == "ERROR") + { + m.BarCode = "ERROR" + Guid.NewGuid().ToString("N").Substring(0, 8); + m.Result = "NG"; + m.Remark = "扫码不良"; + listResult[i] = 2; + } + else + { + m.Result = "OK"; + m.Remark = "良品"; + + #region 947 MES + if (Global.systemConfig.isUpMes) + { + // TODO 进站数据上传 + ReqArrivalStation req = new ReqArrivalStation() + { + SiteCode = Global.systemConfig.siteCode, + LineCode = Global.systemConfig.lineCode, + EquipNum = Global.systemConfig.equipCode, + MaterialCode = Global.systemConfig.materialCode, + UserName = "Test_HC", + Identification = m.BarCode, + ProductType = Global.systemConfig.productType + }; + + Task.Run(() => { + var resp = new MESDataCombin().PostProductArrivalStationData(req); + if (!resp.Success) + { + string errMsg = $"进站数据上传MES失败, 错误代码: {resp.Code}, 错误消息:{resp.Message}, 报错消息类型: {resp.Category}"; + LogManagerControl.AddLog(errMsg, LogAddtype.MES, Logtype.Error); + } + }); + } + #endregion + } + list.Add(m); + //电芯判断结果返回PLC + omronPLCCom.lstMcUI[0].WriteDReg("W202" + i.ToString(), listResult[i]); + } + //复位PLC信号 + omronPLCCom.lstMcUI[0].ClearReg(omronPLCCom.lstMcUI[0].lstTrgUI[0].TrgParams.TriggerAddr, VarType.Short); + sw.Stop(); + LogManagerControl.AddLog("上料数据处理耗时:" + sw.ElapsedMilliseconds + "ms", LogAddtype.local); + //显示数据库 + Task.Run(() => + { + SaveDataEven1_Run(list); + }); + } + catch (Exception ex) + { + LogManagerControl.AddLog("读取上料数据异常:" + ex.Message, LogAddtype.local, Logtype.Error); + } + } + } + } + + /// + /// 上料电芯数据保存 + /// + /// + private void SaveDataEven1_Run(object obj) + { + if (!startup) + { + return; + } + if (dgvDataShow_A.InvokeRequired) + { + ChangeFunctionHTestA a = new ChangeFunctionHTestA(SaveDataEven1_Run); + this.Invoke(a, new object[] { obj }); + } + else + { + try + { + Repository repository = new Repository(); + var feedingService = new FeedingDataService(repository); + + List list = (List)obj; + if (list != null) + { + foreach (FeedingData m in list) + { + string strRes = ""; + + int addCout = feedingService.AddFeedingData(m); + //var result = dbHelper.AddFeedingData(m, ref strErr);//保存本地数据 + //strRes = strErr == "" ? ",本地存储OK" : ",本地存储NG" + strErr; + strRes = addCout > 0 ? ",本地存储OK" : ",本地存储NG"; + m.Remark += strRes; + // 文件形式保存到本地 + List data = new List(); + data.Add(m); + CSVHelper.WriteCSV("", data, 1); + + if (listTA.Count > 50) + { + listTA.RemoveAt(0); + } + listTA.Add(m); + } + } + if (dgvDataShow_A.Rows.Count > 0) + { + dgvDataShow_A.CurrentCell = dgvDataShow_A.Rows[this.dgvDataShow_A.Rows.Count - 1].Cells[0]; + } + } + catch (Exception ex) + { + LogManagerControl.AddLog("进站条码保存数据失败:" + ex.Message, LogAddtype.local, Logtype.Error); + } + } + } + + #endregion + + #region 下料数据 + /// + /// 下料数据 + /// + /// + /// + private void processA2(CancellationTokenSource mt, OperateResult resByte) + { + + if (!mt.IsCancellationRequested) + { + if (resByte.IsSuccess && resByte != null) + { + try + { + sw.Restart(); + List list = new List(); + List listBarIn = StrUtil.GetListString(2, "NG");//进站条码 + List listBarOut = StrUtil.GetListString(2, "NG");//出站条码 + List> listBarResult = new List>(); //CCD结果 + List listBar1Result = CollectionUtil.GetListUShort(16); + List listBar2Result = CollectionUtil.GetListUShort(16); + List listBar3Result = CollectionUtil.GetListUShort(16); + listBarResult.Add(listBar1Result); + listBarResult.Add(listBar2Result); + listBarResult.Add(listBar3Result); + List listResult = CollectionUtil.GetListUShort(2); + //读取plc地址W260。1 是开启屏蔽。2 是默认不开启。 反馈地址w261。 1 是正常不报警。 2 是报警。 + var isCCDMask = omronPLCCom.lstMcUI[0].ReadshortDReg("W260"); + int id = 0; + + byte[] bytes = resByte.Content.ByteReverse(); + //前面有2个占位标识 04 + int offset = 0; + for (int i = 0; i < 2; i++) + { + listBarOut[i] = TransformBase.TransString(bytes, 0 + offset + (i*40 *2), 20 *2, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();//1# 出站条码 + var lstBarResult = listBarResult[i]; + for (int j = 0; j < 16; j++) + { + + // var okNg = TransformBase.TransString(bytes, 40 + offset + (i * 40*2) + j *2, 1*2, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim(); + int ccdDefault = TransformBase.TransInt16(resByte.Content, 40 + offset + (i * 40 * 2) + j * 2); + // int.TryParse(okNg,out ccdDefault); + lstBarResult[j] = (short)ccdDefault; + // TransformBase.TransInt16(resByte.Content, 20 + offset+(i * 40)+j,1);//1#CCD1结果CCD给0是OK,1是NG + } + listBarIn[i] = TransformBase.TransString(bytes, 140 * 2 + offset + (i * 20*2), 20 * 2, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();// + // listBarIn[i] = listBarOut[i]; + ///1# 进站条码 + } + + Repository repository = new Repository(); + FeedingDataService service = new FeedingDataService(repository); + + for (int i = 0; i < listBarOut.Count; i++) + { + BlankingData m = new BlankingData(); + id = i + 1; + + No = No + 1; + m.TD = No; + m.WorkShift = ClassShift == 0 ? "白班" : "夜班"; + m.ArrivalBarCode = listBarIn[i]; + m.DepartureBarCode = listBarOut[i]; + m.OutTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + + + var listEntity = service.GetFeedingData(m.ArrivalBarCode); + if (listEntity.Count() > 0) + { + m.TDGroup = listEntity.First().TDGroup; + } + var lstBarResult = listBarResult[i]; + #region CCD结果 0 ok ;1 ng + m.CCD1 = lstBarResult[0] == 1 ? "OK" : "NG"; + m.CCD2 = lstBarResult[1] == 1 ? "OK" : "NG"; + m.CCD3 = lstBarResult[2] == 1 ? "OK" : "NG"; + m.CCD4 = lstBarResult[3] == 1 ? "OK" : "NG"; + m.CCD5 = lstBarResult[4] == 1 ? "OK" : "NG"; + m.CCD6 = lstBarResult[5] == 1 ? "OK" : "NG"; + m.CCD7 = lstBarResult[6] == 1 ? "OK" : "NG"; + m.CCD8 = lstBarResult[7] == 1 ? "OK" : "NG"; + m.CCD9 = lstBarResult[8] == 1 ? "OK" : "NG"; + m.CCD10 = lstBarResult[9] == 1 ? "OK" : "NG"; + m.CCD11 = lstBarResult[10] == 1 ? "OK" : "NG"; + m.CCD12 = lstBarResult[11] == 1 ? "OK" : "NG"; + m.CCD13 = lstBarResult[12] == 1 ? "OK" : "NG"; + m.CCD14 = lstBarResult[13] == 1 ? "OK" : "NG"; + m.CCD15 = lstBarResult[14] == 1 ? "OK" : "NG"; + m.CCD16 = lstBarResult[15] == 1 ? "OK" : "NG"; + + var cfgList = Global.systemConfig.CollectItemCfgList + .Where(it => it.IsEnable && it.PLCRelAddress != null) + .OrderBy(it => it.PLCRelAddress).ToList(); + + for (int k = 0; k < cfgList.Count; k++) + { + var item = cfgList[k]; + + int index = (int)item.PLCRelAddress - 1; + + if (index < listBar2Result.Count) + { + var code = listBar2Result[index] == 1 ? "OK" : "NG"; + m.PLCValDic.Add((int)item.PLCRelAddress, code); + } + } + #endregion + string levelresult = null; + string strErr = ""; + //入站条码判断 + if (String.IsNullOrEmpty(m.ArrivalBarCode) || m.ArrivalBarCode.Trim() == "ERROR") + m.ArrivalBarCode = "ERROR" + Guid.NewGuid().ToString("N").Substring(0, 8); + //出站条码判断 + if (String.IsNullOrEmpty(m.DepartureBarCode) || m.DepartureBarCode.Trim() == "ERROR") + m.DepartureBarCode = "ERROR" + Guid.NewGuid().ToString("N").Substring(0, 8); + + var lstError = new List(); + listResult[i] = GetResult(m, ref strErr,ref lstError); + + m.Result = listResult[i] == 1 ? "OK" : "NG"; + m.Remark = strErr; + //扫码不良 进出站扫码不对应 不需要上传MES + var scanCount = lstError.Count(x => x == 2 || x == 3); + var ccdOkNg = "OK"; //ccd总结果 ok ng + if (scanCount > 0) + { + m.Result = "扫码NG"; + } + else + { + //扫码ng 另一分支ccd NG + var ccdNgCount = lstError.Count(x => x > 10); + if(ccdNgCount >0) + { + ccdOkNg = "NG"; + m.Result = "CCD结果NG"; + } + } + + + //OK + //扫码ng的不进行mes分档,CCD NG的也进行mes分档 + var isOkGrading = false; //是否已经完成OK挡位的分档成功 + if (listResult[i] == 1 || ccdOkNg =="NG") + { + if (Global.systemConfig.isUpMes && chkCkGrading) + { + //分档接口 + //21~24 OK挡位 + MesResponse resGrading = ToMesData.GetMesIn(m.DepartureBarCode, m.ArrivalBarCode);//分档查询 + try + { + //listResult[i] = (short)(88);//默认分档NG + //m.Remark = "外观检OK分档NG"; + if (resGrading.success) + { + if (resGrading.rows != null && resGrading.rows.Count > 0 && resGrading.rows[0].rank != null) + { + var rank = resGrading.rows[0].rank; + //不分类 + // 读取plc地址W260。9 是开启屏蔽 使用不分类。1 是默认不开启。 反馈地址w261。 1 是正常不报警。 2 是报警。 + + #region //CCD屏蔽被修改 报警 + var listGradingCCD = new List(); + listGradingCCD.Add(Global.systemConfig.Grading1);//k77_ok + listGradingCCD.Add(Global.systemConfig.Grading2); + listGradingCCD.Add(Global.systemConfig.Grading3); + listGradingCCD.Add(Global.systemConfig.Grading4); + if (isCCDMask == 9) + { + ccdOkNg = "不分类"; + var gradingCCD_NoClassCount = listGradingCCD.Count(x => x.Contains("不分类")); + if (gradingCCD_NoClassCount <= 0) + { + //CCD屏蔽被修改 报警 + omronPLCCom.lstMcUI[0].WriteDReg("W261", (short)2); + } + } + else + { + //必须有一个OK ccd结果拉带 + var gradingCCD_OKCount = listGradingCCD.Count(x => x.Contains("OK")); + if (gradingCCD_OKCount <= 0) + { + //CCD屏蔽被修改 报警 + omronPLCCom.lstMcUI[0].WriteDReg("W261", (short)2); + } + var lstGradingCCD_NG = listGradingCCD.Where(x => x.Contains("NG")).Distinct().ToList(); + foreach (var item_NG in lstGradingCCD_NG) + { + var grading_array = item_NG.Substring(0,item_NG.Length-2); + var indexGrading = listGradingCCD.IndexOf(grading_array + "OK"); + if (indexGrading < 0) + { + //CCD屏蔽被修改 报警 + omronPLCCom.lstMcUI[0].WriteDReg("W261", (short)2); + } + } + } + #endregion + + + rank += ccdOkNg; + //k77 + 不分类 ng ok + if (rank.Equals(Global.systemConfig.Grading1) ) + { + listResult[i] = (short)(MESGradingSet[0]); + m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}-CCD结果{ccdOkNg}"; + isOkGrading = true; + } + else if (rank.Equals(Global.systemConfig.Grading2) ) + { + listResult[i] = (short)(MESGradingSet[1]); + m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}-CCD结果{ccdOkNg}"; + isOkGrading = true; + } + else if (rank.Equals(Global.systemConfig.Grading3) ) + { + listResult[i] = (short)(MESGradingSet[2]); + m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}-CCD结果{ccdOkNg}"; + isOkGrading = true; + } + else if (rank.Equals(Global.systemConfig.Grading4)) + { + listResult[i] = (short)(MESGradingSet[3]); + m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}-CCD结果{ccdOkNg}"; + isOkGrading = true; + } + else + { + if (isCCDMask == 9) + { + m.Result = "分档NG"; + m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}-CCD屏蔽状态"; + } + else + { + m.Result = "分档NG"; + m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}与设置档位不匹配NG"; + } + + } + levelresult = resGrading.rows[0].level; + + } + else + { + m.Result = "分档NG"; + m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OK分档NG,MES未反馈正确档位"; + } + + } + else + { + if (resGrading.error == 9 || resGrading.error == 99) + { + omronPLCCom.lstMcUI[0].WriteDReg("W249", (short)1);//MES网络异常 + LogManagerControl.AddLog($"出站条码[{m.DepartureBarCode}]访问MES异常", LogAddtype.local, Logtype.Error); + } + m.Result = "分档NG"; + m.Remark = $"出站条码[{m.DepartureBarCode}]外观检MES分档请求失败,访问MES异常"; + } + + } + catch (Exception ex) + { + m.Result = "分档NG"; + m.Remark = $"出站条码[{m.DepartureBarCode}]解析出站MES分档数据异常,分档NG"; + LogManagerControl.AddLog("解析出站MES分档数据异常:" + ex.Message, LogAddtype.local, Logtype.Error); + } + + } + else + { + listResult[i] = 80;//不开启分档 + } + // + } + //NG + if (m.Result.IndexOf("NG") >= 0 && !isOkGrading) + { + if (IsStartNGFL) + { + listResult[i] = 99; + m.Result = "NG不分类"; + m.Remark = $"出站条码[{m.DepartureBarCode}],出站NG不分类"; + } + else + { + var NgOkChannelNo = 0; + var NgOkChannelValue = ""; + var indexFD = strNgBound.ToList().FindIndex(x => x == m.Result); + var smAndFdNg = false; + if (indexFD >= 0) + { + listResult[i] = (short)indexFD; + // m.Remark = $"出站条码[{m.DepartureBarCode},{m.Result}]"; + // + var smNgGradingSet = NgGradingSet.ToList().FindIndex(x => x == (indexFD+10)); + if(smNgGradingSet >= 0) + { + listResult[i] = (short)(NgGradingSet[smNgGradingSet]); + smAndFdNg = true; + NgOkChannelNo = smNgGradingSet; + m.Remark = $"出站条码[{m.DepartureBarCode},{m.Result},通道[{NgOkChannelNo + 5}]出站NG拉带值{listResult[i]},MES获取等级{levelresult}"; + } + } + if(!smAndFdNg) + { + var NgGrading1 = lstError.FindIndex(x => x == NgGradingSet[0]); + var NgGrading2 = lstError.FindIndex(x => x == NgGradingSet[1]); + var NgGrading3 = lstError.FindIndex(x => x == NgGradingSet[2]); + + if (NgGrading1 >= 0) + { + listResult[i] = (short)(NgGradingSet[0]); + NgOkChannelNo = 0; + } + else if (NgGrading2 >= 0) + { + listResult[i] = (short)(NgGradingSet[1]); + NgOkChannelNo = 1; + } + else if (NgGrading3 >= 0) + { + listResult[i] = (short)(NgGradingSet[2]); + NgOkChannelNo = 2; + } + else + { + var indexQT = strNgBound.ToList().FindIndex(x => x == "其他"); + var smNgGradingSet = NgGradingSet.ToList().FindIndex(x => x == (indexQT+10)); + if (smNgGradingSet >= 0) + { + listResult[i] = NgGradingSet[smNgGradingSet]; + NgOkChannelNo = smNgGradingSet; + } + else + { + listResult[i] = 88; + } + + } + m.Remark = $"出站条码[{m.DepartureBarCode}],NG,通道[{NgOkChannelNo + 5}]出站NG拉带值{listResult[i]},MES获取等级{levelresult}"; + } + } + } + + list.Add(m); + //电芯判断结果返回PLC + omronPLCCom.lstMcUI[0].WriteDReg("W302" + i.ToString(), listResult[i]); + } + //复位PLC信号 + omronPLCCom.lstMcUI[0].ClearReg(omronPLCCom.lstMcUI[0].lstTrgUI[1].TrgParams.TriggerAddr, VarType.Short); + sw.Stop(); + LogManagerControl.AddLog("出站数据处理耗时:" + sw.ElapsedMilliseconds + "ms", LogAddtype.local); + //显示数据库 + Task.Run(() => + { + SaveDataEven2_Run(list); + if (Global.systemConfig.isUpMes) + { + UpDataMES_Run(list); + } + }); + + + } + catch (Exception ex) + { + LogManagerControl.AddLog("读取出站数据异常:" + ex.Message, LogAddtype.local, Logtype.Error); + } + } + } + } + + /// + /// 结果加工参数上传 + /// + /// + private void UpDataMES_Run(object obj) + { + + try + { + List list = (List)obj; + if (list != null) + { + foreach (BlankingData m in list) + { + if (m != null) + { + #region 3、产品结果加工参数 + MesResponse resMes = ToMesData.ProductResultParameters(m); + if (!resMes.success) + { + if (resMes.error == 99) + { + omronPLCCom.lstMcUI[0].WriteDReg("W249", (short)1);//MES网络异常 + LogManagerControl.AddLog("结果数据上传MES超时或无法访问MES服务器", LogAddtype.local, Logtype.Error); + } + else + { + LogManagerControl.AddLog("结果数据上传MES失败NG" + resMes.message, LogAddtype.local, Logtype.Error); + } + } + #endregion + + #region 电池出站 + ReqExitStation req = new ReqExitStation() + { + SiteCode = Global.systemConfig.siteCode, + LineCode = Global.systemConfig.lineCode, + EquipNum = Global.systemConfig.equipCode, + UserName = Global.systemConfig.userName, + ContainerCode = string.Empty, + AssembleLineList = new List() { + new AssembleLine() { + Identification = m.ArrivalBarCode, + QualityStatus = m.Result, + // TODO NG编码 + QrCode = string.Empty, + NgCode = new string[] { string.Empty }, + // NG错误信息 + NgMessage = string.Empty + } + } + }; + RespArrivalStation resp = ToMesData.PostProductExitStationData(req); + + if (resp == null || !resp.Success) + { + string errMsg = $"出站数据上传MES失败, 错误代码: {resp?.Code}, 错误消息:{resp?.Message}, 报错消息类型: {resp?.Category}"; + LogManagerControl.AddLog(errMsg, LogAddtype.local, Logtype.Error); + } + #endregion + } + } + } + } + catch (System.Exception ex) + { + LogManagerControl.AddLog("上传出站结果参数异常:" + ex.Message, LogAddtype.local, Logtype.Error); + } + } + + + /// 电池异常数据保存 + /// + /// + private void SaveDataEven2_Run(object obj) + { + //if (!startup) + //{ + // return; + //} + if (dgvDataShow_B.InvokeRequired) + { + ChangeFunctionHTestB c = new ChangeFunctionHTestB(SaveDataEven2_Run); + this.Invoke(c, new object[] { obj }); + } + else + { + try + { + //BlankingDataService service = IocConfig.Provider.GetService(); + Repository repository = new Repository(); + var service = new BlankingDataService(repository); + + List list = (List)obj; + if (list != null) + { + foreach (BlankingData m in list) + { + //string strErr = ""; + string strRes = ""; + + // TODO 使用service操作 + int addCount = service.AddBlankData(m); + //var result = dbHelper.AddBlankingData(m, ref strErr);//保存本地数据 + strRes = addCount > 0 ? ",本地存储OK" : ",本地存储NG"; + m.Remark += strRes; + // 文件形式保存到本地 + List data = new List(); + data.Add(m); + CSVHelper.WriteCSV("", data, 2); + + if (listTB.Count > 50) + { + listTB.RemoveAt(0); + } + listTB.Add(m); + } + } + if (dgvDataShow_B.Rows.Count > 0) + { + dgvDataShow_B.CurrentCell = dgvDataShow_B.Rows[this.dgvDataShow_B.Rows.Count - 1].Cells[0]; + IniFileHelper.WriteIniData("SYSTEM_CONFIGURE", "ClassShift", ClassShift.ToString()); + IniFileHelper.WriteIniData("SYSTEM_CONFIGURE", "No", No.ToString()); + } + } + catch (Exception ex) + { + LogManagerControl.AddLog("下料保存数据失败:" + ex.Message, LogAddtype.local, Logtype.Error); + } + } + } + /// + /// 结果判断 + /// + /// + /// + /// + private short GetResult(BlankingData m, ref string strErr,ref List lstError) + { + short res = 0; + + strErr = ""; + #region 判断各项参数 + //入站条码判断 + bool IsBarInOK = !m.ArrivalBarCode.Contains("ERROR"); + //出站条码判断 + bool IsBarOK = !m.DepartureBarCode.Contains("ERROR"); + //判断条码是否一致 + bool bBar = true; + if (m.ArrivalBarCode.Trim() != m.DepartureBarCode.Trim()) + bBar = false; + m.TMDB = bBar ? "OK" : "NG"; + + bool[] b0 = new bool[16] { true, true, true, true, true, true, true, true, true, true, true, true, true, true,true,true }; + b0[0] = m.CCD1 == "OK" ? true : false; + b0[1] = m.CCD2 == "OK" ? true : false; + b0[2] = m.CCD3 == "OK" ? true : false; + b0[3] = m.CCD4 == "OK" ? true : false; + b0[4] = m.CCD5 == "OK" ? true : false; + b0[5] = m.CCD6 == "OK" ? true : false; + b0[6] = m.CCD7 == "OK" ? true : false; + b0[7] = m.CCD8 == "OK" ? true : false; + b0[8] = m.CCD9 == "OK" ? true : false; + b0[9] = m.CCD10 == "OK" ? true : false; + b0[10] = m.CCD11 == "OK" ? true : false; + b0[11] = m.CCD12 == "OK" ? true : false; + b0[12] = m.CCD13 == "OK" ? true : false; + b0[13] = m.CCD14 == "OK" ? true : false; + b0[14] = m.CCD15 == "OK" ? true : false; + b0[15] = m.CCD16 == "OK" ? true : false; + #endregion + + + #region + if ( IsBarOK && bBar && b0[0] && b0[1] && b0[2] && b0[3] && b0[4] && b0[5] && b0[6] && b0[7] && b0[8] && b0[9] && b0[10] && b0[11] && b0[12] && b0[13] && b0[14] && b0[15]) + { + strErr = "良品"; + res = 1; + lstError.Add(res); + return 1; + } + + //if (!IsBarInOK) + //{ + // strErr = "入站扫码不良,入站条码:" + m.ArrivalBarCode; + // return 2; + //} + if (!IsBarOK) + { + strErr = "出站扫码不良,出站条码:" + m.DepartureBarCode; + res = 2; + lstError.Add(res); + } + if (!bBar) + { + strErr = "入站与出站条码不一致"; + res = 3; + lstError.Add(res); + } + + if (!b0[0]) + { + strErr = "正面(2D/3D)不良"; + res = 11; + lstError.Add(res); + } + if (!b0[1]) + { + strErr = "反面(2D/3D)不良"; + res = 12; + lstError.Add(res); + } + if (!b0[2]) + { + strErr = "左侧面(2D/3D)不良"; + res =13; + lstError.Add(res); + } + if (!b0[3]) + { + strErr = "右侧面(2D/3D)不良"; + res = 14; + lstError.Add(res); + } + if (!b0[4]) + { + strErr = "顶面(2D/3D)不良"; + res = 15; + lstError.Add(res); + } + if (!b0[5]) + { + strErr = "底面(2D/3D)不良"; + res = 16; + lstError.Add(res); + } + if (!b0[6]) + { + strErr = "底WE1不良"; + res = 17; + lstError.Add(res); + } + if (!b0[7]) + { + strErr = "底WE2不良"; + res = 18; + lstError.Add(res); + } + if (!b0[8]) + { + strErr = "底WE3不良"; + res = 19; + lstError.Add(res); + } + if (!b0[9]) + { + strErr = "底WE4不良"; + res = 20; + lstError.Add(res); + } + if (!b0[10]) + { + strErr = "中ME1不良"; + res = 21; + lstError.Add(res); + } + if (!b0[11]) + { + strErr = "中ME2不良"; + res = 22; + lstError.Add(res); + } + if (!b0[12]) + { + strErr = "中ME3不良"; + res = 23; + lstError.Add(res); + } + if (!b0[13]) + { + strErr = "中ME4不良"; + res = 24; + lstError.Add(res); + } + if (!b0[14]) + { + strErr = "极柱(POS/NEG)不良"; + res = 25; + lstError.Add(res); + } + if (!b0[15]) + { + strErr = "防爆阀(PRO)不良"; + res = 26; + lstError.Add(res); + } + return 0; + + #endregion + + + + } + + + /// + /// 获取进站条码 + /// + /// + /// + /// + public string GetInTime(string strBar, ref string strErr) + { + string strTime = ""; + strErr = ""; + try + { + + if (strBar != "") + { + var result = dbHelper.GetBarInTime(strBar);//保存本地数据 + if (result != null && result.Rows.Count > 0) + { + strTime = result.Rows[0]["进站时间"].ToString(); + //dbHelper.UparInTime(strBar); + } + } + } + catch (Exception ex) + { + strErr = ex.Message; + } + return strTime; + + + } + /// + /// 判断字符串是否有特殊符号 + /// + /// + /// + public bool IsSpecialChar(string str) + { + Regex regExp = new Regex("[ \\[ \\] \\^ \\-_*×――(^)$%~!@@##$…&%¥—+=<>《》!!???::•`·、。,;,.;/\'\"{}()‘’“”-]"); + if (regExp.IsMatch(str)) + { + return true; + } + return false; + } + + /// + /// + /// + /// + /// + public List GetListInt(int Num) + { + List list = new List(); + for (int i = 0; i < Num; i++) + { + list.Add(1); + } + return list; + } + + /// + /// 生成byte List集合 + /// + /// + /// + public List GetListByte(int Num) + { + List list = new List(); + for (int i = 0; i < Num; i++) + { + list.Add(0); + } + return list; + } + + /// + /// 判断分档是否都扫到条码 + /// + /// + /// + public bool IsListRes(List list) + { + HashSet hs = new HashSet(list); + if (hs.Count == 1) + { + return true; + } + return false; + } + + #region 设备状态报告 + + /// + /// 间隔 + /// + /// + /// + string strStatues = ""; + private void processModeStatus(CancellationTokenSource mt) + { + strStatues = ""; + while (true) + { + //SendStatus(); + Thread.Sleep(1000); + } + } + + + /// + /// 设备状态上传 + /// + /// + + private void SendStatus() + { + + //size1 0:OFF, 1:Vacancy, 2:Tray In, 3:Running, 4:End, 5:Error, 6: Ready, 9: Red Ready -托盘接受到入库预约但是无法进入(5分钟) / 트레이 정보 응답을 못받은 경우(5분) + //size2 0: Auto, 1: Local + //先确定设备是在自动还是手动状态下 + if (startup) + { + string Size1 = "0"; + string Size2 = "1"; + Size1 = omronPLCCom.lstMcUI[0].ReadshortDReg("W10").ToString(); + Size2 = omronPLCCom.lstMcUI[0].ReadBoolDReg("W12").ToString() == "True" ? "0" : "1"; + if (Size1 != strStatues) + { + strStatues = Size1; + + #region 上传mes + //if (Global.systemConfig.isUpMes) + //{ + string currentTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + + JY.MES.FMS.FMS_Status Status = new JY.MES.FMS.FMS_Status(); + + Status.seatId = ""; + Status.recordDate = currentTime; + //Status.statusCode = ""; + Status.uploadTime = currentTime; + Status.guid = Guid.NewGuid().ToString(); + + switch (strStatues) + { + case "1": + Status.statusCode = "Run";//正常运行 + LogManagerControl.AddLog("当前状态:正常运行", LogAddtype.local, Logtype.Message); + + break; + case "2": + Status.statusCode = "Idle";//待机状态 + LogManagerControl.AddLog("当前状态:闲置待机", LogAddtype.local, Logtype.Message); + + break; + case "3": + Status.statusCode = "Alert";//故障调试 + LogManagerControl.AddLog("当前状态:故障调试", LogAddtype.local, Logtype.Message); + + break; + case "4": + Status.statusCode = "Maintain";//停机 + LogManagerControl.AddLog("当前状态:停止运行", LogAddtype.local, Logtype.Message); + break; + // default: + //Status.statusCode = "Idle";//待机状态 + //break; + } + + if (Global.systemConfig.isUpMes) + { + string strJosn = JsonConvert.SerializeObject(Status); + // LogManagerControl.AddLog($"PC->FMS[MES_Status]:{strJosn}", LogAddtype.MES); + //TxtHelper.WriteTxt($@"{Global.strMesLogspath}\{DateTime.Now.ToString("yyyyMMdd")}\设备运行状态\{DateTime.Now.ToString("HH")}.txt", strJosn); + + Stopwatch swTime = new Stopwatch(); + swTime.Start(); + var result = JY.MES.FMS.MesHelper_EVE.MES_Status(Status); + swTime.Stop(); + LogManagerControl.AddLog($"处理设备状态上报FMS耗时:{swTime.ElapsedMilliseconds}ms", LogAddtype.local, Logtype.Message); + + if (result != null) + { + string strRes = "code" + "[" + result.code + "]" + "success" + "[" + result.success + "]" + "message" + "[" + result.message + "]" + "category" + "[" + result.category + "]"; + LogManagerControl.AddLog($"FMS->PC[MES_Status]:{strRes}", LogAddtype.MES); + } + else + { + LogManagerControl.AddLog($"设备状态上报FMS出错", LogAddtype.local, Logtype.Message); + } + } + + #endregion + + // } + } + Task.Delay(1000); + } + + } + #endregion + + #region 报警信息读取 + /// + /// 报警信息读取 + /// + /// + /// + private void AlarmProcess(CancellationTokenSource mt, OperateResult resByte) + { + if (!mt.IsCancellationRequested) + { + sw.Restart(); + byte[] res = new byte[2]; + for (int i = 0; i < 30; i++) + { + res = omronPLCCom.lstMcUI[0].Readbyte("W6100[" + i + "].Word区", 1); + if (res != null) + { + for (int j = i; j < res.Length + i; j++) + { + listAlamByte[i + j] = res[j - i]; + } + } + } + + //AddLog(0, "读取报警耗时:" + sw.ElapsedMilliseconds + "ms"); + if (listAlamByte == null) { return; } + string strFileName = Environment.CurrentDirectory + "\\欧姆龙报警寄存器对应表.csv"; + listAlarmForm = CSVHelper.ReadCSV(strFileName); + //如果未配置报警地址信息返回 TODO + if (listAlarmForm == null) { return; } + int startPlcAddr = 0;//TODO 读取起始地址 + //3.公用方法解析byte[]数据 => List + if (listAlamByte == null) { return; } //如果未配置报警地址信息返回 + //TODO 切换三菱和欧姆龙 + listAlarmStatus = PLCAlarmParse.OmronEIPByte2Status(startPlcAddr, listAlamByte); + //4.判定有不良后,关联AlarmStatus 和AlarmForm + if (listAlarmStatus == null) { return; } //状态信息为空返回 + + //如果有报警,获取报警信息 + if (listAlarmStatus.Any(p => p.Status)) + { + #region 屏蔽 + ////从PLC读取读取开机时间 + //string starHourtTime = omronPLCCom.lstMcUI[0].ReadIntDReg("HMI_开机时间_H").ToString(); + //string starMinuteTime = omronPLCCom.lstMcUI[0].ReadIntDReg("HMI_开机时间_M").ToString(); + //string startSecondTime = omronPLCCom.lstMcUI[0].ReadIntDReg("HMI_开机时间_S").ToString(); + //string strStartTime = starHourtTime + ":" + starMinuteTime + ":" + startSecondTime; + //DateTime startTime = Convert.ToDateTime(strStartTime); + ////从PLC读取读取运行时间 + //string runHourtTime = omronPLCCom.lstMcUI[0].ReadIntDReg("HMI_运行时间_H").ToString(); + //string runMinuteTime = omronPLCCom.lstMcUI[0].ReadIntDReg("HMI_运行时间_H").ToString(); + //string runSecondTime = omronPLCCom.lstMcUI[0].ReadIntDReg("HMI_运行时间_H").ToString(); + //string strRunTime = runHourtTime + ":" + runMinuteTime + ":" + runSecondTime; + //DateTime runTime1 = Convert.ToDateTime(strRunTime); + #endregion + + //关联表单数据和报警记录,获取报警信息 + var result = listAlarmStatus.Where(s => s.Status).Join(listAlarmForm, s => s.PLCAdress, f => f.PLCAdress, (s, f) => new AlarmData() + { + AlarmGuid = Guid.NewGuid().ToString(), + PLCAdress = s.PLCAdress, + AlarmCode = f.AlarmCode, + AlarmContent = f.AlarmContent, + AlarmType = "停机报警", + AlarmDesc = f.AlarmContent, + AlarmState = "1", + StartTime = DateTime.Now, + EndTime = DateTime.Now, + Flag = 0, + }).ToList(); + + if (result != null && result.Count > 0 && Global.systemConfig.isUpMes) + { + try + { + foreach (var item in result) + { + if (item.AlarmCode != "") + { + #region 屏蔽 + //AlarmMesData alarmMesData = new AlarmMesData(); + //alarmMesData.deviceNo = Eqp_code; + //alarmMesData.alarmCode = item.AlarmCode; + //alarmMesData.alarmType = item.AlarmType; + //alarmMesData.alarmName = item.AlarmContent; + //alarmMesData.createTime = item.StartTime; + + //string strJosn = JsonConvert.SerializeObject(uploadAlarm); + //LogManagerControl.AddLog($"PC->FMS[报警状态]:{strJosn}", LogAddtype.MES); + //string strRecJosn = MESApiHelper.HttpPostJsonAPI(UpAlarmUrl, authorization, strJosn); + //var result1 = JsonConvert.DeserializeObject(strRecJosn); + //LogManagerControl.AddLog($"FMS->PC[报警状态]:{strRecJosn}", LogAddtype.MES); + #endregion + + //if (Global.systemConfig.isUpMes) + //{ + string currentTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + + JY.MES.FMS.FMS_Alarm Alarm = new JY.MES.FMS.FMS_Alarm(); + + Alarm.seatId = ""; + Alarm.recordDate = currentTime; + Alarm.guid = item.AlarmGuid; + Alarm.alarmEndTime = item.EndTime.ToString("yyyy-MM-dd HH:mm:ss"); + Alarm.alarmType = item.AlarmType; + Alarm.alarmName = item.AlarmContent; + //string strOCVStart = m.StartTime.Substring(0, 18); + //strOCVStart = strOCVStart.Replace("/", "-"); + //Alarm.alarmStartTime = strOCVStart; + Alarm.alarmStartTime = item.StartTime.ToString("yyyy-MM-dd HH:mm:ss"); + Alarm.faultCode = item.AlarmCode; + + + if (Global.systemConfig.isUpMes) + { + string strJosn = JsonConvert.SerializeObject(Alarm); + // LogManagerControl.AddLog($"PC->FMS[MES_Alarm]:{strJosn}", LogAddtype.MES); + //TxtHelper.WriteTxt($@"{Global.strMesLogspath}\{DateTime.Now.ToString("yyyyMMdd")}\设备报警\{DateTime.Now.ToString("HH")}.txt", strJosn); + + Stopwatch swTime1 = new Stopwatch(); + swTime1.Start(); + var AlarmResult = JY.MES.FMS.MesHelper_EVE.MES_Alarm(Alarm); + swTime1.Stop(); + LogManagerControl.AddLog($"处理报警上报FMS耗时:{swTime1.ElapsedMilliseconds}ms", LogAddtype.local, Logtype.Message); + + if (result != null) + { + string strRes = "code" + "[" + AlarmResult.code + "]" + "success" + "[" + AlarmResult.success + "]" + "message" + "[" + AlarmResult.message + "]" + "category" + "[" + AlarmResult.category + "]"; + LogManagerControl.AddLog($"FMS->PC[MES_Alarm]:{strRes}", LogAddtype.MES); + } + else + { + LogManagerControl.AddLog($"报警上报FMS出错", LogAddtype.local, Logtype.Message); + } + } + + + // } + + + } + } + } + catch (Exception ex) + { + LogManagerControl.AddLog("报警信息异常:" + ex.Message, LogAddtype.local, Logtype.Error); + } + //dbHelper.AddAlarmCacheData("tb_alarm", (List)result); + sw.Stop(); + LogManagerControl.AddLog("设备报警信息耗时:" + sw.ElapsedMilliseconds + "ms", LogAddtype.local); + } + Task.Run(() => + { + SaveAlamDataEven_Run(result); + }); + + //复位PLC信号 + omronPLCCom.lstMcUI[0].ClearReg(omronPLCCom.lstMcUI[0].lstTrgUI[2].TrgParams.TriggerAddr, VarType.Short); + } + } + } + /// + /// 保存和显示设备报警信息 + /// + /// + public void SaveAlamDataEven_Run(List list) + { + if (!startup) + { + return; + } + this.BeginInvoke((EventHandler)delegate + { + try + { + string strAlam = ""; + if (list != null) + { + foreach (AlarmData m in list) + { + var result = dbHelper.AddAlarmData(m);//保存本地数据 + strAlam += m.AlarmContent + ','; + } + //AddLog(2, "设备报警----->" + strAlam); + } + } + catch (Exception ex) + { + LogManagerControl.AddLog("保存异常数据失败:" + ex.Message, LogAddtype.local, Logtype.Error); + //AddLog(2, ex.Message); + //LogHelper.Error(ex.Message, new Exception("异常信息")); + } + }); + } + + #endregion + + /// + /// 读取稼动率和PPM + /// + /// + private void UpdatePPM() + { + try + { + if (startup) + { + float Capacit = Convert.ToSingle(omronPLCCom.lstMcUI[0].ReadFloatDReg("W14").ToString("f2"));//稼动率 + int PPM = omronPLCCom.lstMcUI[0].ReadIntDReg("W16");//PPM + int ToalQty = omronPLCCom.lstMcUI[0].ReadIntDReg("W18");//生产总数 + int OKQty = omronPLCCom.lstMcUI[0].ReadIntDReg("W20");//良品数 + //float AntiDustAirSpeed = Convert.ToSingle(omronPLCCom.lstMcUI[0].ReadFloatDReg("D16").ToString("f2")); + Invoke((Action)delegate + { + RPimpacting.Value = Capacit; + RPPPM.Progress = PPM; + crToalQty.CountValue = ToalQty; + cvOKQty.CountValue = OKQty; + bool flag = ToalQty == 0L; + if (flag) + { + prYield.Value = 0L; + } + else + { + prYield.Value = Convert.ToSingle((Convert.ToDouble(OKQty) / Convert.ToDouble(ToalQty)).ToString("f2")); + } + }); + } + } + catch (Exception ex) + { + LogManagerControl.AddLog("电池ppm与稼动率" + ex.Message, LogAddtype.local, Logtype.Error); + } + } + + #endregion + + #region 异常播报处理 + /// + /// 读取异常播报信息 + /// + /// + /// + private void processA3(CancellationTokenSource mt, OperateResult resByte) + { + if (!mt.IsCancellationRequested) + { + if (resByte.IsSuccess && resByte != null) + { + try + { + sw.Restart(); + string code = Convert.ToString(TransformBase.TransInt16(resByte.Content, 0));//读取工位编码,W7010 + omronPLCCom.lstMcUI[0].WriteDReg(omronPLCCom.lstMcUI[0].lstTrgUI[3].TrgParams.ResultAddr, 1);//结果返回PLC,W7100 + omronPLCCom.lstMcUI[0].ClearReg(omronPLCCom.lstMcUI[0].lstTrgUI[3].TrgParams.TriggerAddr, VarType.Short);//复位PLC信号,W7000 + sw.Stop(); + LogManagerControl.AddLog("读取异常播报数据处理耗时:" + sw.ElapsedMilliseconds + "ms", LogAddtype.local); + //查找对应数据,播放内容 + Task.Run(() => + { + string remark = dbHelper.GetAbnormalVoice(code, true); + if (_speech != null) + { + _speech.SpeakAsync(remark); + } + }); + } + catch (Exception ex) + { + LogManagerControl.AddLog("读取异常播报数据异常:" + ex.Message, LogAddtype.local, Logtype.Error); + } + } + } + } + + #endregion + + #region 通用方法 + + /// + /// 获取鼠标光标的当前位置 + /// + /// + /// + [DllImport("user32.dll")] + public static extern bool GetCursorPos(out Point pt); + + /// + /// 用户登录超时检查 + /// + /// + private void UserTimeOut(int secTime) + { + Task task = Task.Run(() => + { + for (int i = 0; i < secTime; i++) + { + GetCursorPos(out Point sourcePoint); + System.Threading.Thread.Sleep(1000); + GetCursorPos(out Point currentPoint); + if (sourcePoint.X != currentPoint.X | sourcePoint.Y == currentPoint.Y) + { + i = 0; + } + if (CurrentInfo.LoginOut) + { + break; + } + } + LoginOut(); + }); + } + + private void LoginOut() + { + LogManagerControl.AddLog(lblUser.Text + "-退出", LogAddtype.local); + CurrentInfo.autuority = Autuority.Empty; + lblUser.Invoke(new Action(() => lblUser.Text = "No User" + )); + CurrentInfo.LoginOut = true; + } + + private void Login(User user) + { + lblUser.Text = user.UserName; + Global.systemConfig.userName = user.UserName; + lblAuthority.Text = user.Level.ToString(); + CurrentInfo.autuority = user.Level; + CurrentInfo.LoginOut = false; + dtLogin = DateTime.Now; + LogManagerControl.AddLog(user.UserName + "-登录成功!", LogAddtype.local); + txtTcpClicet.Text = Global.systemConfig.isUpMes ? "MES在线" : "MES离线"; + if (startup) + { + SendAuthorityToPLC(); + } + //ShowEnabled(true); + UserTimeOut(30); + } + + /// + /// 检测是否是管理员账号 + /// + /// + private bool CheckAdmin() + { + if (CurrentInfo.autuority == Autuority.管理员) + { + return true; + } + return false; + } + + /// + /// 检测是否是管理员或者是工程师账号 + /// + /// + private bool CheckAdminOrEng() + { + if (CurrentInfo.autuority == Autuority.管理员 | CurrentInfo.autuority == Autuority.工程师) + { + return true; + } + return false; + } + + + /// + /// 判断长度 + /// + /// + /// + public string GetDataLenth(string str) + { + string strLenth = ""; + int lenth2 = str.Length; + int lenth = lenth2.ToString().Length; + if (lenth == 1) + { + strLenth = $" {lenth2}"; + + } + if (lenth == 2) + { + strLenth = $" {lenth2}"; + + } + if (lenth == 3) + { + strLenth = $" {lenth2}"; + + } + if (lenth == 4) + { + strLenth = $" {lenth2}"; + + } + if (lenth == 5) + { + strLenth = $" {lenth2}"; + + } + if (lenth == 6) + { + strLenth = $"{lenth2}"; + + } + return strLenth; + } + + int HeartCount = 0; + /// + /// 更新工具栏按钮状态 + /// + /// + private void ShowButtonEven_Run(string time) + { + HeartCount++; + UpdateDateTime(time); + UpdatePPM(); + + //if (isClient8321OK) + //{ + // if (HeartCount < 1 || HeartCount > 60) //1分钟发送一次 + // { + // HeartCount = 0; + // string Send925 = $"1{bObjID}1925{nSeqNo}9"; + // try + // { + + // LogManagerControl.AddLog($"PC->FMS[925][DataLength:{Send925.Length}]:{Send925}", LogAddtype.MES); + // SendMsg(Send925); + // //string str = ReadSpurtCode(Send925, ref strErr); + + // } + + // catch (Exception ex) + // { + // LogManagerControl.AddLog(ex.Message, LogAddtype.local, Logtype.Error); + // } + // } + //} + } + + /// + /// 日期时间显示 + /// + /// + private void UpdateDateTime(string _time) + { + timelabel.BeginInvoke((Action)delegate + { + timelabel.Text = _time; + }, _time); + } + #endregion + + private void LinkTCPEven_Run(string _time) + { + UpdateCommStatus(); + } + + private void UpdateCommStatus() + { + if (this.InvokeRequired) + { + BeginInvoke(new Action(UpdateCommStatus)); + return; + } + try + { + //if (com != null && com.lstUI[0] != null) + //{ + // if (com.lstUI[0].tcpClient.IsConnected) + // { + // if (com.lstUI[0].tcpClient.tcpclient.Client.Poll(10, SelectMode.SelectRead)) + // { + // LogManagerControl.AddLog(com.lstUI[0].tcpClient.tcpclient.Client.RemoteEndPoint.ToString() + "链接断开了…………", LogAddtype.local, Logtype.Error); + // com.lstUI[0].btnStart_Click(null, null); + // } + // else if (com.lstUI[0].info_Lab.Text == "未连接") + // { + // com.lstUI[0].btnStart_Click(null, null); + // } + // } + // else + // { + // com.lstUI[0].btnStart_Click(null, null); + // } + //} + } + catch (Exception) + { + //try + //{ + // com.lstUI[0].btnStart_Click(null, null); + //} + //catch (System.Exception) + //{ + //} + } + } + + private void HomeForm_FormClosing(object sender, FormClosingEventArgs e) + { + if (MessageBox.Show("是否退出程序?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk) == DialogResult.OK) + { + mCOMState.Cancel(); + isEnabled = false; + mctsA1.Cancel(); + mctsA2.Cancel(); + mctsA3.Cancel(); + IniFileHelper.WriteIniData("SYSTEM_CONFIGURE", "No", No.ToString()); + IniFileHelper.WriteIniData("SYSTEM_CONFIGURE", "ClassShift", ClassShift.ToString()); + if (port != null && port.IsOpen) + { + port.Close(); + port.Dispose(); + } + if (omronPLCCom != null) + { + for (int i = 0; i < OmronCount; i++) + { + omronPLCCom.lstMcUI[i].Shutdown(); + omronPLCCom.lstMcUI[i].Dispose(); + } + } + if (_speech != null) + { + if (_speech.State == SynthesizerState.Speaking) + { + _speech.Pause(); + _speech.Dispose(); + } + } + GC.Collect(); + } + else + { + e.Cancel = true; + } + } + + + private void HomeForm_FormClosed(object sender, FormClosedEventArgs e) + { + Process.GetCurrentProcess().Kill(); + } + + + + private void dgvDataShow_A_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) + { + if (e.RowIndex >= dgvDataShow_A.Rows.Count - 1) + return; + DataGridViewRow dr = (sender as DataGridView).Rows[e.RowIndex]; + + try + { + if (dr.Cells["Column4"].Value.Equals("OK")) + { + // 设置单元格的背景色 + dr.Cells["Column4"].Style.BackColor = Color.LightGreen; + // 设置单元格的前景色 + dr.Cells["Column4"].Style.ForeColor = Color.Black; + } + else + { + dr.Cells["Column4"].Style.BackColor = Color.Red; + dr.Cells["Column4"].Style.ForeColor = Color.White; + } + } + catch (Exception ex) + { + LogManagerControl.AddLog($"上料数据显示:[{ex.Message}]", LogAddtype.local, Logtype.Error); + } + } + + private void dgvDataShow_B_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) + { + if (e.RowIndex >= dgvDataShow_B.Rows.Count - 1) + return; + DataGridViewRow dr = (sender as DataGridView).Rows[e.RowIndex]; + + try + { + if (dr.Cells["Column22"].Value.Equals("OK")) + { + // 设置单元格的背景色 + dr.Cells["Column22"].Style.BackColor = Color.LightGreen; + // 设置单元格的前景色 + dr.Cells["Column22"].Style.ForeColor = Color.Black; + } + else + { + dr.Cells["Column22"].Style.BackColor = Color.Red; + dr.Cells["Column22"].Style.ForeColor = Color.White; + } + } + catch (Exception ex) + { + LogManagerControl.AddLog($"下料数据显示:[{ex.Message}]", LogAddtype.local, Logtype.Error); + } + } + + + private void tsmiAbnormalVoice_Click(object sender, EventArgs e) + { + if (!CheckAdmin()) + { + MessageBox.Show("权限不足", "系统提示"); + return; + } + FrmAbnormalVoice frm = new FrmAbnormalVoice(); + frm.ShowDialog(); + } + private void button1_Click(object sender, EventArgs e) + { + //GradingParam gradingParam = new GradingParam + //{ + // siteCode = "1", + // lineCode = "2", + // userName = "admin", + // equipCode = "3", + // recordDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + // qty = 1, + // containerCode = "", + // materialCode = "4", + // materiallotCodeList = new List() { "ABC" } + //}; + //string p = JsonConvert.SerializeObject(gradingParam); + + //GradingParam gradingParam = new GradingParam(); + //gradingParam.siteCode = "1"; + //gradingParam.lineCode = "1"; + //gradingParam.equipCode = "1"; + //gradingParam.userName = "123"; + //gradingParam.qty = 1; + //gradingParam.containerCode = ""; + //gradingParam.materialCode = "1"; + //gradingParam.recordDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + //gradingParam.materiallotCodeList = new List() { "123" }; + //string p = JsonConvert.SerializeObject(gradingParam); + List list = new List(); + List listBarIn = StrUtil.GetListString(2, "04QCB6CJ68701JF6K0008815");//进站条码 + List listBarOut = StrUtil.GetListString(2, "04QCB6CJ68701JF6K0008815");//出站条码 + List listBar1Result = CollectionUtil.GetListUShort(14); + List listBar2Result = CollectionUtil.GetListUShort(14); + List listResult = CollectionUtil.GetListUShort(2); + int id = 0; + + for (int i = 0; i < listBarOut.Count; i++) + { + BlankingData m = new BlankingData(); + id = i + 1; + + No = No + 1; + m.TD = No; + m.WorkShift = ClassShift == 0 ? "白班" : "夜班"; + m.ArrivalBarCode = listBarIn[i]; + m.DepartureBarCode = listBarOut[i]; + m.OutTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + + #region CCD结果 + if (id == 1) + { + m.CCD1 = "NG"; + m.CCD2 = listBar1Result[1] == 1 ? "OK" : "NG"; + m.CCD3 = listBar1Result[2] == 1 ? "OK" : "NG"; + m.CCD4 = listBar1Result[3] == 1 ? "OK" : "NG"; + m.CCD5 = listBar1Result[4] == 1 ? "OK" : "NG"; + m.CCD6 = listBar1Result[5] == 1 ? "OK" : "NG"; + m.CCD7 = listBar1Result[6] == 1 ? "OK" : "NG"; + m.CCD8 = listBar1Result[7] == 1 ? "OK" : "NG"; + m.CCD9 = listBar1Result[8] == 1 ? "OK" : "NG"; + m.CCD10 = listBar1Result[9] == 1 ? "OK" : "NG"; + m.CCD11 = listBar1Result[10] == 1 ? "OK" : "NG"; + m.CCD12 = listBar1Result[11] == 1 ? "OK" : "NG"; + m.CCD13 = listBar1Result[12] == 1 ? "OK" : "NG"; + m.CCD14 = listBar1Result[13] == 1 ? "OK" : "NG"; + + } + else + { + m.CCD1 = listBar2Result[0] == 1 ? "OK" : "NG"; + m.CCD2 = listBar2Result[1] == 1 ? "OK" : "NG"; + m.CCD3 = listBar2Result[2] == 1 ? "OK" : "NG"; + m.CCD4 = listBar2Result[3] == 1 ? "OK" : "NG"; + m.CCD5 = listBar2Result[4] == 1 ? "OK" : "NG"; + m.CCD6 = listBar2Result[5] == 1 ? "OK" : "NG"; + m.CCD7 = listBar2Result[6] == 1 ? "OK" : "NG"; + m.CCD8 = listBar2Result[7] == 1 ? "OK" : "NG"; + m.CCD9 = listBar2Result[8] == 1 ? "OK" : "NG"; + m.CCD10 = listBar2Result[9] == 1 ? "OK" : "NG"; + m.CCD11 = listBar2Result[10] == 1 ? "OK" : "NG"; + m.CCD12 = listBar2Result[11] == 1 ? "OK" : "NG"; + m.CCD13 = listBar2Result[12] == 1 ? "OK" : "NG"; + m.CCD14 = listBar2Result[13] == 1 ? "OK" : "NG"; + } + + var cfgList = Global.systemConfig.CollectItemCfgList + .Where(it => it.IsEnable && it.PLCRelAddress != null) + .OrderBy(it => it.PLCRelAddress).ToList(); + + for (int k = 0; k < cfgList.Count; k++) + { + var item = cfgList[k]; + + int index = (int)item.PLCRelAddress - 1; + + if (index < listBar2Result.Count) + { + var code = listBar2Result[index] == 1 ? "OK" : "NG"; + m.PLCValDic.Add((int)item.PLCRelAddress, code); + } + } + #endregion + + string strErr = ""; + //入站条码判断 + if (String.IsNullOrEmpty(m.ArrivalBarCode) || m.ArrivalBarCode.Trim() == "ERROR") + m.ArrivalBarCode = "ERROR" + Guid.NewGuid().ToString("N").Substring(0, 8); + //出站条码判断 + if (String.IsNullOrEmpty(m.DepartureBarCode) || m.DepartureBarCode.Trim() == "ERROR") + m.DepartureBarCode = "ERROR" + Guid.NewGuid().ToString("N").Substring(0, 8); + + var listNgError = new List(); + listResult[i] = GetResult(m, ref strErr,ref listNgError); + m.Result = listResult[i] == 1 ? "OK" : "NG"; + m.Remark = strErr; + + + if (Global.systemConfig.isUpMes) + { + + if (listResult[i] == 1 && chkCkGrading) + { + //分档接口 + //21~24 OK挡位 + MesResponse resGrading = ToMesData.GetMesIn(m.DepartureBarCode, m.ArrivalBarCode);//分档查询 + + try + { + listResult[i] = (short)25;//默认分档NG + m.Remark = "外观检OK分档NG"; + if (resGrading.success) + { + if (resGrading.rows != null && resGrading.rows.Count > 0 && resGrading.rows[0].rank != null) + { + if (resGrading.rows[0].rank.Equals(Global.systemConfig.Grading1)) + { + listResult[i] = (short)(MESGradingSet[0] + 20); + m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}"; + } + else if (resGrading.rows[0].rank.Equals(Global.systemConfig.Grading2)) + { + listResult[i] = (short)(MESGradingSet[1] + 20); + m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}"; + } + else if (resGrading.rows[0].rank.Equals(Global.systemConfig.Grading3)) + { + listResult[i] = (short)(MESGradingSet[2] + 20); + m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}"; + } + else if (resGrading.rows[0].rank.Equals(Global.systemConfig.Grading4)) + { + listResult[i] = (short)(MESGradingSet[3] + 20); + m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}"; + } + else + { + m.Result = "NG"; + m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}与设置档位不匹配NG"; + } + + } + else + { + m.Result = "NG"; + m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OK分档NG,MES未反馈正确档位"; + } + + } + else + { + if (resGrading.error == 9 || resGrading.error == 99) + { + omronPLCCom.lstMcUI[0].WriteDReg("W249", (short)1);//MES网络异常 + LogManagerControl.AddLog($"出站条码[{m.DepartureBarCode}]访问MES异常", LogAddtype.local, Logtype.Error); + } + m.Result = "NG"; + m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES分档请求失败,分档NG"; + } + } + catch (Exception ex) + { + LogManagerControl.AddLog("解析出站MES分档数据异常:" + ex.Message, LogAddtype.local, Logtype.Error); + } + + } + } + + if (IsStartNGFL && m.Result == "NG") + { + listResult[i] = (short)26; + m.Result = "NG"; + m.Remark = $"出站条码[{m.DepartureBarCode}],出站NG不分类"; + } + + + + list.Add(m); + } + + Task.Run(() => + { + SaveDataEven2_Run(list); + if (Global.systemConfig.isUpMes) + { + UpDataMES_Run(list); + } + }); + } + + /// + /// 一键降级 + /// + /// + /// + private void btn_YJJJ_Click(object sender, EventArgs e) + { + CurrentInfo.autuority = Autuority.操作员; + lblAuthority.Text = "操作员"; + if (startup)//plc链接成功 + omronPLCCom.lstMcUI[0].WriteDReg("D21", (short)1);//提示PLC进入操作员权限 + LogManagerControl.AddLog($"管理员{Global.systemConfig.userName}点击一键降级,为操作员权限,请重新登录获取管理员权限。", LogAddtype.local, Logtype.Warning); + + } + + private void tsmiTestCode_Click(object sender, EventArgs e) + { + FrmTest form = new FrmTest(); + form.ShowDialog(); + } + + private void mES分档设置ToolStripMenuItem_Click(object sender, EventArgs e) + { + if (!CheckAdminOrEng()) + { + MessageBox.Show("权限不足", "系统提示"); + return; + } + if (!startup) + { + MessageBox.Show("请先开启联机再进行操作!", "错误提示"); + return; + } + FormMesGradingSet frm = new FormMesGradingSet(omronPLCCom); + if (frm.ShowDialog() == DialogResult.OK) + { + ReadIni(); + } + //LogManagerControl.AddLog($"用户[{Global.mesConfig.userName}]点击了档位设置", LogAddtype.local, FilePathType.Local, Logtype.Message); + } + } +} diff --git a/JY.Inspection/HomeForm.designer.cs b/JY.Inspection/HomeForm.designer.cs new file mode 100644 index 0000000..3594d6f --- /dev/null +++ b/JY.Inspection/HomeForm.designer.cs @@ -0,0 +1,2453 @@ + +namespace JY.Inspection +{ + partial class HomeForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(HomeForm)); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle4 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle5 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle6 = new System.Windows.Forms.DataGridViewCellStyle(); + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.tsmiLogin = new System.Windows.Forms.ToolStripMenuItem(); + this.mES测试ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiSearch = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiHistory = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiCCDData = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiAlarmSearch = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiSetting = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiUserConfig = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiMESConfig = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiDBConfig = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiPLCConfig = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiSerialPortConfig = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiAbnormalVoice = new System.Windows.Forms.ToolStripMenuItem(); + this.mES分档设置ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiTestCode = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiParaConfig = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiChart = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiChangeModel = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiAbout = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.imageList1 = new System.Windows.Forms.ImageList(this.components); + this.lblUser = new MetroFramework.Controls.MetroLabel(); + this.metroLabel3 = new MetroFramework.Controls.MetroLabel(); + this.metroLabel4 = new MetroFramework.Controls.MetroLabel(); + this.panel2 = new System.Windows.Forms.Panel(); + this.lblAuthority = new MetroFramework.Controls.MetroLabel(); + this.metroLabel31 = new MetroFramework.Controls.MetroLabel(); + this.timelabel = new MetroFramework.Controls.MetroLabel(); + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel(); + this.txtsiteCode = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel2 = new System.Windows.Forms.ToolStripStatusLabel(); + this.txtlineCode = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel4 = new System.Windows.Forms.ToolStripStatusLabel(); + this.txtequipCode = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel6 = new System.Windows.Forms.ToolStripStatusLabel(); + this.txtmaterialCode = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel7 = new System.Windows.Forms.ToolStripStatusLabel(); + this.txtTcpClicet = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel3 = new System.Windows.Forms.ToolStripStatusLabel(); + this.txtClassShift = new System.Windows.Forms.ToolStripStatusLabel(); + this.panel3 = new System.Windows.Forms.Panel(); + this.txtlog = new System.Windows.Forms.GroupBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.dgvDataShow_B = new JY.Inspection.GridViewBuff(); + this.Column6 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column8 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column31 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column26 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column7 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column27 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column25 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column9 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column10 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column11 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column12 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column13 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column14 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column15 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column16 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column17 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column18 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column19 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column20 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column21 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column23 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column28 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column29 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column22 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column24 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.dgvDataShow_A = new JY.Inspection.GridViewBuff(); + this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column30 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column2 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column3 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column4 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column5 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.timer_Clock = new System.Windows.Forms.Timer(this.components); + this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); + this.splitContainer3 = new System.Windows.Forms.SplitContainer(); + this.splitContainer4 = new System.Windows.Forms.SplitContainer(); + this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.ckStartZNDB = new System.Windows.Forms.CheckBox(); + this.label26 = new System.Windows.Forms.Label(); + this.label23 = new System.Windows.Forms.Label(); + this.label24 = new System.Windows.Forms.Label(); + this.label25 = new System.Windows.Forms.Label(); + this.label20 = new System.Windows.Forms.Label(); + this.label21 = new System.Windows.Forms.Label(); + this.label22 = new System.Windows.Forms.Label(); + this.label17 = new System.Windows.Forms.Label(); + this.label18 = new System.Windows.Forms.Label(); + this.label19 = new System.Windows.Forms.Label(); + this.label16 = new System.Windows.Forms.Label(); + this.label14 = new System.Windows.Forms.Label(); + this.label13 = new System.Windows.Forms.Label(); + this.label15 = new System.Windows.Forms.Label(); + this.txtTotalPower = new System.Windows.Forms.TextBox(); + this.label10 = new System.Windows.Forms.Label(); + this.label11 = new System.Windows.Forms.Label(); + this.label12 = new System.Windows.Forms.Label(); + this.txtPowerC = new System.Windows.Forms.TextBox(); + this.txtPowerB = new System.Windows.Forms.TextBox(); + this.txtPowerA = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.label8 = new System.Windows.Forms.Label(); + this.label9 = new System.Windows.Forms.Label(); + this.txtIC = new System.Windows.Forms.TextBox(); + this.txtIB = new System.Windows.Forms.TextBox(); + this.txtIA = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.txtLineVolUAC = new System.Windows.Forms.TextBox(); + this.txtLineVolUBC = new System.Windows.Forms.TextBox(); + this.txtLineVolUAB = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.txtPhaseVolUC = new System.Windows.Forms.TextBox(); + this.txtPhaseVolUB = new System.Windows.Forms.TextBox(); + this.txtPhaseVolUA = new System.Windows.Forms.TextBox(); + this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.txtTensionStrapCCD4 = new System.Windows.Forms.TextBox(); + this.txtgrading4 = new System.Windows.Forms.TextBox(); + this.metroLabel13 = new MetroFramework.Controls.MetroLabel(); + this.txtTensionStrapCCD3 = new System.Windows.Forms.TextBox(); + this.txtgrading3 = new System.Windows.Forms.TextBox(); + this.metroLabel7 = new MetroFramework.Controls.MetroLabel(); + this.txtTensionStrapCCD2 = new System.Windows.Forms.TextBox(); + this.txtgrading2 = new System.Windows.Forms.TextBox(); + this.metroLabel6 = new MetroFramework.Controls.MetroLabel(); + this.txtgrading1 = new System.Windows.Forms.TextBox(); + this.txtTensionStrapCCD1 = new System.Windows.Forms.TextBox(); + this.metroLabel5 = new MetroFramework.Controls.MetroLabel(); + this.chkStartNGFL = new System.Windows.Forms.CheckBox(); + this.txtTensionStrap3 = new System.Windows.Forms.TextBox(); + this.metroLabel1 = new MetroFramework.Controls.MetroLabel(); + this.metroLabel36 = new MetroFramework.Controls.MetroLabel(); + this.metroLabel35 = new MetroFramework.Controls.MetroLabel(); + this.metroLabel34 = new MetroFramework.Controls.MetroLabel(); + this.txtTensionStrap2 = new System.Windows.Forms.TextBox(); + this.chkIsGarding = new System.Windows.Forms.CheckBox(); + this.metroLabel38 = new MetroFramework.Controls.MetroLabel(); + this.txtTensionStrap1 = new System.Windows.Forms.TextBox(); + this.metroLabel37 = new MetroFramework.Controls.MetroLabel(); + this.metroLabel33 = new MetroFramework.Controls.MetroLabel(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.splitContainer2 = new System.Windows.Forms.SplitContainer(); + this.pictureBox2 = new System.Windows.Forms.PictureBox(); + this.pictureBox3 = new System.Windows.Forms.PictureBox(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.tableLayoutPanel4 = new System.Windows.Forms.TableLayoutPanel(); + this.metroLabel2 = new MetroFramework.Controls.MetroLabel(); + this.btn_YJJJ = new System.Windows.Forms.PictureBox(); + this.cvOKQty = new JYControl.CircleCountValue(); + this.prYield = new WinformControlLibraryExtension.PercentageProgressExt(); + this.RPimpacting = new WinformControlLibraryExtension.PercentageProgressExt(); + this.metroLabel8 = new MetroFramework.Controls.MetroLabel(); + this.metroLabel9 = new MetroFramework.Controls.MetroLabel(); + this.metroLabel10 = new MetroFramework.Controls.MetroLabel(); + this.metroLabel11 = new MetroFramework.Controls.MetroLabel(); + this.RPPPM = new JYControl.CircleProgramBar(); + this.metroLabel12 = new MetroFramework.Controls.MetroLabel(); + this.crToalQty = new JYControl.CircleCountValue(); + this.lblLinkPLCState = new JYControl.LedControl(); + this.lblMsg = new MetroFramework.Controls.MetroLabel(); + this.btnStart = new JYControl.RoundButton(); + this.metroLabel14 = new MetroFramework.Controls.MetroLabel(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.button1 = new System.Windows.Forms.Button(); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker(); + this.menuStrip1.SuspendLayout(); + this.panel2.SuspendLayout(); + this.statusStrip1.SuspendLayout(); + this.panel3.SuspendLayout(); + this.groupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgvDataShow_B)).BeginInit(); + this.groupBox2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgvDataShow_A)).BeginInit(); + this.tableLayoutPanel3.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.tableLayoutPanel2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer3)).BeginInit(); + this.splitContainer3.Panel1.SuspendLayout(); + this.splitContainer3.Panel2.SuspendLayout(); + this.splitContainer3.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer4)).BeginInit(); + this.splitContainer4.Panel1.SuspendLayout(); + this.splitContainer4.Panel2.SuspendLayout(); + this.splitContainer4.SuspendLayout(); + this.groupBox5.SuspendLayout(); + this.groupBox6.SuspendLayout(); + this.groupBox4.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit(); + this.splitContainer2.Panel1.SuspendLayout(); + this.splitContainer2.Panel2.SuspendLayout(); + this.splitContainer2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); + this.groupBox3.SuspendLayout(); + this.tableLayoutPanel4.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.btn_YJJJ)).BeginInit(); + this.SuspendLayout(); + // + // menuStrip1 + // + this.menuStrip1.Font = new System.Drawing.Font("Microsoft YaHei UI", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.menuStrip1.ImageScalingSize = new System.Drawing.Size(20, 20); + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsmiLogin, + this.mES测试ToolStripMenuItem, + this.tsmiSearch, + this.tsmiSetting, + this.tsmiParaConfig, + this.tsmiChart, + this.tsmiChangeModel, + this.tsmiAbout, + this.toolStripMenuItem1}); + this.menuStrip1.Location = new System.Drawing.Point(0, 60); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Padding = new System.Windows.Forms.Padding(4, 2, 0, 2); + this.menuStrip1.Size = new System.Drawing.Size(1556, 28); + this.menuStrip1.TabIndex = 0; + this.menuStrip1.Text = "menuStrip1"; + // + // tsmiLogin + // + this.tsmiLogin.Image = ((System.Drawing.Image)(resources.GetObject("tsmiLogin.Image"))); + this.tsmiLogin.Name = "tsmiLogin"; + this.tsmiLogin.Size = new System.Drawing.Size(69, 24); + this.tsmiLogin.Text = "登录"; + this.tsmiLogin.Click += new System.EventHandler(this.tsmiLogin_Click); + // + // mES测试ToolStripMenuItem + // + this.mES测试ToolStripMenuItem.Name = "mES测试ToolStripMenuItem"; + this.mES测试ToolStripMenuItem.Size = new System.Drawing.Size(12, 24); + // + // tsmiSearch + // + this.tsmiSearch.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsmiHistory, + this.tsmiCCDData, + this.tsmiAlarmSearch}); + this.tsmiSearch.Image = ((System.Drawing.Image)(resources.GetObject("tsmiSearch.Image"))); + this.tsmiSearch.Name = "tsmiSearch"; + this.tsmiSearch.Size = new System.Drawing.Size(69, 24); + this.tsmiSearch.Text = "查询"; + // + // tsmiHistory + // + this.tsmiHistory.Name = "tsmiHistory"; + this.tsmiHistory.Size = new System.Drawing.Size(191, 24); + this.tsmiHistory.Text = "历史数据查询"; + this.tsmiHistory.Click += new System.EventHandler(this.tsmiHistory_Click); + // + // tsmiCCDData + // + this.tsmiCCDData.Name = "tsmiCCDData"; + this.tsmiCCDData.Size = new System.Drawing.Size(191, 24); + this.tsmiCCDData.Text = "CCD检测数据统计"; + this.tsmiCCDData.Visible = false; + this.tsmiCCDData.Click += new System.EventHandler(this.tsmiCCDData_Click); + // + // tsmiAlarmSearch + // + this.tsmiAlarmSearch.Name = "tsmiAlarmSearch"; + this.tsmiAlarmSearch.Size = new System.Drawing.Size(191, 24); + this.tsmiAlarmSearch.Text = "报警信息查询"; + this.tsmiAlarmSearch.Visible = false; + this.tsmiAlarmSearch.Click += new System.EventHandler(this.tsmiAlarmSearch_Click); + // + // tsmiSetting + // + this.tsmiSetting.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsmiUserConfig, + this.tsmiMESConfig, + this.tsmiDBConfig, + this.tsmiPLCConfig, + this.tsmiSerialPortConfig, + this.tsmiAbnormalVoice, + this.mES分档设置ToolStripMenuItem, + this.tsmiTestCode}); + this.tsmiSetting.Image = ((System.Drawing.Image)(resources.GetObject("tsmiSetting.Image"))); + this.tsmiSetting.Name = "tsmiSetting"; + this.tsmiSetting.Size = new System.Drawing.Size(69, 24); + this.tsmiSetting.Text = "设置"; + // + // tsmiUserConfig + // + this.tsmiUserConfig.AccessibleRole = System.Windows.Forms.AccessibleRole.None; + this.tsmiUserConfig.Image = ((System.Drawing.Image)(resources.GetObject("tsmiUserConfig.Image"))); + this.tsmiUserConfig.Name = "tsmiUserConfig"; + this.tsmiUserConfig.Size = new System.Drawing.Size(168, 26); + this.tsmiUserConfig.Text = "用户设置"; + this.tsmiUserConfig.Click += new System.EventHandler(this.tsmiUserConfig_Click); + // + // tsmiMESConfig + // + this.tsmiMESConfig.Image = ((System.Drawing.Image)(resources.GetObject("tsmiMESConfig.Image"))); + this.tsmiMESConfig.Name = "tsmiMESConfig"; + this.tsmiMESConfig.Size = new System.Drawing.Size(168, 26); + this.tsmiMESConfig.Text = "系统参数设置"; + this.tsmiMESConfig.Click += new System.EventHandler(this.tsmiMESConfig_Click); + // + // tsmiDBConfig + // + this.tsmiDBConfig.Image = ((System.Drawing.Image)(resources.GetObject("tsmiDBConfig.Image"))); + this.tsmiDBConfig.Name = "tsmiDBConfig"; + this.tsmiDBConfig.Size = new System.Drawing.Size(168, 26); + this.tsmiDBConfig.Text = "数据库设置"; + this.tsmiDBConfig.Visible = false; + this.tsmiDBConfig.Click += new System.EventHandler(this.tsmiDBConfig_Click); + // + // tsmiPLCConfig + // + this.tsmiPLCConfig.Image = ((System.Drawing.Image)(resources.GetObject("tsmiPLCConfig.Image"))); + this.tsmiPLCConfig.Name = "tsmiPLCConfig"; + this.tsmiPLCConfig.Size = new System.Drawing.Size(168, 26); + this.tsmiPLCConfig.Text = "PLC通讯设置"; + this.tsmiPLCConfig.Click += new System.EventHandler(this.tsmiPLCConfig_Click); + // + // tsmiSerialPortConfig + // + this.tsmiSerialPortConfig.Image = ((System.Drawing.Image)(resources.GetObject("tsmiSerialPortConfig.Image"))); + this.tsmiSerialPortConfig.Name = "tsmiSerialPortConfig"; + this.tsmiSerialPortConfig.Size = new System.Drawing.Size(168, 26); + this.tsmiSerialPortConfig.Text = "TCP通讯设置"; + this.tsmiSerialPortConfig.Visible = false; + this.tsmiSerialPortConfig.Click += new System.EventHandler(this.tsmiSerialPortConfig_Click); + // + // tsmiAbnormalVoice + // + this.tsmiAbnormalVoice.Image = ((System.Drawing.Image)(resources.GetObject("tsmiAbnormalVoice.Image"))); + this.tsmiAbnormalVoice.Name = "tsmiAbnormalVoice"; + this.tsmiAbnormalVoice.Size = new System.Drawing.Size(168, 26); + this.tsmiAbnormalVoice.Text = "异常播报设置"; + this.tsmiAbnormalVoice.Visible = false; + this.tsmiAbnormalVoice.Click += new System.EventHandler(this.tsmiAbnormalVoice_Click); + // + // mES分档设置ToolStripMenuItem + // + this.mES分档设置ToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("mES分档设置ToolStripMenuItem.Image"))); + this.mES分档设置ToolStripMenuItem.Name = "mES分档设置ToolStripMenuItem"; + this.mES分档设置ToolStripMenuItem.Size = new System.Drawing.Size(168, 26); + this.mES分档设置ToolStripMenuItem.Text = "MES分档设置"; + this.mES分档设置ToolStripMenuItem.Click += new System.EventHandler(this.mES分档设置ToolStripMenuItem_Click); + // + // tsmiTestCode + // + this.tsmiTestCode.AccessibleRole = System.Windows.Forms.AccessibleRole.None; + this.tsmiTestCode.Name = "tsmiTestCode"; + this.tsmiTestCode.Size = new System.Drawing.Size(168, 26); + this.tsmiTestCode.Text = "开发测试"; + this.tsmiTestCode.Click += new System.EventHandler(this.tsmiTestCode_Click); + // + // tsmiParaConfig + // + this.tsmiParaConfig.Image = ((System.Drawing.Image)(resources.GetObject("tsmiParaConfig.Image"))); + this.tsmiParaConfig.Name = "tsmiParaConfig"; + this.tsmiParaConfig.Size = new System.Drawing.Size(69, 24); + this.tsmiParaConfig.Text = "参数"; + this.tsmiParaConfig.Visible = false; + this.tsmiParaConfig.Click += new System.EventHandler(this.tsmiParaConfig_Click); + // + // tsmiChart + // + this.tsmiChart.Image = ((System.Drawing.Image)(resources.GetObject("tsmiChart.Image"))); + this.tsmiChart.Name = "tsmiChart"; + this.tsmiChart.Size = new System.Drawing.Size(69, 24); + this.tsmiChart.Text = "统计"; + this.tsmiChart.Visible = false; + this.tsmiChart.Click += new System.EventHandler(this.tsmiChart_Click); + // + // tsmiChangeModel + // + this.tsmiChangeModel.Image = ((System.Drawing.Image)(resources.GetObject("tsmiChangeModel.Image"))); + this.tsmiChangeModel.Name = "tsmiChangeModel"; + this.tsmiChangeModel.Size = new System.Drawing.Size(69, 24); + this.tsmiChangeModel.Text = "换型"; + this.tsmiChangeModel.Visible = false; + this.tsmiChangeModel.Click += new System.EventHandler(this.tsmiChangeModel_Click); + // + // tsmiAbout + // + this.tsmiAbout.Image = ((System.Drawing.Image)(resources.GetObject("tsmiAbout.Image"))); + this.tsmiAbout.Name = "tsmiAbout"; + this.tsmiAbout.Size = new System.Drawing.Size(69, 24); + this.tsmiAbout.Text = "关于"; + this.tsmiAbout.Click += new System.EventHandler(this.tsmiAbout_Click); + // + // toolStripMenuItem1 + // + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + this.toolStripMenuItem1.Size = new System.Drawing.Size(12, 24); + // + // imageList1 + // + this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream"))); + this.imageList1.TransparentColor = System.Drawing.Color.Transparent; + this.imageList1.Images.SetKeyName(0, "info.png"); + this.imageList1.Images.SetKeyName(1, "warning.png"); + this.imageList1.Images.SetKeyName(2, "error.png"); + // + // lblUser + // + this.lblUser.AutoSize = true; + this.lblUser.Location = new System.Drawing.Point(64, 29); + this.lblUser.Name = "lblUser"; + this.lblUser.Size = new System.Drawing.Size(57, 19); + this.lblUser.TabIndex = 3; + this.lblUser.Text = "No User"; + // + // metroLabel3 + // + this.metroLabel3.AutoSize = true; + this.metroLabel3.Location = new System.Drawing.Point(3, 29); + this.metroLabel3.Name = "metroLabel3"; + this.metroLabel3.Size = new System.Drawing.Size(65, 19); + this.metroLabel3.TabIndex = 4; + this.metroLabel3.Text = "用户名:"; + // + // metroLabel4 + // + this.metroLabel4.AutoSize = true; + this.metroLabel4.Location = new System.Drawing.Point(3, 5); + this.metroLabel4.Name = "metroLabel4"; + this.metroLabel4.Size = new System.Drawing.Size(79, 19); + this.metroLabel4.TabIndex = 5; + this.metroLabel4.Text = "日期时间:"; + // + // panel2 + // + this.panel2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.panel2.Controls.Add(this.lblAuthority); + this.panel2.Controls.Add(this.lblUser); + this.panel2.Controls.Add(this.metroLabel31); + this.panel2.Controls.Add(this.metroLabel3); + this.panel2.Controls.Add(this.timelabel); + this.panel2.Controls.Add(this.metroLabel4); + this.panel2.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.panel2.Location = new System.Drawing.Point(3659, 6); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(260, 52); + this.panel2.TabIndex = 7; + // + // lblAuthority + // + this.lblAuthority.AutoSize = true; + this.lblAuthority.Location = new System.Drawing.Point(183, 29); + this.lblAuthority.Name = "lblAuthority"; + this.lblAuthority.Size = new System.Drawing.Size(57, 19); + this.lblAuthority.TabIndex = 7; + this.lblAuthority.Text = "No User"; + // + // metroLabel31 + // + this.metroLabel31.AutoSize = true; + this.metroLabel31.Location = new System.Drawing.Point(141, 29); + this.metroLabel31.Name = "metroLabel31"; + this.metroLabel31.Size = new System.Drawing.Size(51, 19); + this.metroLabel31.TabIndex = 8; + this.metroLabel31.Text = "权限:"; + // + // timelabel + // + this.timelabel.AutoSize = true; + this.timelabel.Location = new System.Drawing.Point(100, 5); + this.timelabel.Name = "timelabel"; + this.timelabel.Size = new System.Drawing.Size(121, 19); + this.timelabel.TabIndex = 6; + this.timelabel.Text = "2021-10-18 15:30:50"; + this.timelabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.timelabel.Theme = MetroFramework.MetroThemeStyle.Light; + // + // statusStrip1 + // + this.statusStrip1.ImageScalingSize = new System.Drawing.Size(20, 20); + this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripStatusLabel1, + this.txtsiteCode, + this.toolStripStatusLabel2, + this.txtlineCode, + this.toolStripStatusLabel4, + this.txtequipCode, + this.toolStripStatusLabel6, + this.txtmaterialCode, + this.toolStripStatusLabel7, + this.txtTcpClicet, + this.toolStripStatusLabel3, + this.txtClassShift}); + this.statusStrip1.Location = new System.Drawing.Point(0, 862); + this.statusStrip1.Name = "statusStrip1"; + this.statusStrip1.Size = new System.Drawing.Size(1556, 22); + this.statusStrip1.TabIndex = 8; + this.statusStrip1.Text = "statusStrip1"; + // + // toolStripStatusLabel1 + // + this.toolStripStatusLabel1.Name = "toolStripStatusLabel1"; + this.toolStripStatusLabel1.Size = new System.Drawing.Size(68, 17); + this.toolStripStatusLabel1.Text = "工厂代码:"; + // + // txtsiteCode + // + this.txtsiteCode.Name = "txtsiteCode"; + this.txtsiteCode.Size = new System.Drawing.Size(37, 17); + this.txtsiteCode.Text = "R001"; + // + // toolStripStatusLabel2 + // + this.toolStripStatusLabel2.Name = "toolStripStatusLabel2"; + this.toolStripStatusLabel2.Size = new System.Drawing.Size(68, 17); + this.toolStripStatusLabel2.Text = "产线名称:"; + // + // txtlineCode + // + this.txtlineCode.Name = "txtlineCode"; + this.txtlineCode.Size = new System.Drawing.Size(36, 17); + this.txtlineCode.Text = "1111"; + // + // toolStripStatusLabel4 + // + this.toolStripStatusLabel4.Name = "toolStripStatusLabel4"; + this.toolStripStatusLabel4.Size = new System.Drawing.Size(59, 17); + this.toolStripStatusLabel4.Text = "设备编码:"; + // + // txtequipCode + // + this.txtequipCode.Name = "txtequipCode"; + this.txtequipCode.Size = new System.Drawing.Size(29, 17); + this.txtequipCode.Text = "123"; + // + // toolStripStatusLabel6 + // + this.toolStripStatusLabel6.Name = "toolStripStatusLabel6"; + this.toolStripStatusLabel6.Size = new System.Drawing.Size(59, 17); + this.toolStripStatusLabel6.Text = "物料编码:"; + // + // txtmaterialCode + // + this.txtmaterialCode.Name = "txtmaterialCode"; + this.txtmaterialCode.Size = new System.Drawing.Size(29, 17); + this.txtmaterialCode.Text = "111"; + // + // toolStripStatusLabel7 + // + this.toolStripStatusLabel7.Name = "toolStripStatusLabel7"; + this.toolStripStatusLabel7.Size = new System.Drawing.Size(84, 17); + this.toolStripStatusLabel7.Text = " 当前模式:"; + // + // txtTcpClicet + // + this.txtTcpClicet.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(192))))); + this.txtTcpClicet.ForeColor = System.Drawing.Color.White; + this.txtTcpClicet.Name = "txtTcpClicet"; + this.txtTcpClicet.Size = new System.Drawing.Size(56, 17); + this.txtTcpClicet.Text = "单机模式"; + // + // toolStripStatusLabel3 + // + this.toolStripStatusLabel3.Name = "toolStripStatusLabel3"; + this.toolStripStatusLabel3.Size = new System.Drawing.Size(44, 17); + this.toolStripStatusLabel3.Text = "班次:"; + // + // txtClassShift + // + this.txtClassShift.Name = "txtClassShift"; + this.txtClassShift.Size = new System.Drawing.Size(29, 17); + this.txtClassShift.Text = "111"; + // + // panel3 + // + this.panel3.Controls.Add(this.txtlog); + this.panel3.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panel3.Location = new System.Drawing.Point(0, 659); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(1556, 203); + this.panel3.TabIndex = 9; + // + // txtlog + // + this.txtlog.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtlog.Location = new System.Drawing.Point(0, 0); + this.txtlog.Name = "txtlog"; + this.txtlog.Size = new System.Drawing.Size(1556, 203); + this.txtlog.TabIndex = 0; + this.txtlog.TabStop = false; + this.txtlog.Text = "日志记录"; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.dgvDataShow_B); + this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBox1.Location = new System.Drawing.Point(0, 0); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(1473, 250); + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "电芯出站"; + // + // dgvDataShow_B + // + this.dgvDataShow_B.AllowUserToAddRows = false; + this.dgvDataShow_B.AllowUserToDeleteRows = false; + this.dgvDataShow_B.AllowUserToResizeRows = false; + this.dgvDataShow_B.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.DisplayedCells; + this.dgvDataShow_B.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.dgvDataShow_B.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dgvDataShow_B.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.None; + this.dgvDataShow_B.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(174)))), ((int)(((byte)(219))))); + dataGridViewCellStyle1.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + dataGridViewCellStyle1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(198)))), ((int)(((byte)(247))))); + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvDataShow_B.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + this.dgvDataShow_B.ColumnHeadersHeight = 29; + this.dgvDataShow_B.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + this.dgvDataShow_B.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.Column6, + this.Column8, + this.Column31, + this.Column26, + this.Column7, + this.Column27, + this.Column25, + this.Column9, + this.Column10, + this.Column11, + this.Column12, + this.Column13, + this.Column14, + this.Column15, + this.Column16, + this.Column17, + this.Column18, + this.Column19, + this.Column20, + this.Column21, + this.Column23, + this.Column28, + this.Column29, + this.Column22, + this.Column24}); + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + dataGridViewCellStyle2.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle2.ForeColor = System.Drawing.Color.Black; + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.Color.Silver; + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvDataShow_B.DefaultCellStyle = dataGridViewCellStyle2; + this.dgvDataShow_B.Dock = System.Windows.Forms.DockStyle.Fill; + this.dgvDataShow_B.EnableHeadersVisualStyles = false; + this.dgvDataShow_B.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + this.dgvDataShow_B.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.dgvDataShow_B.Location = new System.Drawing.Point(3, 17); + this.dgvDataShow_B.Name = "dgvDataShow_B"; + this.dgvDataShow_B.ReadOnly = true; + this.dgvDataShow_B.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Sunken; + dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(174)))), ((int)(((byte)(219))))); + dataGridViewCellStyle3.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + dataGridViewCellStyle3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + dataGridViewCellStyle3.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(198)))), ((int)(((byte)(247))))); + dataGridViewCellStyle3.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvDataShow_B.RowHeadersDefaultCellStyle = dataGridViewCellStyle3; + this.dgvDataShow_B.RowHeadersVisible = false; + this.dgvDataShow_B.RowHeadersWidth = 51; + this.dgvDataShow_B.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; + this.dgvDataShow_B.RowTemplate.Height = 23; + this.dgvDataShow_B.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgvDataShow_B.Size = new System.Drawing.Size(1467, 230); + this.dgvDataShow_B.TabIndex = 0; + this.dgvDataShow_B.RowPrePaint += new System.Windows.Forms.DataGridViewRowPrePaintEventHandler(this.dgvDataShow_B_RowPrePaint); + // + // Column6 + // + this.Column6.DataPropertyName = "TD"; + this.Column6.HeaderText = "序号"; + this.Column6.MinimumWidth = 6; + this.Column6.Name = "Column6"; + this.Column6.ReadOnly = true; + this.Column6.Width = 52; + // + // Column8 + // + this.Column8.DataPropertyName = "WorkShift"; + this.Column8.HeaderText = "班次"; + this.Column8.MinimumWidth = 6; + this.Column8.Name = "Column8"; + this.Column8.ReadOnly = true; + this.Column8.Width = 52; + // + // Column31 + // + this.Column31.DataPropertyName = "TDGroup"; + this.Column31.HeaderText = "主道"; + this.Column31.MinimumWidth = 8; + this.Column31.Name = "Column31"; + this.Column31.ReadOnly = true; + this.Column31.Width = 52; + // + // Column26 + // + this.Column26.DataPropertyName = "ArrivalBarCode"; + this.Column26.HeaderText = "入站条码"; + this.Column26.MinimumWidth = 8; + this.Column26.Name = "Column26"; + this.Column26.ReadOnly = true; + this.Column26.Width = 64; + // + // Column7 + // + this.Column7.DataPropertyName = "DepartureBarCode"; + this.Column7.HeaderText = "出站条码"; + this.Column7.MinimumWidth = 6; + this.Column7.Name = "Column7"; + this.Column7.ReadOnly = true; + this.Column7.Width = 64; + // + // Column27 + // + this.Column27.DataPropertyName = "TMDB"; + this.Column27.HeaderText = "条码对比"; + this.Column27.MinimumWidth = 8; + this.Column27.Name = "Column27"; + this.Column27.ReadOnly = true; + this.Column27.Width = 64; + // + // Column25 + // + this.Column25.DataPropertyName = "OutTime"; + this.Column25.HeaderText = "出站时间"; + this.Column25.MinimumWidth = 6; + this.Column25.Name = "Column25"; + this.Column25.ReadOnly = true; + this.Column25.Width = 64; + // + // Column9 + // + this.Column9.DataPropertyName = "CCD1"; + this.Column9.HeaderText = "正面(2D/3D)"; + this.Column9.MinimumWidth = 6; + this.Column9.Name = "Column9"; + this.Column9.ReadOnly = true; + this.Column9.Width = 86; + // + // Column10 + // + this.Column10.DataPropertyName = "CCD2"; + this.Column10.HeaderText = "反面(2D/3D)"; + this.Column10.MinimumWidth = 6; + this.Column10.Name = "Column10"; + this.Column10.ReadOnly = true; + this.Column10.Width = 86; + // + // Column11 + // + this.Column11.DataPropertyName = "CCD3"; + this.Column11.HeaderText = "左侧面(2D/3D)"; + this.Column11.MinimumWidth = 6; + this.Column11.Name = "Column11"; + this.Column11.ReadOnly = true; + this.Column11.Width = 98; + // + // Column12 + // + this.Column12.DataPropertyName = "CCD4"; + this.Column12.HeaderText = "右侧面(2D/3D)"; + this.Column12.MinimumWidth = 6; + this.Column12.Name = "Column12"; + this.Column12.ReadOnly = true; + this.Column12.Width = 98; + // + // Column13 + // + this.Column13.DataPropertyName = "CCD5"; + this.Column13.HeaderText = "顶面(2D/3D)"; + this.Column13.MinimumWidth = 6; + this.Column13.Name = "Column13"; + this.Column13.ReadOnly = true; + this.Column13.Width = 86; + // + // Column14 + // + this.Column14.DataPropertyName = "CCD6"; + this.Column14.HeaderText = "底面(2D/3D)"; + this.Column14.MinimumWidth = 6; + this.Column14.Name = "Column14"; + this.Column14.ReadOnly = true; + this.Column14.Width = 86; + // + // Column15 + // + this.Column15.DataPropertyName = "CCD7"; + this.Column15.HeaderText = "底棱边WE1"; + this.Column15.MinimumWidth = 6; + this.Column15.Name = "Column15"; + this.Column15.ReadOnly = true; + this.Column15.Width = 85; + // + // Column16 + // + this.Column16.DataPropertyName = "CCD8"; + this.Column16.HeaderText = "底棱边WE2"; + this.Column16.MinimumWidth = 6; + this.Column16.Name = "Column16"; + this.Column16.ReadOnly = true; + this.Column16.Width = 85; + // + // Column17 + // + this.Column17.DataPropertyName = "CCD9"; + this.Column17.HeaderText = "底棱边WE3"; + this.Column17.MinimumWidth = 6; + this.Column17.Name = "Column17"; + this.Column17.ReadOnly = true; + this.Column17.Width = 85; + // + // Column18 + // + this.Column18.DataPropertyName = "CCD10"; + this.Column18.HeaderText = "底棱边WE4"; + this.Column18.MinimumWidth = 6; + this.Column18.Name = "Column18"; + this.Column18.ReadOnly = true; + this.Column18.Width = 85; + // + // Column19 + // + this.Column19.DataPropertyName = "CCD11"; + this.Column19.HeaderText = "中棱边ME1"; + this.Column19.MinimumWidth = 6; + this.Column19.Name = "Column19"; + this.Column19.ReadOnly = true; + this.Column19.Width = 84; + // + // Column20 + // + this.Column20.DataPropertyName = "CCD12"; + this.Column20.HeaderText = "中棱边ME2"; + this.Column20.MinimumWidth = 6; + this.Column20.Name = "Column20"; + this.Column20.ReadOnly = true; + this.Column20.Width = 84; + // + // Column21 + // + this.Column21.DataPropertyName = "CCD13"; + this.Column21.HeaderText = "中棱边ME3"; + this.Column21.MinimumWidth = 6; + this.Column21.Name = "Column21"; + this.Column21.ReadOnly = true; + this.Column21.Width = 84; + // + // Column23 + // + this.Column23.DataPropertyName = "CCD14"; + this.Column23.HeaderText = "中棱边ME4"; + this.Column23.MinimumWidth = 6; + this.Column23.Name = "Column23"; + this.Column23.ReadOnly = true; + this.Column23.Width = 84; + // + // Column28 + // + this.Column28.DataPropertyName = "CCD15"; + this.Column28.HeaderText = "极柱(POS/NEG)"; + this.Column28.MinimumWidth = 8; + this.Column28.Name = "Column28"; + this.Column28.ReadOnly = true; + // + // Column29 + // + this.Column29.DataPropertyName = "CCD16"; + this.Column29.HeaderText = "防爆阀(PRO)"; + this.Column29.MinimumWidth = 8; + this.Column29.Name = "Column29"; + this.Column29.ReadOnly = true; + this.Column29.Width = 89; + // + // Column22 + // + this.Column22.DataPropertyName = "Result"; + this.Column22.HeaderText = "综合结果"; + this.Column22.MinimumWidth = 6; + this.Column22.Name = "Column22"; + this.Column22.ReadOnly = true; + this.Column22.Width = 64; + // + // Column24 + // + this.Column24.DataPropertyName = "Remark"; + this.Column24.HeaderText = "备注"; + this.Column24.MinimumWidth = 6; + this.Column24.Name = "Column24"; + this.Column24.ReadOnly = true; + this.Column24.Width = 52; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.dgvDataShow_A); + this.groupBox2.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBox2.Location = new System.Drawing.Point(3, 3); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(430, 305); + this.groupBox2.TabIndex = 1; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "电芯进站"; + // + // dgvDataShow_A + // + this.dgvDataShow_A.AllowUserToAddRows = false; + this.dgvDataShow_A.AllowUserToDeleteRows = false; + this.dgvDataShow_A.AllowUserToResizeRows = false; + this.dgvDataShow_A.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.DisplayedCells; + this.dgvDataShow_A.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.dgvDataShow_A.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dgvDataShow_A.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.None; + this.dgvDataShow_A.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None; + dataGridViewCellStyle4.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(174)))), ((int)(((byte)(219))))); + dataGridViewCellStyle4.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + dataGridViewCellStyle4.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + dataGridViewCellStyle4.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(198)))), ((int)(((byte)(247))))); + dataGridViewCellStyle4.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle4.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvDataShow_A.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle4; + this.dgvDataShow_A.ColumnHeadersHeight = 29; + this.dgvDataShow_A.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + this.dgvDataShow_A.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.Column1, + this.Column30, + this.Column2, + this.Column3, + this.Column4, + this.Column5}); + dataGridViewCellStyle5.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle5.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + dataGridViewCellStyle5.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle5.ForeColor = System.Drawing.Color.Black; + dataGridViewCellStyle5.SelectionBackColor = System.Drawing.Color.Silver; + dataGridViewCellStyle5.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle5.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvDataShow_A.DefaultCellStyle = dataGridViewCellStyle5; + this.dgvDataShow_A.Dock = System.Windows.Forms.DockStyle.Fill; + this.dgvDataShow_A.EnableHeadersVisualStyles = false; + this.dgvDataShow_A.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + this.dgvDataShow_A.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.dgvDataShow_A.Location = new System.Drawing.Point(3, 17); + this.dgvDataShow_A.Name = "dgvDataShow_A"; + this.dgvDataShow_A.ReadOnly = true; + this.dgvDataShow_A.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Sunken; + dataGridViewCellStyle6.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle6.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(174)))), ((int)(((byte)(219))))); + dataGridViewCellStyle6.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + dataGridViewCellStyle6.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + dataGridViewCellStyle6.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(198)))), ((int)(((byte)(247))))); + dataGridViewCellStyle6.SelectionForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + dataGridViewCellStyle6.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvDataShow_A.RowHeadersDefaultCellStyle = dataGridViewCellStyle6; + this.dgvDataShow_A.RowHeadersVisible = false; + this.dgvDataShow_A.RowHeadersWidth = 51; + this.dgvDataShow_A.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; + this.dgvDataShow_A.RowTemplate.Height = 23; + this.dgvDataShow_A.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgvDataShow_A.Size = new System.Drawing.Size(424, 285); + this.dgvDataShow_A.TabIndex = 1; + this.dgvDataShow_A.RowPrePaint += new System.Windows.Forms.DataGridViewRowPrePaintEventHandler(this.dgvDataShow_A_RowPrePaint); + // + // Column1 + // + this.Column1.DataPropertyName = "TD"; + this.Column1.HeaderText = "通道"; + this.Column1.MinimumWidth = 6; + this.Column1.Name = "Column1"; + this.Column1.ReadOnly = true; + this.Column1.Width = 52; + // + // Column30 + // + this.Column30.DataPropertyName = "TDGroup"; + this.Column30.HeaderText = "主道"; + this.Column30.MinimumWidth = 8; + this.Column30.Name = "Column30"; + this.Column30.ReadOnly = true; + this.Column30.Width = 52; + // + // Column2 + // + this.Column2.DataPropertyName = "BarCode"; + this.Column2.HeaderText = "入站条码"; + this.Column2.MinimumWidth = 6; + this.Column2.Name = "Column2"; + this.Column2.ReadOnly = true; + this.Column2.Width = 64; + // + // Column3 + // + this.Column3.DataPropertyName = "CreateTime"; + this.Column3.HeaderText = "时间"; + this.Column3.MinimumWidth = 6; + this.Column3.Name = "Column3"; + this.Column3.ReadOnly = true; + this.Column3.Width = 52; + // + // Column4 + // + this.Column4.DataPropertyName = "Result"; + this.Column4.HeaderText = "结果"; + this.Column4.MinimumWidth = 6; + this.Column4.Name = "Column4"; + this.Column4.ReadOnly = true; + this.Column4.Width = 52; + // + // Column5 + // + this.Column5.DataPropertyName = "Remark"; + this.Column5.HeaderText = "备注"; + this.Column5.MinimumWidth = 6; + this.Column5.Name = "Column5"; + this.Column5.ReadOnly = true; + this.Column5.Width = 52; + // + // timer_Clock + // + this.timer_Clock.Interval = 1000; + this.timer_Clock.Tick += new System.EventHandler(this.timer_Clock_Tick); + // + // tableLayoutPanel3 + // + this.tableLayoutPanel3.ColumnCount = 2; + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 77F)); + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel3.Controls.Add(this.splitContainer1, 1, 0); + this.tableLayoutPanel3.Controls.Add(this.groupBox3, 0, 0); + this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel3.Location = new System.Drawing.Point(0, 88); + this.tableLayoutPanel3.Name = "tableLayoutPanel3"; + this.tableLayoutPanel3.RowCount = 1; + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel3.Size = new System.Drawing.Size(1556, 571); + this.tableLayoutPanel3.TabIndex = 50; + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.Location = new System.Drawing.Point(80, 3); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.tableLayoutPanel2); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.groupBox1); + this.splitContainer1.Size = new System.Drawing.Size(1473, 565); + this.splitContainer1.SplitterDistance = 311; + this.splitContainer1.TabIndex = 12; + // + // tableLayoutPanel2 + // + this.tableLayoutPanel2.ColumnCount = 2; + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 436F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel2.Controls.Add(this.groupBox2, 0, 0); + this.tableLayoutPanel2.Controls.Add(this.splitContainer3, 1, 0); + this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel2.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel2.Name = "tableLayoutPanel2"; + this.tableLayoutPanel2.RowCount = 1; + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel2.Size = new System.Drawing.Size(1473, 311); + this.tableLayoutPanel2.TabIndex = 0; + // + // splitContainer3 + // + this.splitContainer3.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.splitContainer3.Location = new System.Drawing.Point(439, 3); + this.splitContainer3.Name = "splitContainer3"; + // + // splitContainer3.Panel1 + // + this.splitContainer3.Panel1.Controls.Add(this.splitContainer4); + // + // splitContainer3.Panel2 + // + this.splitContainer3.Panel2.Controls.Add(this.groupBox4); + this.splitContainer3.Size = new System.Drawing.Size(1031, 305); + this.splitContainer3.SplitterDistance = 376; + this.splitContainer3.SplitterWidth = 1; + this.splitContainer3.TabIndex = 2; + // + // splitContainer4 + // + this.splitContainer4.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer4.Location = new System.Drawing.Point(0, 0); + this.splitContainer4.Name = "splitContainer4"; + this.splitContainer4.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer4.Panel1 + // + this.splitContainer4.Panel1.Controls.Add(this.groupBox5); + // + // splitContainer4.Panel2 + // + this.splitContainer4.Panel2.Controls.Add(this.groupBox6); + this.splitContainer4.Size = new System.Drawing.Size(376, 305); + this.splitContainer4.SplitterDistance = 168; + this.splitContainer4.TabIndex = 0; + // + // groupBox5 + // + this.groupBox5.AutoSize = true; + this.groupBox5.Controls.Add(this.ckStartZNDB); + this.groupBox5.Controls.Add(this.label26); + this.groupBox5.Controls.Add(this.label23); + this.groupBox5.Controls.Add(this.label24); + this.groupBox5.Controls.Add(this.label25); + this.groupBox5.Controls.Add(this.label20); + this.groupBox5.Controls.Add(this.label21); + this.groupBox5.Controls.Add(this.label22); + this.groupBox5.Controls.Add(this.label17); + this.groupBox5.Controls.Add(this.label18); + this.groupBox5.Controls.Add(this.label19); + this.groupBox5.Controls.Add(this.label16); + this.groupBox5.Controls.Add(this.label14); + this.groupBox5.Controls.Add(this.label13); + this.groupBox5.Controls.Add(this.label15); + this.groupBox5.Controls.Add(this.txtTotalPower); + this.groupBox5.Controls.Add(this.label10); + this.groupBox5.Controls.Add(this.label11); + this.groupBox5.Controls.Add(this.label12); + this.groupBox5.Controls.Add(this.txtPowerC); + this.groupBox5.Controls.Add(this.txtPowerB); + this.groupBox5.Controls.Add(this.txtPowerA); + this.groupBox5.Controls.Add(this.label7); + this.groupBox5.Controls.Add(this.label8); + this.groupBox5.Controls.Add(this.label9); + this.groupBox5.Controls.Add(this.txtIC); + this.groupBox5.Controls.Add(this.txtIB); + this.groupBox5.Controls.Add(this.txtIA); + this.groupBox5.Controls.Add(this.label4); + this.groupBox5.Controls.Add(this.label5); + this.groupBox5.Controls.Add(this.label6); + this.groupBox5.Controls.Add(this.txtLineVolUAC); + this.groupBox5.Controls.Add(this.txtLineVolUBC); + this.groupBox5.Controls.Add(this.txtLineVolUAB); + this.groupBox5.Controls.Add(this.label3); + this.groupBox5.Controls.Add(this.label2); + this.groupBox5.Controls.Add(this.label1); + this.groupBox5.Controls.Add(this.txtPhaseVolUC); + this.groupBox5.Controls.Add(this.txtPhaseVolUB); + this.groupBox5.Controls.Add(this.txtPhaseVolUA); + this.groupBox5.Location = new System.Drawing.Point(0, 1); + this.groupBox5.Name = "groupBox5"; + this.groupBox5.Size = new System.Drawing.Size(515, 261); + this.groupBox5.TabIndex = 0; + this.groupBox5.TabStop = false; + this.groupBox5.Text = "电表数据"; + // + // ckStartZNDB + // + this.ckStartZNDB.AutoSize = true; + this.ckStartZNDB.Enabled = false; + this.ckStartZNDB.Location = new System.Drawing.Point(295, 1); + this.ckStartZNDB.Name = "ckStartZNDB"; + this.ckStartZNDB.Size = new System.Drawing.Size(144, 16); + this.ckStartZNDB.TabIndex = 41; + this.ckStartZNDB.Text = "是否开启智能电表读取"; + this.ckStartZNDB.UseVisualStyleBackColor = true; + // + // label26 + // + this.label26.AutoSize = true; + this.label26.Location = new System.Drawing.Point(199, 211); + this.label26.Name = "label26"; + this.label26.Size = new System.Drawing.Size(11, 12); + this.label26.TabIndex = 40; + this.label26.Text = "w"; + // + // label23 + // + this.label23.AutoSize = true; + this.label23.Location = new System.Drawing.Point(424, 187); + this.label23.Name = "label23"; + this.label23.Size = new System.Drawing.Size(11, 12); + this.label23.TabIndex = 39; + this.label23.Text = "w"; + // + // label24 + // + this.label24.AutoSize = true; + this.label24.Location = new System.Drawing.Point(424, 156); + this.label24.Name = "label24"; + this.label24.Size = new System.Drawing.Size(11, 12); + this.label24.TabIndex = 38; + this.label24.Text = "w"; + // + // label25 + // + this.label25.AutoSize = true; + this.label25.Location = new System.Drawing.Point(424, 124); + this.label25.Name = "label25"; + this.label25.Size = new System.Drawing.Size(11, 12); + this.label25.TabIndex = 37; + this.label25.Text = "w"; + // + // label20 + // + this.label20.AutoSize = true; + this.label20.Location = new System.Drawing.Point(199, 185); + this.label20.Name = "label20"; + this.label20.Size = new System.Drawing.Size(11, 12); + this.label20.TabIndex = 36; + this.label20.Text = "A"; + // + // label21 + // + this.label21.AutoSize = true; + this.label21.Location = new System.Drawing.Point(199, 154); + this.label21.Name = "label21"; + this.label21.Size = new System.Drawing.Size(11, 12); + this.label21.TabIndex = 35; + this.label21.Text = "A"; + // + // label22 + // + this.label22.AutoSize = true; + this.label22.Location = new System.Drawing.Point(199, 120); + this.label22.Name = "label22"; + this.label22.Size = new System.Drawing.Size(11, 12); + this.label22.TabIndex = 34; + this.label22.Text = "A"; + // + // label17 + // + this.label17.AutoSize = true; + this.label17.Location = new System.Drawing.Point(424, 96); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(11, 12); + this.label17.TabIndex = 33; + this.label17.Text = "V"; + // + // label18 + // + this.label18.AutoSize = true; + this.label18.Location = new System.Drawing.Point(424, 62); + this.label18.Name = "label18"; + this.label18.Size = new System.Drawing.Size(11, 12); + this.label18.TabIndex = 32; + this.label18.Text = "V"; + // + // label19 + // + this.label19.AutoSize = true; + this.label19.Location = new System.Drawing.Point(424, 31); + this.label19.Name = "label19"; + this.label19.Size = new System.Drawing.Size(11, 12); + this.label19.TabIndex = 31; + this.label19.Text = "V"; + // + // label16 + // + this.label16.AutoSize = true; + this.label16.Location = new System.Drawing.Point(198, 97); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(11, 12); + this.label16.TabIndex = 30; + this.label16.Text = "V"; + // + // label14 + // + this.label14.AutoSize = true; + this.label14.Location = new System.Drawing.Point(198, 62); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(11, 12); + this.label14.TabIndex = 29; + this.label14.Text = "V"; + // + // label13 + // + this.label13.AutoSize = true; + this.label13.Location = new System.Drawing.Point(198, 31); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(11, 12); + this.label13.TabIndex = 28; + this.label13.Text = "V"; + // + // label15 + // + this.label15.AutoSize = true; + this.label15.Location = new System.Drawing.Point(16, 210); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(65, 12); + this.label15.TabIndex = 27; + this.label15.Text = "总有功功率"; + // + // txtTotalPower + // + this.txtTotalPower.Enabled = false; + this.txtTotalPower.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtTotalPower.Location = new System.Drawing.Point(89, 203); + this.txtTotalPower.Name = "txtTotalPower"; + this.txtTotalPower.ReadOnly = true; + this.txtTotalPower.Size = new System.Drawing.Size(108, 23); + this.txtTotalPower.TabIndex = 24; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Location = new System.Drawing.Point(236, 180); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(71, 12); + this.label10.TabIndex = 23; + this.label10.Text = "C相有功功率"; + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Location = new System.Drawing.Point(236, 150); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(71, 12); + this.label11.TabIndex = 22; + this.label11.Text = "B相有功功率"; + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Location = new System.Drawing.Point(236, 119); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(71, 12); + this.label12.TabIndex = 21; + this.label12.Text = "A相有功功率"; + // + // txtPowerC + // + this.txtPowerC.Enabled = false; + this.txtPowerC.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtPowerC.Location = new System.Drawing.Point(314, 175); + this.txtPowerC.Name = "txtPowerC"; + this.txtPowerC.ReadOnly = true; + this.txtPowerC.Size = new System.Drawing.Size(108, 23); + this.txtPowerC.TabIndex = 20; + // + // txtPowerB + // + this.txtPowerB.Enabled = false; + this.txtPowerB.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtPowerB.Location = new System.Drawing.Point(314, 144); + this.txtPowerB.Name = "txtPowerB"; + this.txtPowerB.ReadOnly = true; + this.txtPowerB.Size = new System.Drawing.Size(108, 23); + this.txtPowerB.TabIndex = 19; + // + // txtPowerA + // + this.txtPowerA.Enabled = false; + this.txtPowerA.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtPowerA.Location = new System.Drawing.Point(314, 113); + this.txtPowerA.Name = "txtPowerA"; + this.txtPowerA.ReadOnly = true; + this.txtPowerA.Size = new System.Drawing.Size(108, 23); + this.txtPowerA.TabIndex = 18; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(16, 179); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(41, 12); + this.label7.TabIndex = 17; + this.label7.Text = "电流IC"; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(16, 148); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(41, 12); + this.label8.TabIndex = 16; + this.label8.Text = "电流IB"; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Location = new System.Drawing.Point(16, 120); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(41, 12); + this.label9.TabIndex = 15; + this.label9.Text = "电流IA"; + // + // txtIC + // + this.txtIC.Enabled = false; + this.txtIC.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtIC.Location = new System.Drawing.Point(89, 174); + this.txtIC.Name = "txtIC"; + this.txtIC.ReadOnly = true; + this.txtIC.Size = new System.Drawing.Size(108, 23); + this.txtIC.TabIndex = 14; + // + // txtIB + // + this.txtIB.Enabled = false; + this.txtIB.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtIB.Location = new System.Drawing.Point(89, 143); + this.txtIB.Name = "txtIB"; + this.txtIB.ReadOnly = true; + this.txtIB.Size = new System.Drawing.Size(108, 23); + this.txtIB.TabIndex = 13; + // + // txtIA + // + this.txtIA.Enabled = false; + this.txtIA.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtIA.Location = new System.Drawing.Point(89, 114); + this.txtIA.Name = "txtIA"; + this.txtIA.ReadOnly = true; + this.txtIA.Size = new System.Drawing.Size(108, 23); + this.txtIA.TabIndex = 12; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(236, 90); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(59, 12); + this.label4.TabIndex = 11; + this.label4.Text = "线电压UAC"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(236, 59); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(59, 12); + this.label5.TabIndex = 10; + this.label5.Text = "线电压UBC"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(236, 28); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(59, 12); + this.label6.TabIndex = 9; + this.label6.Text = "线电压UAB"; + // + // txtLineVolUAC + // + this.txtLineVolUAC.Enabled = false; + this.txtLineVolUAC.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtLineVolUAC.Location = new System.Drawing.Point(314, 84); + this.txtLineVolUAC.Name = "txtLineVolUAC"; + this.txtLineVolUAC.ReadOnly = true; + this.txtLineVolUAC.Size = new System.Drawing.Size(108, 23); + this.txtLineVolUAC.TabIndex = 8; + // + // txtLineVolUBC + // + this.txtLineVolUBC.Enabled = false; + this.txtLineVolUBC.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtLineVolUBC.Location = new System.Drawing.Point(314, 54); + this.txtLineVolUBC.Name = "txtLineVolUBC"; + this.txtLineVolUBC.ReadOnly = true; + this.txtLineVolUBC.Size = new System.Drawing.Size(108, 23); + this.txtLineVolUBC.TabIndex = 7; + // + // txtLineVolUAB + // + this.txtLineVolUAB.Enabled = false; + this.txtLineVolUAB.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtLineVolUAB.Location = new System.Drawing.Point(314, 23); + this.txtLineVolUAB.Name = "txtLineVolUAB"; + this.txtLineVolUAB.ReadOnly = true; + this.txtLineVolUAB.Size = new System.Drawing.Size(108, 23); + this.txtLineVolUAB.TabIndex = 6; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(16, 90); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(53, 12); + this.label3.TabIndex = 5; + this.label3.Text = "相电压UC"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(16, 59); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(53, 12); + this.label2.TabIndex = 4; + this.label2.Text = "相电压UB"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(16, 28); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(53, 12); + this.label1.TabIndex = 3; + this.label1.Text = "相电压UA"; + // + // txtPhaseVolUC + // + this.txtPhaseVolUC.Enabled = false; + this.txtPhaseVolUC.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtPhaseVolUC.Location = new System.Drawing.Point(89, 85); + this.txtPhaseVolUC.Name = "txtPhaseVolUC"; + this.txtPhaseVolUC.ReadOnly = true; + this.txtPhaseVolUC.Size = new System.Drawing.Size(108, 23); + this.txtPhaseVolUC.TabIndex = 2; + // + // txtPhaseVolUB + // + this.txtPhaseVolUB.Enabled = false; + this.txtPhaseVolUB.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtPhaseVolUB.Location = new System.Drawing.Point(89, 54); + this.txtPhaseVolUB.Name = "txtPhaseVolUB"; + this.txtPhaseVolUB.ReadOnly = true; + this.txtPhaseVolUB.Size = new System.Drawing.Size(108, 23); + this.txtPhaseVolUB.TabIndex = 1; + // + // txtPhaseVolUA + // + this.txtPhaseVolUA.Enabled = false; + this.txtPhaseVolUA.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtPhaseVolUA.Location = new System.Drawing.Point(89, 23); + this.txtPhaseVolUA.Name = "txtPhaseVolUA"; + this.txtPhaseVolUA.ReadOnly = true; + this.txtPhaseVolUA.Size = new System.Drawing.Size(108, 23); + this.txtPhaseVolUA.TabIndex = 0; + // + // groupBox6 + // + this.groupBox6.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBox6.AutoSize = true; + this.groupBox6.Controls.Add(this.txtTensionStrapCCD4); + this.groupBox6.Controls.Add(this.txtgrading4); + this.groupBox6.Controls.Add(this.metroLabel13); + this.groupBox6.Controls.Add(this.txtTensionStrapCCD3); + this.groupBox6.Controls.Add(this.txtgrading3); + this.groupBox6.Controls.Add(this.metroLabel7); + this.groupBox6.Controls.Add(this.txtTensionStrapCCD2); + this.groupBox6.Controls.Add(this.txtgrading2); + this.groupBox6.Controls.Add(this.metroLabel6); + this.groupBox6.Controls.Add(this.txtgrading1); + this.groupBox6.Controls.Add(this.txtTensionStrapCCD1); + this.groupBox6.Controls.Add(this.metroLabel5); + this.groupBox6.Controls.Add(this.chkStartNGFL); + this.groupBox6.Controls.Add(this.txtTensionStrap3); + this.groupBox6.Controls.Add(this.metroLabel1); + this.groupBox6.Controls.Add(this.metroLabel36); + this.groupBox6.Controls.Add(this.metroLabel35); + this.groupBox6.Controls.Add(this.metroLabel34); + this.groupBox6.Controls.Add(this.txtTensionStrap2); + this.groupBox6.Controls.Add(this.chkIsGarding); + this.groupBox6.Controls.Add(this.metroLabel38); + this.groupBox6.Controls.Add(this.txtTensionStrap1); + this.groupBox6.Controls.Add(this.metroLabel37); + this.groupBox6.Controls.Add(this.metroLabel33); + this.groupBox6.Location = new System.Drawing.Point(0, 6); + this.groupBox6.Name = "groupBox6"; + this.groupBox6.Size = new System.Drawing.Size(564, 194); + this.groupBox6.TabIndex = 0; + this.groupBox6.TabStop = false; + this.groupBox6.Text = "档位拉带参数"; + // + // txtTensionStrapCCD4 + // + this.txtTensionStrapCCD4.Enabled = false; + this.txtTensionStrapCCD4.Location = new System.Drawing.Point(173, 129); + this.txtTensionStrapCCD4.Name = "txtTensionStrapCCD4"; + this.txtTensionStrapCCD4.Size = new System.Drawing.Size(58, 21); + this.txtTensionStrapCCD4.TabIndex = 157; + // + // txtgrading4 + // + this.txtgrading4.Enabled = false; + this.txtgrading4.Location = new System.Drawing.Point(109, 129); + this.txtgrading4.Name = "txtgrading4"; + this.txtgrading4.Size = new System.Drawing.Size(58, 21); + this.txtgrading4.TabIndex = 141; + // + // metroLabel13 + // + this.metroLabel13.AutoSize = true; + this.metroLabel13.Location = new System.Drawing.Point(163, 131); + this.metroLabel13.Name = "metroLabel13"; + this.metroLabel13.Size = new System.Drawing.Size(15, 19); + this.metroLabel13.TabIndex = 158; + this.metroLabel13.Text = "-"; + // + // txtTensionStrapCCD3 + // + this.txtTensionStrapCCD3.Enabled = false; + this.txtTensionStrapCCD3.Location = new System.Drawing.Point(173, 94); + this.txtTensionStrapCCD3.Name = "txtTensionStrapCCD3"; + this.txtTensionStrapCCD3.Size = new System.Drawing.Size(58, 21); + this.txtTensionStrapCCD3.TabIndex = 156; + // + // txtgrading3 + // + this.txtgrading3.Enabled = false; + this.txtgrading3.Location = new System.Drawing.Point(109, 94); + this.txtgrading3.Name = "txtgrading3"; + this.txtgrading3.Size = new System.Drawing.Size(58, 21); + this.txtgrading3.TabIndex = 142; + // + // metroLabel7 + // + this.metroLabel7.AutoSize = true; + this.metroLabel7.Location = new System.Drawing.Point(163, 91); + this.metroLabel7.Name = "metroLabel7"; + this.metroLabel7.Size = new System.Drawing.Size(15, 19); + this.metroLabel7.TabIndex = 155; + this.metroLabel7.Text = "-"; + // + // txtTensionStrapCCD2 + // + this.txtTensionStrapCCD2.Enabled = false; + this.txtTensionStrapCCD2.Location = new System.Drawing.Point(173, 62); + this.txtTensionStrapCCD2.Name = "txtTensionStrapCCD2"; + this.txtTensionStrapCCD2.Size = new System.Drawing.Size(58, 21); + this.txtTensionStrapCCD2.TabIndex = 154; + // + // txtgrading2 + // + this.txtgrading2.Enabled = false; + this.txtgrading2.Location = new System.Drawing.Point(109, 62); + this.txtgrading2.Name = "txtgrading2"; + this.txtgrading2.Size = new System.Drawing.Size(58, 21); + this.txtgrading2.TabIndex = 143; + // + // metroLabel6 + // + this.metroLabel6.AutoSize = true; + this.metroLabel6.Location = new System.Drawing.Point(163, 62); + this.metroLabel6.Name = "metroLabel6"; + this.metroLabel6.Size = new System.Drawing.Size(15, 19); + this.metroLabel6.TabIndex = 153; + this.metroLabel6.Text = "-"; + // + // txtgrading1 + // + this.txtgrading1.Enabled = false; + this.txtgrading1.Location = new System.Drawing.Point(109, 28); + this.txtgrading1.Name = "txtgrading1"; + this.txtgrading1.Size = new System.Drawing.Size(58, 21); + this.txtgrading1.TabIndex = 146; + // + // txtTensionStrapCCD1 + // + this.txtTensionStrapCCD1.Enabled = false; + this.txtTensionStrapCCD1.Location = new System.Drawing.Point(173, 28); + this.txtTensionStrapCCD1.Name = "txtTensionStrapCCD1"; + this.txtTensionStrapCCD1.Size = new System.Drawing.Size(58, 21); + this.txtTensionStrapCCD1.TabIndex = 152; + // + // metroLabel5 + // + this.metroLabel5.AutoSize = true; + this.metroLabel5.Location = new System.Drawing.Point(163, 28); + this.metroLabel5.Name = "metroLabel5"; + this.metroLabel5.Size = new System.Drawing.Size(15, 19); + this.metroLabel5.TabIndex = 151; + this.metroLabel5.Text = "-"; + // + // chkStartNGFL + // + this.chkStartNGFL.AutoSize = true; + this.chkStartNGFL.Enabled = false; + this.chkStartNGFL.Location = new System.Drawing.Point(377, 134); + this.chkStartNGFL.Name = "chkStartNGFL"; + this.chkStartNGFL.Size = new System.Drawing.Size(120, 16); + this.chkStartNGFL.TabIndex = 150; + this.chkStartNGFL.Text = "NG电池不分类排出"; + this.chkStartNGFL.UseVisualStyleBackColor = true; + // + // txtTensionStrap3 + // + this.txtTensionStrap3.Enabled = false; + this.txtTensionStrap3.Location = new System.Drawing.Point(367, 96); + this.txtTensionStrap3.Name = "txtTensionStrap3"; + this.txtTensionStrap3.Size = new System.Drawing.Size(92, 21); + this.txtTensionStrap3.TabIndex = 149; + // + // metroLabel1 + // + this.metroLabel1.AutoSize = true; + this.metroLabel1.Location = new System.Drawing.Point(290, 96); + this.metroLabel1.Name = "metroLabel1"; + this.metroLabel1.Size = new System.Drawing.Size(85, 19); + this.metroLabel1.TabIndex = 148; + this.metroLabel1.Text = "NG拉带(7):"; + // + // metroLabel36 + // + this.metroLabel36.AutoSize = true; + this.metroLabel36.Location = new System.Drawing.Point(34, 129); + this.metroLabel36.Name = "metroLabel36"; + this.metroLabel36.Size = new System.Drawing.Size(84, 19); + this.metroLabel36.TabIndex = 134; + this.metroLabel36.Text = "OK拉带(4):"; + // + // metroLabel35 + // + this.metroLabel35.AutoSize = true; + this.metroLabel35.Location = new System.Drawing.Point(34, 97); + this.metroLabel35.Name = "metroLabel35"; + this.metroLabel35.Size = new System.Drawing.Size(84, 19); + this.metroLabel35.TabIndex = 135; + this.metroLabel35.Text = "OK拉带(3):"; + // + // metroLabel34 + // + this.metroLabel34.AutoSize = true; + this.metroLabel34.Location = new System.Drawing.Point(34, 62); + this.metroLabel34.Name = "metroLabel34"; + this.metroLabel34.Size = new System.Drawing.Size(84, 19); + this.metroLabel34.TabIndex = 136; + this.metroLabel34.Text = "OK拉带(2):"; + // + // txtTensionStrap2 + // + this.txtTensionStrap2.Enabled = false; + this.txtTensionStrap2.Location = new System.Drawing.Point(368, 62); + this.txtTensionStrap2.Name = "txtTensionStrap2"; + this.txtTensionStrap2.Size = new System.Drawing.Size(92, 21); + this.txtTensionStrap2.TabIndex = 144; + // + // chkIsGarding + // + this.chkIsGarding.AutoSize = true; + this.chkIsGarding.Enabled = false; + this.chkIsGarding.Location = new System.Drawing.Point(243, 134); + this.chkIsGarding.Name = "chkIsGarding"; + this.chkIsGarding.Size = new System.Drawing.Size(132, 16); + this.chkIsGarding.TabIndex = 147; + this.chkIsGarding.Text = "是否开启上位机分档"; + this.chkIsGarding.UseVisualStyleBackColor = true; + // + // metroLabel38 + // + this.metroLabel38.AutoSize = true; + this.metroLabel38.Location = new System.Drawing.Point(290, 62); + this.metroLabel38.Name = "metroLabel38"; + this.metroLabel38.Size = new System.Drawing.Size(85, 19); + this.metroLabel38.TabIndex = 138; + this.metroLabel38.Text = "NG拉带(6):"; + // + // txtTensionStrap1 + // + this.txtTensionStrap1.Enabled = false; + this.txtTensionStrap1.Location = new System.Drawing.Point(368, 28); + this.txtTensionStrap1.Name = "txtTensionStrap1"; + this.txtTensionStrap1.Size = new System.Drawing.Size(92, 21); + this.txtTensionStrap1.TabIndex = 145; + // + // metroLabel37 + // + this.metroLabel37.AutoSize = true; + this.metroLabel37.Location = new System.Drawing.Point(290, 28); + this.metroLabel37.Name = "metroLabel37"; + this.metroLabel37.Size = new System.Drawing.Size(85, 19); + this.metroLabel37.TabIndex = 139; + this.metroLabel37.Text = "NG拉带(5):"; + // + // metroLabel33 + // + this.metroLabel33.AutoSize = true; + this.metroLabel33.Location = new System.Drawing.Point(34, 28); + this.metroLabel33.Name = "metroLabel33"; + this.metroLabel33.Size = new System.Drawing.Size(82, 19); + this.metroLabel33.TabIndex = 140; + this.metroLabel33.Text = "OK拉带(1):"; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.splitContainer2); + this.groupBox4.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBox4.Location = new System.Drawing.Point(0, 0); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Size = new System.Drawing.Size(654, 305); + this.groupBox4.TabIndex = 2; + this.groupBox4.TabStop = false; + this.groupBox4.Text = "电池外观检测面定义"; + // + // splitContainer2 + // + this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer2.Location = new System.Drawing.Point(3, 17); + this.splitContainer2.Name = "splitContainer2"; + // + // splitContainer2.Panel1 + // + this.splitContainer2.Panel1.Controls.Add(this.pictureBox2); + // + // splitContainer2.Panel2 + // + this.splitContainer2.Panel2.Controls.Add(this.pictureBox3); + this.splitContainer2.Size = new System.Drawing.Size(648, 285); + this.splitContainer2.SplitterDistance = 322; + this.splitContainer2.SplitterWidth = 3; + this.splitContainer2.TabIndex = 0; + this.splitContainer2.TabStop = false; + // + // pictureBox2 + // + this.pictureBox2.Dock = System.Windows.Forms.DockStyle.Fill; + this.pictureBox2.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox2.Image"))); + this.pictureBox2.Location = new System.Drawing.Point(0, 0); + this.pictureBox2.Name = "pictureBox2"; + this.pictureBox2.Size = new System.Drawing.Size(322, 285); + this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox2.TabIndex = 2; + this.pictureBox2.TabStop = false; + // + // pictureBox3 + // + this.pictureBox3.Dock = System.Windows.Forms.DockStyle.Fill; + this.pictureBox3.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox3.Image"))); + this.pictureBox3.Location = new System.Drawing.Point(0, 0); + this.pictureBox3.Name = "pictureBox3"; + this.pictureBox3.Size = new System.Drawing.Size(323, 285); + this.pictureBox3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox3.TabIndex = 3; + this.pictureBox3.TabStop = false; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.tableLayoutPanel4); + this.groupBox3.Location = new System.Drawing.Point(3, 3); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(71, 556); + this.groupBox3.TabIndex = 11; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "设备状态"; + // + // tableLayoutPanel4 + // + this.tableLayoutPanel4.ColumnCount = 1; + this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel4.Controls.Add(this.metroLabel2, 0, 15); + this.tableLayoutPanel4.Controls.Add(this.btn_YJJJ, 0, 14); + this.tableLayoutPanel4.Controls.Add(this.cvOKQty, 0, 10); + this.tableLayoutPanel4.Controls.Add(this.prYield, 0, 12); + this.tableLayoutPanel4.Controls.Add(this.RPimpacting, 0, 4); + this.tableLayoutPanel4.Controls.Add(this.metroLabel8, 0, 13); + this.tableLayoutPanel4.Controls.Add(this.metroLabel9, 0, 7); + this.tableLayoutPanel4.Controls.Add(this.metroLabel10, 0, 11); + this.tableLayoutPanel4.Controls.Add(this.metroLabel11, 0, 9); + this.tableLayoutPanel4.Controls.Add(this.RPPPM, 0, 6); + this.tableLayoutPanel4.Controls.Add(this.metroLabel12, 0, 3); + this.tableLayoutPanel4.Controls.Add(this.crToalQty, 0, 8); + this.tableLayoutPanel4.Controls.Add(this.lblLinkPLCState, 0, 2); + this.tableLayoutPanel4.Controls.Add(this.lblMsg, 0, 1); + this.tableLayoutPanel4.Controls.Add(this.btnStart, 0, 0); + this.tableLayoutPanel4.Controls.Add(this.metroLabel14, 0, 5); + this.tableLayoutPanel4.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel4.Location = new System.Drawing.Point(3, 17); + this.tableLayoutPanel4.Name = "tableLayoutPanel4"; + this.tableLayoutPanel4.RowCount = 17; + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 66F)); + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 21F)); + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 63F)); + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 18F)); + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 69F)); + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 18F)); + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 64F)); + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F)); + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 64F)); + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 21F)); + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 64F)); + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 24F)); + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 64F)); + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 21F)); + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 64F)); + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 19F)); + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 62F)); + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel4.Size = new System.Drawing.Size(65, 536); + this.tableLayoutPanel4.TabIndex = 5; + // + // metroLabel2 + // + this.metroLabel2.AutoSize = true; + this.metroLabel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.metroLabel2.FontSize = MetroFramework.MetroLabelSize.Small; + this.metroLabel2.FontWeight = MetroFramework.MetroLabelWeight.Regular; + this.metroLabel2.Location = new System.Drawing.Point(3, 664); + this.metroLabel2.Name = "metroLabel2"; + this.metroLabel2.Size = new System.Drawing.Size(59, 19); + this.metroLabel2.TabIndex = 29; + this.metroLabel2.Text = "一键降级"; + this.metroLabel2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // btn_YJJJ + // + this.btn_YJJJ.Dock = System.Windows.Forms.DockStyle.Fill; + this.btn_YJJJ.Image = ((System.Drawing.Image)(resources.GetObject("btn_YJJJ.Image"))); + this.btn_YJJJ.Location = new System.Drawing.Point(3, 603); + this.btn_YJJJ.Name = "btn_YJJJ"; + this.btn_YJJJ.Size = new System.Drawing.Size(59, 58); + this.btn_YJJJ.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.btn_YJJJ.TabIndex = 28; + this.btn_YJJJ.TabStop = false; + this.btn_YJJJ.Click += new System.EventHandler(this.btn_YJJJ_Click); + // + // cvOKQty + // + this.cvOKQty.BgColor = System.Drawing.Color.Green; + this.cvOKQty.BorderWidth = 5; + this.cvOKQty.CountValue = 500000; + this.cvOKQty.Dock = System.Windows.Forms.DockStyle.Fill; + this.cvOKQty.Location = new System.Drawing.Point(0, 427); + this.cvOKQty.Margin = new System.Windows.Forms.Padding(0); + this.cvOKQty.Name = "cvOKQty"; + this.cvOKQty.SectorColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(179)))), ((int)(((byte)(63))))); + this.cvOKQty.Size = new System.Drawing.Size(65, 64); + this.cvOKQty.TabIndex = 24; + this.cvOKQty.Text = "circleCountValue2"; + // + // prYield + // + this.prYield.ArcAnnulusBackColor = System.Drawing.Color.Empty; + this.prYield.ArcBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(112)))), ((int)(((byte)(0)))), ((int)(((byte)(128)))), ((int)(((byte)(0))))); + this.prYield.ArcRadius = 32; + this.prYield.ArcRound = true; + this.prYield.ArcThickness = 6; + this.prYield.Dock = System.Windows.Forms.DockStyle.Fill; + this.prYield.Location = new System.Drawing.Point(1, 516); + this.prYield.Margin = new System.Windows.Forms.Padding(1); + this.prYield.Name = "prYield"; + this.prYield.Size = new System.Drawing.Size(63, 62); + this.prYield.TabIndex = 0; + this.prYield.TabStop = false; + this.prYield.Type = WinformControlLibraryExtension.PercentageProgressExt.PercentageType.Arc; + this.prYield.Value = 0.23F; + this.prYield.ValueColor = System.Drawing.Color.FromArgb(((int)(((byte)(227)))), ((int)(((byte)(0)))), ((int)(((byte)(128)))), ((int)(((byte)(0))))); + this.prYield.ValueFont = new System.Drawing.Font("楷体", 9F); + // + // RPimpacting + // + this.RPimpacting.ArcAnnulusBackColor = System.Drawing.Color.Empty; + this.RPimpacting.ArcBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(112)))), ((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(128))))); + this.RPimpacting.ArcRadius = 32; + this.RPimpacting.ArcRound = true; + this.RPimpacting.ArcThickness = 6; + this.RPimpacting.Dock = System.Windows.Forms.DockStyle.Fill; + this.RPimpacting.Location = new System.Drawing.Point(1, 169); + this.RPimpacting.Margin = new System.Windows.Forms.Padding(1); + this.RPimpacting.Name = "RPimpacting"; + this.RPimpacting.Size = new System.Drawing.Size(63, 67); + this.RPimpacting.TabIndex = 0; + this.RPimpacting.TabStop = false; + this.RPimpacting.Type = WinformControlLibraryExtension.PercentageProgressExt.PercentageType.Arc; + this.RPimpacting.Value = 0.23F; + this.RPimpacting.ValueColor = System.Drawing.Color.FromArgb(((int)(((byte)(227)))), ((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0))))); + this.RPimpacting.ValueFont = new System.Drawing.Font("楷体", 9F); + // + // metroLabel8 + // + this.metroLabel8.AutoSize = true; + this.metroLabel8.Dock = System.Windows.Forms.DockStyle.Fill; + this.metroLabel8.FontSize = MetroFramework.MetroLabelSize.Small; + this.metroLabel8.FontWeight = MetroFramework.MetroLabelWeight.Regular; + this.metroLabel8.Location = new System.Drawing.Point(3, 579); + this.metroLabel8.Name = "metroLabel8"; + this.metroLabel8.Size = new System.Drawing.Size(59, 21); + this.metroLabel8.TabIndex = 20; + this.metroLabel8.Text = "良率"; + this.metroLabel8.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // metroLabel9 + // + this.metroLabel9.AutoSize = true; + this.metroLabel9.Dock = System.Windows.Forms.DockStyle.Fill; + this.metroLabel9.FontWeight = MetroFramework.MetroLabelWeight.Regular; + this.metroLabel9.Location = new System.Drawing.Point(3, 319); + this.metroLabel9.Name = "metroLabel9"; + this.metroLabel9.Size = new System.Drawing.Size(59, 23); + this.metroLabel9.TabIndex = 15; + this.metroLabel9.Text = "PPM"; + this.metroLabel9.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // metroLabel10 + // + this.metroLabel10.AutoSize = true; + this.metroLabel10.Dock = System.Windows.Forms.DockStyle.Fill; + this.metroLabel10.FontSize = MetroFramework.MetroLabelSize.Small; + this.metroLabel10.FontWeight = MetroFramework.MetroLabelWeight.Regular; + this.metroLabel10.Location = new System.Drawing.Point(3, 491); + this.metroLabel10.Name = "metroLabel10"; + this.metroLabel10.Size = new System.Drawing.Size(59, 24); + this.metroLabel10.TabIndex = 21; + this.metroLabel10.Text = "良品数"; + this.metroLabel10.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // metroLabel11 + // + this.metroLabel11.AutoSize = true; + this.metroLabel11.Dock = System.Windows.Forms.DockStyle.Fill; + this.metroLabel11.FontSize = MetroFramework.MetroLabelSize.Small; + this.metroLabel11.FontWeight = MetroFramework.MetroLabelWeight.Regular; + this.metroLabel11.Location = new System.Drawing.Point(3, 406); + this.metroLabel11.Name = "metroLabel11"; + this.metroLabel11.Size = new System.Drawing.Size(59, 21); + this.metroLabel11.TabIndex = 20; + this.metroLabel11.Text = "投入数"; + this.metroLabel11.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // RPPPM + // + this.RPPPM.BgColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(192)))), ((int)(((byte)(0))))); + this.RPPPM.BorderWidth = 5; + this.RPPPM.Dock = System.Windows.Forms.DockStyle.Fill; + this.RPPPM.Font = new System.Drawing.Font("楷体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.RPPPM.Location = new System.Drawing.Point(0, 255); + this.RPPPM.Margin = new System.Windows.Forms.Padding(0); + this.RPPPM.Name = "RPPPM"; + this.RPPPM.Progress = 1000; + this.RPPPM.SectorColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(179)))), ((int)(((byte)(63))))); + this.RPPPM.Size = new System.Drawing.Size(65, 64); + this.RPPPM.TabIndex = 2; + this.RPPPM.Text = "circleProgramBar1"; + // + // metroLabel12 + // + this.metroLabel12.AutoSize = true; + this.metroLabel12.Dock = System.Windows.Forms.DockStyle.Fill; + this.metroLabel12.FontSize = MetroFramework.MetroLabelSize.Small; + this.metroLabel12.FontWeight = MetroFramework.MetroLabelWeight.Regular; + this.metroLabel12.Location = new System.Drawing.Point(3, 150); + this.metroLabel12.Name = "metroLabel12"; + this.metroLabel12.Size = new System.Drawing.Size(59, 18); + this.metroLabel12.TabIndex = 7; + this.metroLabel12.Text = "PLC状态"; + this.metroLabel12.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // crToalQty + // + this.crToalQty.BgColor = System.Drawing.Color.Green; + this.crToalQty.BorderWidth = 5; + this.crToalQty.CountValue = 100000; + this.crToalQty.Dock = System.Windows.Forms.DockStyle.Fill; + this.crToalQty.Location = new System.Drawing.Point(0, 342); + this.crToalQty.Margin = new System.Windows.Forms.Padding(0); + this.crToalQty.Name = "crToalQty"; + this.crToalQty.SectorColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0))))); + this.crToalQty.Size = new System.Drawing.Size(65, 64); + this.crToalQty.TabIndex = 2; + this.crToalQty.Text = "circleCountValue1"; + // + // lblLinkPLCState + // + this.lblLinkPLCState.BorderWidth = 4; + this.lblLinkPLCState.CenterColor = System.Drawing.Color.White; + this.lblLinkPLCState.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblLinkPLCState.FlashInterval = 500; + this.lblLinkPLCState.GapWidth = 5; + this.lblLinkPLCState.IsBorder = true; + this.lblLinkPLCState.IsFlash = false; + this.lblLinkPLCState.IsHighLight = true; + this.lblLinkPLCState.LampColor = new System.Drawing.Color[] { + System.Drawing.Color.Green, + System.Drawing.Color.Yellow}; + this.lblLinkPLCState.LedColor = System.Drawing.Color.Green; + this.lblLinkPLCState.LedFalseColor = System.Drawing.Color.Red; + this.lblLinkPLCState.LedStatus = false; + this.lblLinkPLCState.LedTrueColor = System.Drawing.Color.Green; + this.lblLinkPLCState.Location = new System.Drawing.Point(0, 87); + this.lblLinkPLCState.Margin = new System.Windows.Forms.Padding(0); + this.lblLinkPLCState.Name = "lblLinkPLCState"; + this.lblLinkPLCState.Size = new System.Drawing.Size(65, 63); + this.lblLinkPLCState.TabIndex = 16; + // + // lblMsg + // + this.lblMsg.AutoSize = true; + this.lblMsg.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblMsg.FontSize = MetroFramework.MetroLabelSize.Small; + this.lblMsg.FontWeight = MetroFramework.MetroLabelWeight.Regular; + this.lblMsg.Location = new System.Drawing.Point(3, 66); + this.lblMsg.Name = "lblMsg"; + this.lblMsg.Size = new System.Drawing.Size(59, 21); + this.lblMsg.TabIndex = 18; + this.lblMsg.Text = "开启联机"; + this.lblMsg.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // btnStart + // + this.btnStart.ButtonCenterColorEnd = System.Drawing.Color.Red; + this.btnStart.ButtonCenterColorStart = System.Drawing.Color.Coral; + this.btnStart.DistanceToBorder = 4; + this.btnStart.Dock = System.Windows.Forms.DockStyle.Fill; + this.btnStart.IsShowIcon = false; + this.btnStart.Location = new System.Drawing.Point(0, 0); + this.btnStart.Margin = new System.Windows.Forms.Padding(0); + this.btnStart.Name = "btnStart"; + this.btnStart.Size = new System.Drawing.Size(65, 66); + this.btnStart.TabIndex = 2; + this.btnStart.Text = "roundButton1"; + this.btnStart.UseVisualStyleBackColor = true; + this.btnStart.Click += new System.EventHandler(this.btStart_Click); + // + // metroLabel14 + // + this.metroLabel14.AutoSize = true; + this.metroLabel14.Dock = System.Windows.Forms.DockStyle.Fill; + this.metroLabel14.FontSize = MetroFramework.MetroLabelSize.Small; + this.metroLabel14.FontWeight = MetroFramework.MetroLabelWeight.Regular; + this.metroLabel14.Location = new System.Drawing.Point(3, 237); + this.metroLabel14.Name = "metroLabel14"; + this.metroLabel14.Size = new System.Drawing.Size(59, 18); + this.metroLabel14.TabIndex = 13; + this.metroLabel14.Text = "稼动率"; + this.metroLabel14.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // timer1 + // + this.timer1.Enabled = true; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(1245, 25); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(115, 32); + this.button1.TabIndex = 51; + this.button1.Text = "MEStest"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Visible = false; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // contextMenuStrip1 + // + this.contextMenuStrip1.ImageScalingSize = new System.Drawing.Size(24, 24); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(61, 4); + // + // HomeForm + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.ClientSize = new System.Drawing.Size(1556, 884); + this.Controls.Add(this.button1); + this.Controls.Add(this.panel2); + this.Controls.Add(this.tableLayoutPanel3); + this.Controls.Add(this.panel3); + this.Controls.Add(this.statusStrip1); + this.Controls.Add(this.menuStrip1); + this.HelpButton = true; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MainMenuStrip = this.menuStrip1; + this.Name = "HomeForm"; + this.Padding = new System.Windows.Forms.Padding(0, 60, 0, 0); + this.Text = "电芯外观检测系统"; + this.WindowState = System.Windows.Forms.FormWindowState.Maximized; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.HomeForm_FormClosing); + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.HomeForm_FormClosed); + this.Load += new System.EventHandler(this.HomeForm_Load); + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + this.panel2.ResumeLayout(false); + this.panel2.PerformLayout(); + this.statusStrip1.ResumeLayout(false); + this.statusStrip1.PerformLayout(); + this.panel3.ResumeLayout(false); + this.groupBox1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dgvDataShow_B)).EndInit(); + this.groupBox2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dgvDataShow_A)).EndInit(); + this.tableLayoutPanel3.ResumeLayout(false); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.tableLayoutPanel2.ResumeLayout(false); + this.splitContainer3.Panel1.ResumeLayout(false); + this.splitContainer3.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer3)).EndInit(); + this.splitContainer3.ResumeLayout(false); + this.splitContainer4.Panel1.ResumeLayout(false); + this.splitContainer4.Panel1.PerformLayout(); + this.splitContainer4.Panel2.ResumeLayout(false); + this.splitContainer4.Panel2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer4)).EndInit(); + this.splitContainer4.ResumeLayout(false); + this.groupBox5.ResumeLayout(false); + this.groupBox5.PerformLayout(); + this.groupBox6.ResumeLayout(false); + this.groupBox6.PerformLayout(); + this.groupBox4.ResumeLayout(false); + this.splitContainer2.Panel1.ResumeLayout(false); + this.splitContainer2.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit(); + this.splitContainer2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); + this.groupBox3.ResumeLayout(false); + this.tableLayoutPanel4.ResumeLayout(false); + this.tableLayoutPanel4.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.btn_YJJJ)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem tsmiLogin; + private System.Windows.Forms.ToolStripMenuItem tsmiParaConfig; + private System.Windows.Forms.ToolStripMenuItem tsmiSetting; + private System.Windows.Forms.ToolStripMenuItem tsmiAbout; + private MetroFramework.Controls.MetroLabel lblUser; + private MetroFramework.Controls.MetroLabel metroLabel3; + private MetroFramework.Controls.MetroLabel metroLabel4; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.StatusStrip statusStrip1; + private System.Windows.Forms.ToolStripMenuItem tsmiSearch; + private System.Windows.Forms.ToolStripMenuItem tsmiChangeModel; + private System.Windows.Forms.ToolStripMenuItem tsmiPLCConfig; + private System.Windows.Forms.ToolStripMenuItem tsmiDBConfig; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.ToolStripMenuItem tsmiUserConfig; + private System.Windows.Forms.ToolStripMenuItem tsmiChart; + private System.Windows.Forms.ToolStripMenuItem tsmiSerialPortConfig; + private System.Windows.Forms.ImageList imageList1; + private System.Windows.Forms.GroupBox txtlog; + private System.Windows.Forms.ToolStripMenuItem tsmiMESConfig; + private MetroFramework.Controls.MetroLabel metroLabel31; + private MetroFramework.Controls.MetroLabel lblAuthority; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel7; + private System.Windows.Forms.Timer timer_Clock; + private System.Windows.Forms.ToolStripMenuItem tsmiHistory; + private System.Windows.Forms.ToolStripMenuItem tsmiAlarmSearch; + private System.Windows.Forms.GroupBox groupBox1; + private GridViewBuff dgvDataShow_B; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3; + private System.Windows.Forms.GroupBox groupBox3; + + private MetroFramework.Controls.MetroLabel timelabel; + private System.Windows.Forms.ToolStripStatusLabel txtTcpClicet; + private System.Windows.Forms.ToolStripMenuItem tsmiCCDData; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1; + private System.Windows.Forms.ToolStripStatusLabel txtsiteCode; + private System.Windows.Forms.SplitContainer splitContainer1; + private GridViewBuff dgvDataShow_A; + private System.Windows.Forms.Timer timer1; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2; + private System.Windows.Forms.PictureBox pictureBox3; + private System.Windows.Forms.PictureBox pictureBox2; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.SplitContainer splitContainer2; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem mES测试ToolStripMenuItem; + private System.Windows.Forms.SplitContainer splitContainer3; + private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.TextBox txtPhaseVolUA; + private System.Windows.Forms.TextBox txtPhaseVolUC; + private System.Windows.Forms.TextBox txtPhaseVolUB; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox txtLineVolUAC; + private System.Windows.Forms.TextBox txtLineVolUBC; + private System.Windows.Forms.TextBox txtLineVolUAB; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.TextBox txtPowerC; + private System.Windows.Forms.TextBox txtPowerB; + private System.Windows.Forms.TextBox txtPowerA; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.TextBox txtIC; + private System.Windows.Forms.TextBox txtIB; + private System.Windows.Forms.TextBox txtIA; + private System.Windows.Forms.Label label26; + private System.Windows.Forms.Label label23; + private System.Windows.Forms.Label label24; + private System.Windows.Forms.Label label25; + private System.Windows.Forms.Label label20; + private System.Windows.Forms.Label label21; + private System.Windows.Forms.Label label22; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.Label label19; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.TextBox txtTotalPower; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel4; + private MetroFramework.Controls.MetroLabel metroLabel8; + private MetroFramework.Controls.MetroLabel metroLabel9; + private MetroFramework.Controls.MetroLabel metroLabel10; + private MetroFramework.Controls.MetroLabel metroLabel11; + private JYControl.CircleProgramBar RPPPM; + private MetroFramework.Controls.MetroLabel metroLabel12; + private JYControl.CircleCountValue crToalQty; + private JYControl.LedControl lblLinkPLCState; + private MetroFramework.Controls.MetroLabel lblMsg; + private JYControl.RoundButton btnStart; + private MetroFramework.Controls.MetroLabel metroLabel14; + private WinformControlLibraryExtension.PercentageProgressExt prYield; + private WinformControlLibraryExtension.PercentageProgressExt RPimpacting; + private JYControl.CircleCountValue cvOKQty; + private System.Windows.Forms.CheckBox ckStartZNDB; + private System.Windows.Forms.ToolStripMenuItem tsmiAbnormalVoice; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel2; + private System.Windows.Forms.ToolStripStatusLabel txtlineCode; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel4; + private System.Windows.Forms.ToolStripStatusLabel txtequipCode; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel6; + private System.Windows.Forms.ToolStripStatusLabel txtmaterialCode; + private System.Windows.Forms.ToolStripMenuItem mES分档设置ToolStripMenuItem; + private System.Windows.Forms.SplitContainer splitContainer4; + private System.Windows.Forms.GroupBox groupBox6; + private System.Windows.Forms.TextBox txtTensionStrap3; + private MetroFramework.Controls.MetroLabel metroLabel1; + private System.Windows.Forms.TextBox txtgrading4; + private MetroFramework.Controls.MetroLabel metroLabel36; + private System.Windows.Forms.TextBox txtgrading3; + private MetroFramework.Controls.MetroLabel metroLabel35; + private System.Windows.Forms.TextBox txtgrading2; + private MetroFramework.Controls.MetroLabel metroLabel34; + private System.Windows.Forms.TextBox txtTensionStrap2; + private System.Windows.Forms.CheckBox chkIsGarding; + private MetroFramework.Controls.MetroLabel metroLabel38; + private System.Windows.Forms.TextBox txtTensionStrap1; + private MetroFramework.Controls.MetroLabel metroLabel37; + private System.Windows.Forms.TextBox txtgrading1; + private MetroFramework.Controls.MetroLabel metroLabel33; + private System.ComponentModel.BackgroundWorker backgroundWorker1; + private System.Windows.Forms.CheckBox chkStartNGFL; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel3; + private System.Windows.Forms.ToolStripStatusLabel txtClassShift; + private MetroFramework.Controls.MetroLabel metroLabel2; + private System.Windows.Forms.PictureBox btn_YJJJ; + private System.Windows.Forms.DataGridViewTextBoxColumn Column1; + private System.Windows.Forms.DataGridViewTextBoxColumn Column30; + private System.Windows.Forms.DataGridViewTextBoxColumn Column2; + private System.Windows.Forms.DataGridViewTextBoxColumn Column3; + private System.Windows.Forms.DataGridViewTextBoxColumn Column4; + private System.Windows.Forms.DataGridViewTextBoxColumn Column5; + private System.Windows.Forms.DataGridViewTextBoxColumn Column6; + private System.Windows.Forms.DataGridViewTextBoxColumn Column8; + private System.Windows.Forms.DataGridViewTextBoxColumn Column31; + private System.Windows.Forms.DataGridViewTextBoxColumn Column26; + private System.Windows.Forms.DataGridViewTextBoxColumn Column7; + private System.Windows.Forms.DataGridViewTextBoxColumn Column27; + private System.Windows.Forms.DataGridViewTextBoxColumn Column25; + private System.Windows.Forms.DataGridViewTextBoxColumn Column9; + private System.Windows.Forms.DataGridViewTextBoxColumn Column10; + private System.Windows.Forms.DataGridViewTextBoxColumn Column11; + private System.Windows.Forms.DataGridViewTextBoxColumn Column12; + private System.Windows.Forms.DataGridViewTextBoxColumn Column13; + private System.Windows.Forms.DataGridViewTextBoxColumn Column14; + private System.Windows.Forms.DataGridViewTextBoxColumn Column15; + private System.Windows.Forms.DataGridViewTextBoxColumn Column16; + private System.Windows.Forms.DataGridViewTextBoxColumn Column17; + private System.Windows.Forms.DataGridViewTextBoxColumn Column18; + private System.Windows.Forms.DataGridViewTextBoxColumn Column19; + private System.Windows.Forms.DataGridViewTextBoxColumn Column20; + private System.Windows.Forms.DataGridViewTextBoxColumn Column21; + private System.Windows.Forms.DataGridViewTextBoxColumn Column23; + private System.Windows.Forms.DataGridViewTextBoxColumn Column28; + private System.Windows.Forms.DataGridViewTextBoxColumn Column29; + private System.Windows.Forms.DataGridViewTextBoxColumn Column22; + private System.Windows.Forms.DataGridViewTextBoxColumn Column24; + private System.Windows.Forms.TextBox txtTensionStrapCCD1; + private MetroFramework.Controls.MetroLabel metroLabel5; + private System.Windows.Forms.TextBox txtTensionStrapCCD4; + private System.Windows.Forms.TextBox txtTensionStrapCCD3; + private MetroFramework.Controls.MetroLabel metroLabel7; + private System.Windows.Forms.TextBox txtTensionStrapCCD2; + private MetroFramework.Controls.MetroLabel metroLabel6; + private MetroFramework.Controls.MetroLabel metroLabel13; + private System.Windows.Forms.ToolStripMenuItem tsmiTestCode; + } +} \ No newline at end of file diff --git a/JY.Inspection/HomeForm.resx b/JY.Inspection/HomeForm.resx new file mode 100644 index 0000000..355542a --- /dev/null +++ b/JY.Inspection/HomeForm.resx @@ -0,0 +1,2960 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + 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 + ne4PkNDucnRuCccAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAASpJREFUOE+N + UzFOAzEQvCoVRewoLTSpeAElJZQIRUAKemo+kIoWCWI7qRAlQUj5QRoU5QGhOK/hB7wBdvc2dwbnLhlp + ZO/tznjX8mVN0GM4lC1Dm3yoDBgJm0HF2sKPcnATx9rBggu2QVk/wOIXFq3FFt7V5HNfSupRnh6ZYCez + bPrR4jyOht9W2oUnFsSITmMq46+qTsJtKS7yfZEVaD/CsST+ULlwWZrUiQnahjdJJmQTC1OJUzFhXVxL + Ey5wrTcpC5tIJgZead81oSfSYn665USwiWySD0VaQFmYKxue26Ovg42iimnrew/QRdcTTHo0GuF6FAma + xYTqmfpzXMnkruPyM239N8ZL5D12dyrlKeLH0zHhmsaR1HZE4n5yMbuAn+a/33Z3ZNkvQu48v1w/3foA + AAAASUVORK5CYII= + + + + + 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 + AABJRU5ErkJggg== + + + + + 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 + v082R1AUDzrIrzxLZL9eAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAmVJREFUSEul + Vr+L1EAU3s5GPTPJFYKNhRa2InKKoK2lIlYW4gqCjWJlpYUIFlqcm8kutyJ3zcE1Yn3gFYqVWMgpJjPR + k8M/QP8B/d7kSzZxM5tVP3js5Hs/M+/NZHuzEA3yoyq2dwJttpQ2KeQnJSXXX1jZOUzz+RFpe1zpbIQA + v2qSB9quqsQ8U9pKspouG4kP3WcDDpcmjnZTxel1NTTHqK6wOMyPKJ1fRcK3pX2ozV2q24Fg9yfB81uk + OwH7ceWHGKSbkOylkVRHem4EOj1TJcEukC5Q7HmhFEPSXhx4as5y2UCxbUWcRk9qDR2T8oLTg0LsKqkG + ZGuLWNnIETJmjkCzHNEBFoIEZovUFNxwwEbGXBz6hUN+g/qZCOPsAqp/Ib+kpoB+3nSF4AxVr4yHU9T/ + N6RHRdF4SyzcoVmMP+6l3osgsafh9BKyRqoV0aPP+1zRiC0J5Oh/oq4VasUcUrF5QieRbaq8gI27WmTx + A+JNINWg4ldRbM/Bjg3Olqn2AnYpitqVxbY4dW1RMMzPlwnCQXaSdCtqW7SBBHbdPXQ0GTbVHUXKi7LJ + GP3bPZVkF+Wha0zxutfqCcTPKVpQjenALPUW9IcAD9+7DppUUyZAsi+kp7Fs9qg4e92IV7tFvVdFZZPY + 56RaAZvHjDW58KLRzkEQ30Qxz2XnA/p42QVvKyJMzBVm/qfrev94V8E3x9B8DeP8BOkmsG/3yiR/88Ep + Ab939O+TmgY+j0uYgveFod2UiZCxk9mmiRd8izfiGyTZA9LTkEOH0/uQ1dTF/ZuYRwr7bJ0h2+H52/Jn + 0hliNn4D0ecKwJDrIloAAAAASUVORK5CYII= + + + + 258, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAE + CgAAAk1TRnQBSQFMAgEBAwEAAYgBCAGIAQgBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA + AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 + AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA + AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm + AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM + AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA + ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz + AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ + AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM + AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA + AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA + AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ + AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/ + AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA + AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm + ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ + Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz + AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA + AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM + AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM + ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM + Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA + AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM + AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ + AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz + AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm + AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw + AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wUAAf8BGwEIAngBCAEb + Af8YAAH/ARoBkwJGAZMBGgH/FwABGwF4BlYBeAEbBAABwwwaAcMEAAEaAUYGJQFGARoVAAxWAwAB5Qxe + AeUDAAwlEwABCAxWAQgCAAHDBV4C9AVeAcMCAAGUDCUBlBEAAf8OVgH/AQAB/wHlCl4B5QH/AQAB/wFG + AiUBTAHzAUwCJQFMAfMBTAIlAUYB/xAAARsEVgF4AvQBeAZWARsCAAEbBF4CoAReARsCAAEaAyUB8wEA + Af8CTAH/AQAB8wMlARoQAAEIA1YBeAT0AXgFVgEIAwABoANeAsMDXgGgAwABkwMlAUwB/wEAAv8BAAH/ + AUwDJQGTEAABeAJWAXgC9AJ4AvQBeARWAXgDAAH0A14C9ANeAfQDAAFMBCUBTAH/AgAB/wFMBCUBTBAA + AXgCVgEIAfQBeAJWAXgC9AF4A1YBeAQAAaACXgL/Al4BoAQAAUwEJQFMAf8CAAH/AUwEJQFMEAABCAhW + AXgC9AF4AlYBCAQAAfYBXgHlAgAB5QFeAfYEAAGTAyUBTAH/AQAC/wEAAf8BTAMlAZMQAAEbCVYBeAH0 + AQgCVgEbBQABGgFeAhsBXgEaBQABGgMlAfMBAAH/AkwB/wEAAfMDJQEaEAAB/wF4DFYBeAH/BQAB/wHl + Al4B5QH/BQAB/wFGAiUBTAHzAUwCJQFMAfMBTAIlAUYB/xEAARsMVgEbBwABwwJeAcMHAAGUDCUBlBMA + DFYJAAKgCQAMJRUAAQgIVgEICgAC9goAARoBRgYlAUYBGhcAAf8BGwEIAngBCAEbAf8YAAH/ARoBkwJG + AZMBGgH/FAABQgFNAT4HAAE+AwABKAMAAUADAAEQAwABAQEAAQEFAAGAFwAD/wEAAfABDwL/AfABDwIA + AeABBwGAAQEB4AEHAgABwAEDAYABAQHAAQMCAAGAAQEBgAEBAYABAQQAAYABAQYAAcABAwEEASAEAAHg + AQcBAgFABAAB4AEHAQEBgAQAAfABDwEBAYAEAAHxAY8BAgFABAAB+AEfAQQBIAQAAfgBHwQAAYABAQH8 + AT8BgAEBAgABwAEDAf4BfwHAAQMCAAHgAQcB/gF/AeABBwIAAfABDwL/AfABDwIACw== + + + + True + + + 137, 17 + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + 373, 17 + + + + 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 + rTngcffVHPC4uLi4BkjNzc3sJss9CN1EFo6PtCXnt/4vYznJ+QNkfv5w98V0/gwGccDj4uLi4uLi4lIw + ccDj4uLi4uLi4lIwccDj4uLi4uLi4lIwccDj4uLi4uLi4lIwccDj4uLi4uLi4lIwccDj4uLi4uLi4lIw + ccDj4uLi4uLi4lIwccDj4uLi4uLi4lIwccDj4uLi4uLi4lIwccDj4uLi4uLi4lIwccDj4uLi4uLi4lIw + ccDj4uLi4uLi4lIwccDj4uLi4uLi4lIwccDj4uLi4uLi4lIwccDj4uLi4uLi4lIwccDj4uLi4uLi4lIw + ccDj4uLi4uLi4lIwccDj4uLi4uLi4lIwccDj4uLi4uLi4lIwccDj4uLi4uLi4lIwccDj4uLi4uLi4lIw + ccDj4uLi4uLi4lIwccDj4uLi4uLi4lIwccDj4uLi4uLi4lIwccDj4uLi4uLi4lIwccDj4uLi4uLi4lIw + ccDj4uLi4uLi4lIwccDj4uLi4uLi4lIwKTfgNTejsalJNNEHNTfhUWPf19P46BGaRf/3t5oePxZ+bjdr + F/bF437YHU9NTY873/7mRjQ+Fv0/yNTU2IC4qAhU1jWKSuRXU2MjHss6rMKx7vZ4d6Im4TxoFM6XwaTH + wu9sEv8c4XprlPNgNrNzun9P6uZHVcjMKpS93+WW/L9h4PRY2AbZ+4bOnd6eP/2l5qZKJKfkiKZ6p6am + R0hJTEbj0/0pPRLt90ePen4veFpqEu67Ta0XZ+9Fz6j+vlaVSc2PhWec1HHoAHiPG6qRkJAq3H46Ki3k + LoytXVDV8GQPQn1NjXAr6k41uH5FCzbOgah9JN/J1vQwA+vmTcPZK06o6cv11FgFk3OHYOwYgL7smghn + U6hdcejd/m2uwvldG6Gha4xr165J+Sp2LpuKVft1UVnf+bpLY50xZfoiuIXflwmaYbd0sHLjEaQV1YhK + +iZnc23c8o2V6+abm56C0rIS3L+fgYwMWU6D7oHFWHXYDPUybjbN9fnYt3ELIh88FJUMrHITgxGdXiKa + 6lrNwg0y2PECfvxhLHwTikWl8qgZyc46mLp0DzKKakVlLap7mI2tS+fBxj1G5rXclaoKUrFy1lTYeSfK + 9cLR3FQHzxtmuOkdg0cyv+wxPKz1YOboI1xnXa2xGVmJkcjIrxBNt8nPXAXLd5xHfnm98H3lOLt5MY7r + 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 + 37HzyzDoPNsAAAAASUVORK5CYII= + + + + True + + + + iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAABQhJREFUaEPF + Wk2IHEUU3pMgKKa7XRUMePGgoHgSPHgRxYuCePCkguKehOBBEAQP/mBQAgnG6W7GFSRBQSMYAgsiBETv + Kssaw1b1JEaJxw2s3tfvq3o1Uz0zma7q7p354C2zr+q993VP9Xtdr2atLyT56PGk0MchZ9JSXUxzdTkt + 1L4RfoaOY2YO5orZapHm+mkQPJEW+hrkIFJgA1v4EHfLwXp+6basqI5lhf51lpTaBqFvSCwr1LFsoJ8z + gs9ClmPb03b0RZ/0LWH6x3p+9R4EehtLQHvB9ywpvXFkcOU+mdoIzqWN2O6JrwP6ZgzGkqn9IClGz9SJ + q32u5azcvVemtAZ90Bd9+hfCmDKlG3CXXpsQN84H2fDqAzLcG+iTvv1YjC3D7ZDk6q2aw0K/IEOHBsbw + Y5KDDMUBX+mrviPcjaVlC8aqxQYXGQrDnXn1hO/grs0rd8vQ0sCYPgdykqHFyPLdR33DZDi6Q4aWDsb2 + uZCbDM0H05etoEL+09HDMrQykMP4IsBtYYplDh6TL1RQGsPcc8geP2alfllUvYNcHC9yFHUdrILMv5a8 + Hoh6IbJcveIcW6m2smL0lAz3CpdiyXFuxWYptyTUfmie552vX4CTajMp/3hIpvUCcnLFjlxFPQHfRzgI + UsdF1Yi0rC7Wifui/oV8cPvgcibTO4Pc6JtcRWWRlKNnbdDqRszrAWx+mBC+qagk16+LSSeQGznSLzmL + 2hStIZW4sguiCgIKzvce0cWS659A4HkxbQ1ytD7VUFTmTl43yrJ6U1RBgJOtMcFw+RrymLiIBjmKn+tG + kQ1GT4riYD2v7jfKQGBNyt1oJadiXsEdyNH5IPfxgwHZkTnBQGH5zjlrJ9U/SYmXtXOXbhGXQYDtDu1N + wsGfM8YZNhcyHoy01N9OyLSXpNS/xBRCcjV24A4S2IAbR+qEjAcDdlzPM4TaS1ghJFczH9y5DMy7D/et + Mh4MZISv6gT6kmpTQsyF3WNjHrjzamx1w+ZbxoOBr/BsPXCPku++K2FmQK52ntrvdAFIaV/UgvYoeC5e + lDAzqF9AhyUEu89dwD4FS3P+G6egvoS6PMS5/swP3F2qrZCdF7ma+XyIu6RR3ImyTqC1/J4Wo+B9by2N + 4o8UMrUt48GAbb0NEi//Qd6L3baSK+3J3TRlncPY0o41+ImzjRUEP3vk9O4j4ioY0tWzPlyTGP+45uyG + UQQClfikcxYu6uc2Gc8BPjbE1zVRma/EPhSRz8HYLkz+wjf2hpi2hlv/jC0qo3SNpL2YDQ3S3Udi1ySn + 0tP6qJi1ht3QSDN4utEGMtFbSsz9UAjOFYyf7/Mwg9zol1xFNUGbTT0q8fs+YU9+Q5CXZFovaNzUt2mr + 8H3FI025AefvHD35960ypTeQk3Cb31YhWMI9MkGd6CzXXyZFdT4rq4+z/M8HRd0ryMXxIkdRz4JtO/ct + GFn2+dUceAlG7n7D6Q1PRsYXAFlFZ9phukMdfGqDq66fyqygQz3dmSYnGQrD9OnMMjvVtY40Y/d1ShPa + se4CvxNtJfJ0ZhrTpzVMZ6F1Igb06VKlk+BTmSaYUxvZuVk53GNWxmo8jYkF0xdzMFPZ5EIqFC59ge2+ + mK6e6a7BxthKs5ZC34zRmCq7gFWQpRyB5vzUQO8gW+BtcdFPDWxXzRf6os+bVtjDgm3Lm862bQ7HCWzU + sNYmXyXYaOVahjT+3MY0ZXvB2tr/GbiyqsbkJo4AAAAASUVORK5CYII= + + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + 494, 17 + + + 584, 17 + + + 749, 17 + + + 32 + + + + AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ3IDgCeyA4AnMcOAJvHDwCayBEAmsgRAJrI + EACayBAAmsgQAJrIEACayBAAmsgQAJrIEACayBAAmsgQAJrIEACayBAAmsgRAJrIEQCcxw4AnMcOAJvH + DgCcxw4AnMcOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgyg0AnccOAJzHDgKcxw04nMgOb5vI + EHebyRB3m8gQdpvIEHabyBB2m8gQdpvIEHabyBB2m8gQdpvIEHabyBB2m8kQdpvJEHabyBB3nMgPd53I + Dnedxw5xm8cOO5nFDgKcxw4An8kOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKHKDQCbxg4AnMcNVqDK + D+qezxX/nNEa/5zRGf+c0Rr/mtIc/5nTHv+X1CD/l9Qh/5fUIf+Y0x//mdMd/5vSG/+c0Rr/nNEZ/5zR + Gv+c0Rn/n88U/6PMDv+hyg3snMcOXZnFDgCgyg0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAncgNAJvF + CwqdyRC+n9EY/5zUHf+c1B7/mdYh/5bYJ/+T2iv/ktss/5LbLf+S2y3/ktst/5LbLf+S2yz/lNoq/5fY + Jf+a1R//nNQd/5zUHf+c1B3/odIX/6XODv+fyQ3ImcYOD53IDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACbyA8AmsQLEJvMFM6c1Bz/m9Uf/5bYJv+S2iz/lN0z/5XeNf+V3TT/ld41/5XeNf+V3TX/ld00/5Xd + NP+V3TX/ld01/5bdM/+a2Sr/nNQe/5zUHf+c1B3/oNEW/6DKDtubxg0bncgNAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAJrIEACZxQwQm8wUzprVIP+U2ir/ktsu/6PpWP+z94L/tfiH/7X4hv+0+If/tPiH/7X4 + hv+1+Ib/tfiG/7X4hv+1+Ib/tfiH/7T3g/+o6Fb/nNUg/5zUHf+c1B3/nMwT3JzGCxydyA0AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAmsgQAJvECRCZzRfOlNkp/5LbLP+V4Dv/t/qN/77/nv++/53/vv+d/77/ + nf++/53/vv+e/77/nf++/53/vv+d/77/nf++/53/vv+e/7j7kP+b3jf/m9Qd/5zUHf+bzRXcm8YNHJzI + DwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACayREAnMMJEJfPG86S2iz/jt0x/5HkSP+4/JP/vf+d/73/ + nP+9/5z/vP+a/6X0ef+y+o3/vv+d/73/nP+9/5z/vf+c/73/nP+9/5z/uv2V/5riQ/+W1yT/nNQd/5vN + Fdybxg0cm8gPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJnJEgCbxAoQl88bzo/cMf+I4Dv/j+VL/7j8 + k/+9/53/vf+c/73/nP+9/5z/m/Jx/4nrW/+w+oz/vv+d/73/nP+9/5z/vf+c/73/nP+6/ZX/muJD/5La + Kv+a1SD/m8wV3JvGDRybyA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmckSAJ3DCBCV0B7Oit85/4fh + Pf+M50//t/yU/73/nf+9/5z/vf+c/77/nf+w+oz/gelR/4frWf+u+Yn/vv+d/73/nP+9/5z/vf+c/7r9 + lf+a4kP/kdss/5bYJ/+bzRXcm8YNHJvIDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZyRMAncIHEJPR + Ic6I4Dz/guRD/4bqV/+3/ZT/vf+d/73/nP+8/5v/vP+b/7r+mf+O72X/e+dK/4bqV/+s+Yf/vv+d/73/ + nP+9/5z/uv2V/5riQ/+R2yz/k9or/5nOGNycxQwcm8gPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJjK + FQCcwwkQk9EhzobiP/995kr/hutY/7b9lP+9/53/vf+c/534gP+J82//ivNw/3zwY/9261b/e+dN/4Tq + Vf+p94P/vf+c/73/nP+5/Zb/l+RI/5HbLP+S2y3/l88b3JzFChybyA8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAmMoVAJ3DCBCS0SLOgeRF/3znTP+B7l//tv2W/73/nP+9/5z/q/uN/33xZ/9w7lv/c+5b/3Pu + Xf967Vv/gOlS/4jrWf+w+ov/vv+d/7n9lv+U5kz/kdst/5LbLf+X0BzcncUKHJvIDwAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACYyhUAnsIHEJDSJM5/5Un/eelR/37wZf+2/Zb/vf+c/73/nP++/53/q/yR/3r0 + cP9v717/eO9h/6X5h/+x+47/sPqM/7j9lv+9/53/uf2W/5PmTv+Q3C//ktss/5fQHNydxQocm8gPAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJjKFQCfwQUQj9Mnzn7mSv917Fb/ffFm/7X9lv+9/5z/vf+c/73/ + nP++/53/q/2T/3r1cv9y717/ovmF/7//nv++/53/vf+c/73/nP+5/Zb/k+dP/4/cMP+S2yz/l9Ac3J3F + ChybyA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmMoVAJ/BBRCO0yfOfudO/33uZP978mv/tP6X/77/ + nP+9/5z/vf+c/73/nP++/53/rP2T/33zbP+J82//u/6a/73/nP+9/5z/vf+c/7n9lv+T50//j9ww/5Lb + LP+X0BzcncUKHJvIDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYyhUAn8EFEI3TJc6O6WH/zvnG/4b2 + gP+0/pb/vv+c/73/nP+9/5z/vf+c/73/nP++/53/r/yQ/4vzcf+y/JL/vv+d/73/nP+9/5z/uf2W/5Pm + Tv+P3C//ktss/5fQHNydxQocm8gPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJjKFQCfwgYQj9MlzoXn + VP+h8o7/ffV2/7T+l/++/5z/vf+c/73/nP+9/5z/vf+c/73/nP++/5z/t/6X/7v+mv+9/5z/vf+c/73/ + nf+5/ZX/k+VL/5HbLf+S2yz/mM8a3JzFCxybyA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmMoVAJ3C + CBCR0SHOjuda/8L2tP9+83T/nvuK/7v/m/+8/5v/vP+b/7z/m/+8/5v/vP+b/7z/m/+8/5v/vP+b/7z/ + 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 + AAfgAAAH4AAAB/AAAA//wAP//8AD///gB/8= + + + \ No newline at end of file diff --git a/JY.Inspection/JY.Inspection.csproj b/JY.Inspection/JY.Inspection.csproj new file mode 100644 index 0000000..34c31c4 --- /dev/null +++ b/JY.Inspection/JY.Inspection.csproj @@ -0,0 +1,492 @@ + + + + + Debug + AnyCPU + {607AF967-65F7-483E-8BD9-2D92AD17D151} + WinExe + JY.Inspection + JY.Inspection + v4.8 + 512 + true + true + + + + + + AnyCPU + true + full + false + ..\..\..\..\JY.Inspection\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + JY.Inspection.Program + + + + 外观检测.ico + + + + appini.manifest + + + + ..\packages\Portable.BouncyCastle.1.8.9\lib\net40\BouncyCastle.Crypto.dll + + + ..\packages\CsvHelper.30.0.1\lib\net45\CsvHelper.dll + + + ..\packages\EPPlus.8.0.8\lib\net462\EPPlus.dll + + + ..\packages\EPPlus.Interfaces.8.0.0\lib\net462\EPPlus.Interfaces.dll + + + False + Lib\HslCommunication.dll + + + ..\packages\SharpZipLib.1.4.2\lib\netstandard2.0\ICSharpCode.SharpZipLib.dll + + + ..\packages\log4net.2.0.13\lib\net45\log4net.dll + + + ..\packages\MetroModernUI.1.4.0.0\lib\net\MetroFramework.dll + True + + + ..\packages\MetroModernUI.1.4.0.0\lib\net\MetroFramework.Design.dll + True + + + ..\packages\MetroModernUI.1.4.0.0\lib\net\MetroFramework.Fonts.dll + True + + + ..\packages\Microsoft.Bcl.AsyncInterfaces.10.0.9\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll + + + ..\packages\Microsoft.Extensions.DependencyInjection.10.0.9\lib\net462\Microsoft.Extensions.DependencyInjection.dll + + + ..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.10.0.9\lib\net462\Microsoft.Extensions.DependencyInjection.Abstractions.dll + + + ..\packages\Microsoft.IO.RecyclableMemoryStream.3.0.1\lib\netstandard2.0\Microsoft.IO.RecyclableMemoryStream.dll + + + ..\packages\MiniExcel.1.36.1\lib\net45\MiniExcel.dll + + + ..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll + + + ..\packages\NModbus4.2.1.0\lib\net40\NModbus4.dll + + + ..\packages\NPOI.2.5.5\lib\net45\NPOI.dll + + + ..\packages\NPOI.2.5.5\lib\net45\NPOI.OOXML.dll + + + ..\packages\NPOI.2.5.5\lib\net45\NPOI.OpenXml4Net.dll + + + ..\packages\NPOI.2.5.5\lib\net45\NPOI.OpenXmlFormats.dll + + + + + ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll + + + ..\packages\System.ComponentModel.Annotations.5.0.0\lib\net461\System.ComponentModel.Annotations.dll + + + + + + + + + + ..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll + + + + ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + ..\packages\System.Runtime.CompilerServices.Unsafe.6.1.2\lib\net462\System.Runtime.CompilerServices.Unsafe.dll + + + + ..\packages\System.Security.Cryptography.Xml.8.0.2\lib\net462\System.Security.Cryptography.Xml.dll + + + + ..\packages\System.Threading.Tasks.Extensions.4.6.3\lib\net462\System.Threading.Tasks.Extensions.dll + + + ..\packages\System.ValueTuple.4.3.0\lib\netstandard1.0\System.ValueTuple.dll + + + + + + + + + + + + + + False + Lib\WcleAnimationLibrary.dll + + + ..\..\..\..\..\14J大圆柱\908项目大圆柱\908-9 封口机\HBG_SealMachine\HBG_SealMachine\Lib\WinformControlLibraryExtension.dll + + + False + Lib\WinformControlLibraryExtension.ComplexityPropertys.dll + + + + + + + + + + + + + + + + + + + + + Form + + + FormMesGradingSet.cs + + + Form + + + FrmAbnormalVoice.cs + + + Form + + + FrmAlert.cs + + + Form + + + FrmCCDQuery.cs + + + Form + + + FormMesDataSet.cs + + + Form + + + FrmAlamQuery.cs + + + Form + + + FrmChangeModel.cs + + + Form + + + FrmConfigBaseSet.cs + + + Form + + + FrmDBbaseSet.cs + + + Form + + + FrmHelper.cs + + + Form + + + FrmHistoricalDataQuery.cs + + + Form + + + FrmParaConfig.cs + + + Form + + + FrmPwd.cs + + + Form + + + FrmStatistics.cs + + + Form + + + FrmTest.cs + + + Form + + + LoginForm.cs + + + Form + + + SetForm.cs + + + Form + + + HomeForm.cs + + + + Component + + + + + + + + FormMesGradingSet.cs + + + FrmAbnormalVoice.cs + + + FrmAlert.cs + + + FrmCCDQuery.cs + + + FormMesDataSet.cs + + + FrmAlamQuery.cs + + + FrmChangeModel.cs + + + FrmConfigBaseSet.cs + + + FrmDBbaseSet.cs + + + FrmHelper.cs + + + FrmHistoricalDataQuery.cs + + + FrmParaConfig.cs + + + FrmPwd.cs + + + FrmStatistics.cs + + + FrmTest.cs + + + LoginForm.cs + + + SetForm.cs + + + HomeForm.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + {01a2aa2c-9b80-41aa-9f47-3cb67e60af24} + JY.Control + + + {d5889580-58f9-467e-87d3-efa37a300e67} + JY.DAL + + + {168C8644-3975-450D-94D2-29D21C135C16} + JY.MES + + + {f7db3a93-fca2-479b-8b2e-380116aae9fc} + JY.Model + + + {76de07e0-9e97-44ab-8148-01b44c5c1add} + JY.Utility + + + {796c9dfe-1d66-4921-b998-c5fcf15c2983} + PLCCommunication + + + {d73fae32-aaa3-4a51-bb0a-f1a5dc5a7260} + SimpleCommunication + + + {2E9AC112-75CC-4FB6-B058-F9C7424514EF} + SocketHelper + + + + + + + + + + + + PreserveNewest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JY.Inspection/JY.Inspection.csproj.user b/JY.Inspection/JY.Inspection.csproj.user new file mode 100644 index 0000000..0b24643 --- /dev/null +++ b/JY.Inspection/JY.Inspection.csproj.user @@ -0,0 +1,6 @@ + + + + ProjectFiles + + \ No newline at end of file diff --git a/JY.Inspection/Lib/HslCommunication.dll b/JY.Inspection/Lib/HslCommunication.dll new file mode 100644 index 0000000000000000000000000000000000000000..8a764c15410db2170f81d9f6c2b7abfaf9fc8e78 GIT binary patch literal 2676224 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

$vB1%oKi;hMf<)5m0d7*CQkgxXg0)}W@IO*T|N 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 z z=8H39xSe1h%xLC=>%V{rD~fe;3tM>N#n0Tz!YJaMYdwm!%O9CPXO71$l4^YSG)@D7 zVXCI)>z_gtoFHIZBdWGo&6(q==~OJ$I6S7^fD%sSE3V6y&`zF~o;48VdAt(yZJa1h zf)gM$7M*f$s(vAuZaKx&rML{)S%rM5kt;Han_4RhDw!3E9%V1JeEo~S=2uxK?Ui6L zDE^HUrQ$xwRg_*%j^c7nm8gc+&1z&7yF4t*790aXl~+mDeL2{Lgm9*g7f(7w=rDv@hPdvf2R*A|nku+ZOL*e2EwD|EMbEQ&y&mOdj@a zb&Rx&8{@2V+!*IOSYuSBH_3}T{J2%w7Hi|HlJf^uC|+Yd^1cA ziUcht30z2hGf|4k4F2G_m#3I(qUKRG9-`Eb1Z901ZM%xTr#93eIv-0LdPjYC`OL@C zhPGy~Jd-wwu5({}`NW0Sk;EY4B%d^+?o7Q)0^=vmIJ4FNgrDS-W)yMPUy#7~NwfDe z@Ea1?deUs}8TGp)Jmzlb@5N*8hW^#kxSA?A zb|uo~+m0*28sb70LLrD{{YBcI#11}+$Rc0c87Bb5cNBj%;zjZGj7#IM9v%N({4LoWLw|xfc8t2hGkP@598;ZO z0?URRn_%Xc!RFjQ3TBQOEGPabh>6V{GgyxE<6!2P!E#m~1(WYQ_oL~Czp`HC^<=0t z=|G#$U`k)Q-J*1L-|Z^t>h24vu?FdDb>D?|z*XNBXzA(!3%LSd@H_QRIgX#LUGcYq zai&Y0mD}~Dt4A%o!9-j+bXq+n9~$Q3db)a=B0q#EDg4bL@(cK}M}$)evwr={s9{7s zFMkmdF6fKrQs1}*!R5Y~7#S7qPN62;Twk2?fo@i@V+9Sg1^~KrS9udB;FOGTa zPc*hJz@qkjunPn2GC7zI0=6T4@jS8XJj4HxC!yzb~=a0oE6btxkLJ`eISz%^qO|t|!*ocWeEvFUnq8ed~*|p|uy= z@?`y;4u+oDR)3E50Q`Sv{aNK4C9rF;Xe+OS(U&>XAs+T0;n106V6|tNwA2O?hlV2O(xFWw=X;0xBj>(Dg~+*5_HJ0wcjKy3+8di$;6$l zHik}PfEfbbgP3eS(}{LIezf^`3H|Bb)brX+*<#v1tR2x7(h+*Jwup|<{j?EugwEG` z?+D#g&&LxT)q|B*RUpBY7@D=_*;>?3QJvOj@N+Z%dg0c7>WGH(>+7%QS;>0%AFXE& z5n9h=w>-PbdX9okJ=4p2rb=i15&X33`Bbgvch=c5SkEJgdLBU->$!?Q74XYY50&;< zksTF%6+Y{1-tlGanPx0#M_7BD>HHnR`ZZ)eGvy307TOATBXReom z77KPg7NVyX7JXg+_ zq3!}1mkRrwq! zZ7FxPpjpn@cwNDmP5Ub_y5R3k`12W2%2z7o}rh z)J{k|^DU>R8lCghSkZU#8m*179GPfzE>g#eKGE)vxMfs1q}?3{{yQ7V|AA$Ww5BRd zX10tz7US9ghbNJ2)vO5?f)j;g4UylQn1xmrnbq|im}9CF1fK1vB1%h%!U`G(<(iH< zVza9Pg*7xbO6|l>mNPyXK2H3dJ9*CdCy$eLpbAT|dv!!HQYt-wCp!=}Z@iPBcjbi%0~Kd$-D1 z-$py~*pA9MNm?`;p&4bxD!|NE+A~>&ZNXdsgGw;#iEZK%D9rM-l{0}Y7N))0qqO27 zgIh|pMADu=0W*6(bIFP+dYUk2tE9%}bX`$2{*0kC)26q%NOX61Kn^o4p{NXMsrn`e zOsq<_H#CZ`M@CELVrkO2=if2b?t;u_bbeDc8(J^X^@@J0sQlD!Qs@(}EPVD585E(m z8tbVJnWU;n$`(11D(^`$hLlfDK24%FVrTrnanj1-l&Y7yB6jUqWoEXVy<|nOE0Rej zFuE*r+RBn0yDYZ<1`oEWW0FCVw{hhr?ZLL*9koO1?H-C&z}X|ZgupHpx!GAFH-~}9 z&E6fk*=Zv;TZYk^hg~YPsl?TSv&o;%s|5#-rLKiFpKVb*nwIg*FQQe)XO&o?wM_9G z1s$xb(b7B2lgn&PEvMbRU^PCg4i?X@qPA&nifsx;%E4cuhVvS#-6%pV>2B#pO+v~`G4AyXrw8KvjIN`^2#Jq-}6n>1L$rxDn|Erv})6=PE zkR{E1l&0J#xPf?fcoTsWewx4yZzL#%pCV{725253H0jav`)e9Ml6w0bGOqPD>L_38 zjq=Ep#rZ17wunKougk73H2P??pnWu?(-;2{>+G53>O%95TY)zVcC@lZcXb1I6IHuS z#>74e97u{apy|qpa@&u>X19W4<)Vv`0D~i@)45*}Rd@3pgXgm}u8@WW-;7mMLqo&3 zM2h7j_WQ9-rHe1IdS@Y9XnE800*tn)Dm`p@Ce#Uv46)syS70*MMz_0Q05lRRf?PuU zclN_gk({)%x~y zs9F>zhkfe7RCptW%&ikYq;o|JeafopR*KKn)O1CevMPf9)?6CwjmT*W`lkePoZ`qP*{IFB zbzTA2^jqa(-ux(Ry!!u^)?^sveFG}rpe%N^>J@WprtIpS&&(O0#qcFc0*66ZZ2-f7KfK7+Tt_BgWY5TCw!K`4WA<@g-;VS83Qzr5t{Twy15_V zSUze&uea%VHjO(<)+D574PS-z4K~|t`UM9+ z;V&^~Gx&g|dt~7J3cmdoa0cLch!XuRMc9Y%S3g_ujv~z?7w%$c9<^`>a6#=! zG5Gx924Z{8U?prmO8B}t+#pI4uavbeQ?$M1P zH-z|nOL27aV-*Mre4VGo*4i>G^vfx#Mm8f=zj-qQtt#?1ED*)RS)*JXM z!_ECAb)a^I`yZ*degvu*YA5kMv{-L_PUph1rT4ofkc^TjOz)t{&l*GRHzjp9%Stz% z1hb8PXSc0FzE~03s$Y*HA=b0&i{%A3VI7%Jn}y+035lN=-OGf;PjPN^dauoZ;14f)K^OM{bWZ5v@|7oz+tNg*62FQ^o=g8H z%k5epMw2ORNV(hg_J?dpLrXWFZ!0*oz+pu!7A9+POg+aB-2S(=AZ{!>T2Na9qC$I1 zE|9KmV!1_}qp2;j+aP(!3>4F?{Xec{Q>HIU@G8Zh`!u8)=nxr^s++pqxVkZ?-IO~~ zL!->Pk$0x5+vvQQWhnkO#ot!=+X;V*@pm%*-if~&?t<D}U-F)QvwRnv7 z?2Fjr2Dr|PIUHVGe;r80_aq!^8{l6@oel>gn++lGMob_| z|9Zi%jEPR6hF%QP^e5uYy>Zg--XH?qF@Y$3&Ht1QLhp&uTl`b}sT+ikJ6Ub{C;vAF ze?o-cX#5nte6-A8mztu>in|zAh3(i9Q${&lMd73L{{2v(Gm=t>z{-td5tt5q%v&n1 zgoTKbRdTpy5A!NhChy=anRb-veozDsDv(;sO5DM^#ZwnNby&k;GSX%plq-HgcH zgRNqMc7{MnK<^6fs&R8O&onbII+3axOQ6bB_!8gZN`uS;&mXLzw# zoO66TizXE(B_6u(E%q`u8nko}BkOp%xeQ4$qBU+5K0ZEvOX@53je2~1+?F)X;4w)pKB;jOXm|IZbi>;A8s zE2h0M?p%SEZ~`V3^j@DwlF_>17`*YF@>h=Wv^_zm zA9LIA5h}NlbKdV!He-iBByhs-6S(0I2uk6137U)nxy`X6x1py~E;*Srk50&fULc+w z{*1s0e?s7fKP4!IKPG5025259H0g=ulDfXynDx!gaWOmjv|;O;TVewLnf1+QV|1ji zd>$ZAj!Vege#LUz;Y$Qg_-g_;e376O{*s`{7~shY;R!vRGPfzD`R)XtUm+geaUj4u z4g`3|fdKC~5HuMBG>;dW^u&DDd`>0J6B9K5LOeVCJAo7amB0=EMoH7xM3GTDa;Tw83Qy|3Qc;HW}~q$2bOW6YblxFenAa3_Lc%%{0< zXK}J%;alj$6Gm^Gd3+^$!e|l0BIO(N&X7Gq>I0QE>X;HardDT|plOrgV6qa44n|6x z_laKmo&StHcOD!51IsWlygAM3fd45O%d2RURN18ZN+D`MAs`FX&Iu!=vpTLZ&1oI!uBGGLDTK+cq0(YuiPoPMKGaD>vw88 zcmhGu<98Ye&45-QAEXQRN0i`k{OI>6lVH_D;E`;FIZnR?>CRxkJ}uF&i|o60*h}Dq zlL$&-4?&Zk(4nz0!5~4886?{aua*#m-B`sq7@zU!}v; z2>Z4Zz$7njGeP|6TaA!IoeBRL!Y_iR%>=n|5^Wl(aAK{^V;7vx`cNy$SwCc(J{3hs zXeO};(8BpRBpbb6{XFtdG9xPW2bk>iX3J1)$xh0Rks)dla*tO+T*+oSfT`MC0K2MC zkFnMku$#<4amM68GOkfZWw{31YS1%BMxZ!@?r2SbqM;27pl>}1TF1;9UJ9tc0<+%u z$9DEXz|Ew6`` z=?`~iFU1#y7Oy8~DZE!u+hY7or84-Qm8+w0u;pt#9T%tTU-?f+H5!9vp&o|cr(@8C zU{2W2;l>UJ2%K;-K`E>dH2Dc*(5c{%pm_Jecb9HQCbT!K~K4RQaF#G$uQ73U1-qbzZB8f7c^#*#(7FZ^hkFkmK`o4aKfDk z+;C@tRQMKxQn-+y$%r8QULj0Rw5*ddl3z8_z92#StwglLy$PIfFM?9ICqa{+K<#}( zjh@!{?^-v5)*R5{*!7;awj)Pak*Z;;ehwn)IYQ3_wC}RN3b7L-9eXkwaH@9bdLE`j z3r^J*nm4vM+9xa@QfP-a>2~1=m8z9B5=Q&)BEVmyp}c9zHjgtEWM}U9`9@z$)lO>5 z@8#p1!o5~^?(<5UWvz!`+#?M>)?4O8}x7m_?;3Dk4Te9!}tf%Lz*1p#)9F0L`Y* zq$ldE(Vlv1(!5M*iXO}H#IwVd1Wx#F0yjK?pcJkkXfg(9hC-8`&OP-uq6;d=<0i~*XkJc}Wio@72brpzPFk195k4;&ipgiHua^*=coi30|Ev zfS+DILEQ&Z(Rw{yEk!X^!pySce-7EcerClrj()@vrd&UBa_V~jevTWh zTqMuxuwApZXMH&-|7v72-XUNe-nv+`Pc<*w@GdWS83_rK(x%3|;5V(H0cD3PNk^4v z_ow5ulRVI?@HcOvP^PC|6z;@2ck05xepUc4bD_SH{#A;tPK= zQMb#)dCJ6f7cFL)r^Uz{glV9ioFJD@&8(~(BgvKxP?0DJRMKQ!!voL+82*xpoin1_G3 z?>z|{-1*G=@NdyupkvthDoQKcc;tVUA_lK8$f|Q-wd1`% zdMB>33_3AVIg0r-Vn#ZQTpYqU%KqE+XRCV;?L+ex`wq<@*njAV`q_w>t*#i_mH{h= zvIHj&Ev}tlIjUde4bE5;<*JtV1_xu`62uV=62xg`LgK`}Z4rk%>xtgr)^RB4Y!&-P zX`)5v!O7B7J1v6~J-y##><;y2*G_L~r)m99L;bhDV&|1@**l@G+BU2M{KdLzHt+E9 zxUNdZ_*xKM_(K0%Y^j7Y7vK9@U}R%tetC75Hx-w- zR{N)+GNniG!G&qNF;y}RLq5yFqV4o;J90=Gq3J?bZ{v`?!2Lkqs0>puU zw?_fuK)^c~AmbM`apWINr7;vQoe&IKi}0+a{0>cyf(9iBzpxO5GyU3xe*X)YmiXY3 z;+!QB@Vjn;e>=ahh!DtW5ygRk1EK(N>wPNAB&F5v0Jtx-8ecb!dhiEQ_qS%}3Od<cq*51R{IS^zq`&37$KzquM zQqP-wShaZw-ogZ%bfJ!5nszI?_$#Z_j}F#_wh94RF(-``ng5OcwQUW?7QkRV zZkEL8Um^!E7yYdR%WHU0gES;s&!K>QsPYBfw8N`5X3*RY!_-k70&(iH^t8e&0W49& zRI^y>K~q5G$oa+LV2#Xe)rmT%du6^GQ<==SV+QedO!eJ(HKsZf@5PkyUQGOa%rtdk z6!WI{^Ys{fuIBiTOcz~wh85s4#%L%PI2~z0Y=ZT}Buz_6bfqh4ysy%|9M8p+k!~XG z6Ow7CWe`PFq&NWTnj&4A;uMo&bt2R5W-fY|pCVjFKJUs~;XARtMCEmYYcZk>EUT85 zKHH@k%4aGWlcBOSX-J6+Y@IHcv(NY$ghc|3@<2rfvvgOpS$e9uEOrsdW)>R=um(d1 zVF3*a5QDsmPSBoH@~*Sg2iBO?ezVwcVYs!Q3)+L(Ei{wSip#9AqE&eGOl!0*iTR(h zhQa@xS@zhf13HYCo{8smP%gf*W4rzxU`IZKcP34d)ttYoCgIkXLzJ+z|ln=BU zm|{)}evbhFBR!U$uAQ&#W@B1giy*G2Y3z!DL$)o$AI6bekSkb;x4p^|)nDUU=0Lmb z$rJ`-z`9;$o28AZMNG?vh~Qo{AAD{60ZDq*!9#k}cs2R$z?Dq+G_=uUmAguLM~1&_ z#j94AAJJ9IsNPyOE_%IKE@Od-^0M5&#N4wB%RMY>32*Rr zeCU`YqscOY)dNg~egh#+kZBzI2ZhzmjH40-a^q^DyHKnnTv}V8?_KFTtQ> zxD#>MF5`n{5RUj|=+=Tsmm1h6PeNO?(#MJTq_z9ScsH=rgqgivrWad+BF`UE)?ujg zT{o`Ik!jQnHg8y4b<~Vi=a~4Psgdz(Lo83suspr6AJtXXfq@BDL7`<{LYawvH1|2& z1Hy}wr~!{P;I(Q1Yff}NEJHOe*0*!Nw^595Td6AJAx~1q$Bb@0l%4EfISVT~U7Pe9 zk=KBX(GYoI)viJ?-962G=J_;4l3COz}0Rp8r+2bP>We$c~^1VFJb~ z$k@aHk|EJQu%-*G(D=&E-1Oj6h+9hyegojSHMZ;xg%I1po&lCe%ndQowT=nR3lHIZo>_a@+Ygdo4 z^#NR|5ZPl-!8tZ)Si6&t(E4eKci36Fj2YgqB7*4sbjib6++SCZ+Nz4lK&>+~Bb(!I zTl}Gy;^WZ#+Tnml5A7`e6+^q#%q5RUAu8yKJdcUT-1vB0Jm$v76XG#9KE5U%bK~Rd z;z`{2Kzs1gB5NwForKGDk@ZyymI`ZOjxdrZJ^Y9@X%<%XY=dV(-5uwWm^YSi&r+R* zEoZqv`4*3{vBjwR!ivEQQ6{Y9(M9K9!c9;Wwh7Z3$-|&o#}#bw4SO11($TF$nkG5Y z=(bCTCfVtMwl6gY)!Li2VZ%csbC1A%AUA2%-tBfScJ0A^7VS2FH1WsthokZLA^d@* zUDez|=^AwQ%2n8Ui0JT5T?ixL8fW^#DUoy5!tLR#FU8OB=~!{hEarlf!63_+D!vosAjmo@6X6W3}X~2A_j#Xd=0=O1i3EsHB?vtTE}_o1}xMMXdVIL1E0O z_a&n~iKt`7x<47~hVf!Okc@Tac(EQ###%aFtcR1a<{?&X?4nXM+F~p(W;on$&)EW| zTc$4Q?Wy%*fGPH@3ck#V&?@#|tcUi0F^h>AiurS2K$w|$iyp$DnZMxT*Rg@Ge_k8j zz>-zHP|)u!6-&KPpReY&n^)|UCUh3+`kchy-e7TnKiYUf6GGI5tKh6R5C^{Ag`bH& zOkKJMx`*r)_QuD5hno;PVnv*_uncdVGCflpz2i5g3i3H-thUDV3TRdG_564w+nT{6 zR#W1 zTf0}eSf1181&3h#%4U2R6Rx4_vJT^Z7$LELDpI9bnNzp0mhA1%?FW-&&b9p?A#b+-J^VWHyo*u=QK`g% z0A^1F#^ON0$x(nf5WtK}3~_J`bR^Pwh4UB$&yOOBN;&v9tRmZv6J4B;E;6sAK8`pE ztrXr;qh+uew%&NqSOWo$zoGDexRx#fa6+N_saqqx->MFmmdSr?tW>$d#abnKs>A)7 z>SpeNwZ`x@iL>ujJm0p%%L!nEngBMa37Y(b9W87(;832PmTr#H+LN@dOVGkgC8UK1 zL`Vxyi;xyxBmpgc0~#nj;TCwVX7jh=}YVy-}3fo;jf*c4C5 zl?yeTp=B%A=wsBnT|onz`)k|rg8x8fRa}Alm|5!r@M>?;{gD^gE0%kDM)i}DdQ&a>4$f!|)g zABdXudg@oS%()ei`W1?%eo6BP&|EBSW-bntxOYX~Fe(gMJ{mYp(W3tt^PfGKLyh@Q zSfIsd{t|K*k6=tAR*9JC1*f8UOM7nFg>$U4Sx-6+y3*ESd_AmxKj%lcc38_ET!+Rr z`Uur=O|YGqHM97q#L)fmqSbk7rzI>jC8FZPLDVgHbz^$6Q8h z1lq561LJ!CxA=`mV`MY~71!t4=8}{X=}Rs%ss!k+UG8Rt8Q4ws*q*urXt3m<~AC?Vs4oeWT z8gGT;*P3qV{NV5L|TMlGpbq6U*N9h&r$KlKRy+eYuWP~VdqT$FReQq0ncyL`5nvs*%HK`Hc14v| z0-BNKoY8vDl5L0&WE)JJK=F2@c_F(TKu^z$D6q|Nf4w{M|1a7`lwjOQFbY7y3F}xG zGuR}#?0{UGnwb!^oG8l=iD6|xPxTr11HIu->0B@RjMs8nx5G~oIN@~!Zg@RGDf|RM zlQA&mzh9<&dXoB#+*7}uG;d7Myoq>rcr$?$eukhF-bm2oClEVVh|yz+MfuyGv~Et& z`U27H@QVaacpHHm-cC>oZzX6l21tHDNYazcAIIebNb_?_6U*UTcqj4f@NNPp{3?MP z-bGLfze3Pt4A6xAD=eAl@v*>!D!Ht`_65y%kmeT>`Fx0YcK8^96FyAfhK~@W!bb^8 z;e!NCMg-~eg)}`;c3W$^14;Xf3EJNzq8&a%;Dk>Tl)|S7n*0Q69~5fzB>2g?If%5r zoS^j`qS@j12%PY{1f}rX1WkSdtqX(}Jsq?TCate3Exb&e3x7;BJNyZO6TU!D3V%e< zO*1}6j z>wcvrI;F1?4R=2YobdMqrSKJkCO?7JMM8_7mQHC(te-6fEo=CXsBE6WbNd_5IcfjP ztr;gC5M)FyK-CN+@h}4)>`=vL9l8tIwjrR9jUp~?MZ^hdZJS6L-50sopl%S2GRAzH z`KZq6&D0-)!y5h~^1(B6O{kcW>q^1R2*t5Z@EO3$l4rYM02flURvZz^Ogz zdWq@wtcOn!RAKD`W4mUU!X6pw8Vk0-teS1jw-kDHdjaf?%RbjORpg zk4mQG?)oz5T~KMC?V%3#EMt3kNZZ3-5HWm>Rd0uXAt;4^CTKDY4dGI02=w@WLsX2D zo<#x5A#4YjnPwo8sk&FvJV+%vjF96UFabmq;tgLrGF_KZ{)I zw1Kb>7;`Hs&1eTHG4tbovP8|H~Fzq zhM1X!+Scu#osQ3DMM*h|@L5)f+$XRUbxi^L0+d z(Y(Z_uI@-W{C<2D#T`toBi8UuAVY4MNO}z__yj^RFPgw@w83B37PvqIKiL+zt2W*n z+5-2|z#BEtU&Tz;lEr=<)fk-%d)7D59uAAg1+2rXTWmexw5qGyK~2rgI@Q@xeIfhv z#f}N%`b)VG7+5MhOxVDglP=S%XR&VZDdb|hu~n5W!-la5(eKbM!b#rJiXL@9{|cLc zrBF+Vf|FEwAxzKIwoD8U(~Fs9{Yz%{<`P{v*$W|K!pW8hMbUTXK03S(1@BFld-Js! zFy)?Sc|@Hm4+&~9AH0FjsI6iih>*9dVR!V_xz82TeD6WNmwUVGXCanV>?S(xut3UP zTVa(UjqQd)SvtT&AUPGp&Y1$j2n_JJQ;tq?K;NvlSaXO_#7lh?&d%{+%LV88HsZx#JR83?mE1wWIE%z z3Cmf%C<&lc@N(`4=DR?qD1+6DKG$Bo@cMW)D2F0v>R;pFoi1ibL!J~_F4lhBA}%U1 zxVms&9uQhq)f1&3@Hk`sMZ~J0BS0^Y>_GiU1L{Rw=uQ^%(kBz2#- z&L%-r+1!V;J$09R`=mYfNqd5neGb}Fcd@V4p88N@QYO z?(V4ZK(va+)6GC_JaD!ePd^(E1hH&96td3p@G;SJqPQTaFQn+yXOUVjUX>l;V2^pD@CIg82IrfB!c8e@Vgbi$KVr2_|FmlVB$mmpTIwc z_}?=4Ma7?F@ChUQep=wpO`tHt}#Dm%s^Y1a3HopcHOF&}0nIyh3Qw z!<|o(=DSJr=SmanHr&r8o*nK$;Dp-|xZ(B$xUEajWDL-}QfSh{1!j`w38eX=(nM)s z^MiPHxC?<3zJ{!VFLO`3ZV&ko;4;DmbR#Bo=BR1RGOb4%>#&MhX)Zr6`sHi4H0klL zYo{5I=3kZO4WxM}@$7IpffF7^;D(12l)^&@nv4OOC>7cgJ^qa`P3~_`BF)#8=48@5 zig}7IJKM5tgAapoItIGI z`5676G8#xqvzOl!w{H1YA$&W~S9 ze8eeRJ0^AaqcpEfendF;R#YlD1-wM@mtiN4Mv)e6p&nbN6jyFl;OWoC-Pl%(ToPvo z{yQ-}bjXI~e*8?&U(P82@gI%i4^niH;VlfZFw)lUg`E9fd^nY9JB`WA0>?eG!;C%lNj z4KF4rg%=Vu83T>;8fl#LB-=mdveQU&VuI#n#IwUI37qh90yn&ZpcJkmXfg(9VpPRo zK~E>m(@C?Kpm{a%>~IYM&SMGO@M8oxmL+I1254R@H0kN2`CiiOOVGTQc#!)NK<-Nb zxi10az64Fi08I?y$R|CWG~Y*>l?2Tji3hnaffL?D;D(7+SA znga=%pC=yP1|h)PAOv_DgaB`Y5HuMBG(Rac>FK1|B+Y3FnqMNG9o|XcgkL6b!>i~*XT5}NdM(hNy+FhTPk;@RQ-1WtG_fg9dOPzvuRXfg(9V&(%s>FK0-25D}Z zp!qQIAX6rA!bb?)@KJ(N_z*#pF+lUvLX)0OnrD*ctOU((63-5wC4elMzzv@vfJm93 z$rzxCi5B^!r<3Mcq`5_c=J$zbhtCr@;SUJh@P`DY@OuPJ#sJNmgeE;olWHf_bA{T; zcQ8(kWB6^I?W6U07;pN0)EO?+sjA3l#XUIbR@{oRaibLBlQ6V~INO9pH5dEu@DwV0 za9_3;`YI@39X`U(K>-or=65GZAu2T$jNc9LYG}@?O>Ft`dL!XL;sr%UBQzQuRnNNpuYo#WNY@O778cKH$mx4<%4gI(wPcp-i=HJW)~uq0WJTVmW5NeNo72g&a%Ml!<(UWmW6A9 zjZEc|7-jkfmWAsElgfA~on`s(o1=7=g$t04Oy#l|WjrQ#rosi%Msn29OWEV_5NS{nkzF0K}bb$cndoG|L_<-q&{sf{LoJjfa z!um-QO{cVG)25lqdhJxC`F^IE!lG2Aw=^fXoykL5ufg(RU`fMEr6D`hTRs_jrW%i4 zf&>lGgn!VCBr_uxMCCSFh;pEJfDeSc?p)@foP)W1z1)kZu=QqdAyeKumo0DYWixuI zml`00mILu%mQq2v{v;Q>a}Lg)eu~SxJ)non>Mfyx=##({`pYOQ-U=OO;H30({znj{ zHJoNJT2ihYd;^0UWq~wqz6k_q!PgN0Ri{^=OoP)Y@kXXNtlB|xN&cINvJ6tsKpab2 zNGet2Wzacz%)xwaqr@xrf|RCsTm_txD;e-**iJ+FN=)6Evm|P4n^M-GxUz_QD79Rt z@({;*+rL=lS;#JJIN*Ta`oMoDzmLZp1%Ce!xh}7t-{&LB`uROG<~LiH-lN5(nT)Hg zy3&Qh?wVjZ6ks}-&Evc(>{6QG7Jorcxl0;t(_)&nje~(XN&af7A`@1|FkmNtxkmpG zsGX<$9l!WEg4@=rzvTCicwoa@di*W62BRzpwQG`I|*v(wdh-@cP<15+s_`m9E}2}3!gkaK&ukL)fpJ+&D7Frc#VD?3 z3ovS#5!*!X#~ljiZr*2}L4H{UNlgXfR4HA*B&=JR8*r zyQ02=TRFJiF1m2s+Fn2&Vw?NHUZ?=<1ar52{<5~3q$sKWF~r32)zQ_S#62Y+;d}{x+7)c?=0_xqQwz!FLI9*H#ABa=C1;^A5(+bof6oJ!FClFX1ot9U*ArM3dbY|72>KpQUR)09gS657$>WlH#TE5$^eg7zHi;JyoQ54)IvPJ*$ zLX>Y9mQg8x`#lm2U*O)s4u47jTj>Nal1|X%Cu}G_gAIkQ#nHw-ME*Ga{(X=GR*w46%~n?R zm}<{xeY~{46zugMLFV+XpJ=xiYG)FEUks*{rHqffY)s@`iF^={DQE#QtWb@W@{%!; zQz)Nks;k_DvdfEvuT$mNkGHIO^?IV!$WDMH>K0tn&DY-P4eng$DLz^tzPN?fmz})9 zeVTIDfy~3Vr}|spW_W}5Jtp7CB7AFX*7}BQ$N@ZMW0dn=ENx$QLry;|edG0JvKuYs zOW<9X(~ot9Ub4vB=}f>8PKGU0@h#nZ9}VD=_0vj=j7_eYb2ORLYkGq;Az0Y`IkJ-$ zxthiymm4Oef#-5g3ScZX2OA9Bx;aysF`N@mT?)ri$#ic9x8HU_BgMpeIHD%(cLc96 z<0o((z!AoD;j&4(c4A-4d1SK4&Ood9h4rNC(q=~hae_&LqfciNU2zi7p-11ct!XGQ z`aAj-HpvsCIVcbIbENShcEH{haia6jOTpjaEu|mZ;jh_UVa*?a=bwa9J2?N`3Q@*7 z|NJoVw>J1MDgMg_pD@DThWKNgf370_JcIum#s96rCyem7CH@%apO+DTJA?l_#YeqJ z{s|-e?TJ6e`RC=t-@)L&s`$S*_=FLDo%my%UtU4{`3CI*QrI{gc!z@85^az@a z0h%xX0XY^uoo9wuljhr$rkoiTiD!p>1h8*T;D)^fFmq1OWDL;6u_OP26upKI!Q^-&;eP%ao>^?`=suJKToA3AZ9}!>tKQ;SfQSF+lTHp-E5Y z`QFD#bGg!#v(5R$v%?(;oNxhw8!jX$g>`}^V}RxtgeE+LuRtUEi&> zf#JRQ2mvmc;Rr=9nTbQj#+1kl&AqS250DpsA;#58rQ@<0CRbkj8uK>U$(XYBHkr95 zB7KhY<0r_cW0g;Gw)Zyj!VdQ(aKe2EO5tLHCO?5ew+n;lF#=wW-=~1q8Qdp8GJ7Uc z8|$1hI;d=N0nvUxKqgGNA+V)6tvm;j63VjXY{;#3o3o)s+;gj?@hJT>P5Nj352U{f z%6~0*X*u9fhz!tbvTEPQr(oEF!tf?F`3tp@DJLqy^Yjuxyna%CM&&vCpI#mvkFR6f zI9}UEiD%>ouo>Vip8#k11USnlz*#;)lQF=6FG>@kCsI<6#`x<=b7i8v9ZEc$ONn9ewm`P8ZKi4_{G_h%by{)NO z%q@}q5!S-6%T<{MqZ0@lq{#r9mYN)S4x_b=lThhuKGc|>aInwNtz>M|%9Znp8<1zQ zb5z|@jPr>_Bks=a>QF1dM&rY~A>-OJvTSL7lvh2741Jn3?FJ6FP6{>wPj&U)(>Qks zcQUgOp5*Im5DkjVf5c8~X1TiH;{i5RxtukeqiDs02_AXunLV2upz1D5_sD`7bMdz` z{@#PXd(0nBu3PSN;l}nA29K7?P5RB?hj7BW!u)Y#u?TpX{F%pECMXW4W!hbeHLo0>`!WS*bOSeEv5)6oI@#qE;4)= zltD=%A1unC2(1zp#wy`N?dP!991$z3!+{ZS^UYtxsxkXhSMDBsM#_$%Nai01S6HL* z>?5@YQ+}*dC}R8o`AxUgBj?yjR=Tqu)i7DU+9!ioA&ctFqB^sv&Mc}k%j(RcIR#wb7A_Wy4gAxJJCT)d(x&5GTBw5)yOwj zMWWwT!?;)7OkQ~rVq)?LOS99WrI|Po08=iyRucyT-Wvso0|D=g0>ptQb^HrZBO>nd z{0E_fGi!E7;JpYG>#idasyINa83l*~0bvv%4g{PL1&HH3+y5{UlM!5PfBKifuX>)n z7^x{^b*&ZP5C6gF!ux>_Z~=jTvk3HHy!JwR@t_z+;nsso+d!!s2c+JX{1fZ`bEL$UKQIDO~>CRU&#&&rS>40Z4h^3NzFBw0mooP#v|9|JMb zS;TTz8aOo30!zG%ZkBA6i6)k&6u4wEh`CoBb8ssR;C=q3h?!7eqTD2tMa=1lnGGg^ zYuNx-<8%HCNSyssL^wPQ;Tg)*F$!PAi|_RxvBE}J3&9?PXfUSMO!TA>_7>0;A*>ca zC9yoLgCc!irVPXD=fPUwpADMA>$Dw=U=@U*4@E(q|8wvSjd+(tV>|Ez)i((o(Av%YA+R_mGO&abVrkYpP2nc_PA|HM$(tK7Uu_*Dx*Fz}QB)UPS}9 zK8v)5&q%BXPv@G?4&O^q3Qr?wG7Q7+S7Zf9kFEeC8lNMLvz5k6Eb95hvcnG&l*01} znhXPtJB0>4{%;UfbWkotK0ePf5C0bBoaqFY0L+1wiL`)S(E?UL${hS2p%%XWkq`pT zp901W8uK}gjqIk_Y+{`E@QmH4rd_B_M6pj~s zJ%o_=&97r=YZmQjaNOq-@HXN)!7@a__yPu~Nt8lur3T_aM!67$ALRJ|0W$I4RmLRV zs$V#|NyV%cVLO>yvX!uZJ$aX~-oi1@v6drGw=+-n2!}%2p2a=#RcwS7%-un6e}n_4 z16$bJ=#m>^amJ29=OGj{a1@`1LU-q0$(*`c>p@h9QF8L5 zgBjZ*2&>o*W<1%!44xU07kj=v;)U9-xdXfyK0ncJuVfRo!;cU+;Z+2s@Ct$^KcU^; zCGD0Tv%zEk=KA7Gq;+9}*2jouhaV?!!Zie?a5X`bpFrzwp+!#ztuK?-#R*!UB$^%G zK;VS1n?zdI6Eyh=wC)jF^mNer3Tb^fLF*Qx*&!~6kk)4jO5x1}O@0EcdxaJ~h8FLl z3}Lpy!+vauTpVBtm8wrenBC-(p;GoCoYD>Ad=J4K<2ve%lz{l0udDH@jXmWa zJ?J6wXd`ZDxwZM$;4dAhLWlNC_kI-KRqKZkWH%K&?X>pOopjA8jnwtpF5Vv3J~ zHf4Nt)kVw14h@tl{F^yMShWSw3{%aQ&ALT)88V~GL7YtAiLodh;Zm2- zrO9F3a{ND{QckJ4Fwtx`S;kD-zaRX|dFgpS!t@~X!&rD&Zf+3X-jL^L%SfcREoLyJ z$A*veFf5EtuMc~S+tb_>VG4{p>#|?!iN_!t@^&w`p=q7x_~${QFNP19vuoPf1|K ze_FAr9^pSuHw(fPXQO$-v>OgAB?AopaFkhbAYfG#APxjv76pg{0hdPs;y}O^QGhrQ zaAg!A4g_2k1&HIAR>>Xz-z2ZD|LrKBUx=cL1Gu+E0pgf$``-_IVj;1R>=+nT!* z9E;0}d6?iYd5$*AH3R}qSjATSXFwbH)*$d@g|(kGS$aK(>`@fFh=S0JDZ^r~gdC#3 zps(+Zb=8I~HOk9<-zakFamc0H$#o=_p4^sLD@heXCDxsjQ8q}wF+L9*@f_^HJMVff z=fURG_fZKZ8pa>jx()H}V_i6yCb6=~=;+roLAJtNnnxivR(jB!TjGBgB;qk%7>5gB zUhQ}>zutu%Tb?T&ydE+GFgEBTw#psRKBCG&9_G+NQZ0n5)*JV_`LxTI<1{!euaQ7j zGl>+{id(cRtOgtxvA82ZmdM2A7E|!_Jn?(&(bd^Y61xwwL2v96OlXuWdLH~Jxw1<~~ zbve(VRR-1sxR4Axexl^z2ro^@fZC{qdSmbengOO^*}fI6v^2$cJ=c}4F2b*62j9eZ zX&h-Q-OnJroPe_lY;=RK^Aq1A;5=`VR~B|JKOrJApH<|P|n%G?~qOG zYr%z-HywkI9sB_y!4>%7PR^^uVH6`kLrq#z+Cy8(;dLI3&QD;cwj*zVpC%_hO~xlV zk@cqHlhi!NA4!Q)$3(p*u&7|m5oorBxUVvrigmU9B*UUMWlcuoWxX3JlwfKT$l#2K z2OKPaAIgvVEn1V&^Vskl6$rsLIp)2T^%TB89QQZPu4e~JAQ))NLNYAM0ygF=m|sc} zGOODPb})j#YOu8%ua~jwYm2YVvjcvMc-w2f(n_d_0lU&>tmrpE#%PrxFNxw()$81|O8ryD#1*yCs)#{~OgANbVCac`KdqAH-rgzQ^iXS0nF_N!|lC zUg&pjDKEp|T^Oz2q8A03$6#`9urG#GFQ}j#UFkl*pXK4KJ-KlSa_u$l!*6UV0jbqR z#V_sl`7a@jgye)}#XW55Q6n0}Cz)U}sQJG_v?!O9AGsFHAy|(ypM7~Zcn}TDOat>@ zL;=*cCp+x?yXe&zcCaJj1=H~K28CTrYnLfT+Sd3k^2qm7gU=xjZnHFAlK^ydB3(ao zpfPo8#PDZh6dk6;2bi(MOFAvmdy({XLz;v8dPpBiN;5&4NMn=!1V~%88CK&g#MQ<_ z>!jLXO!6a)!yMcTGJXC4*-rWUfqH+&30h|yG=`%~lPnxl5V4jT{uv5^x+8Kh6+!s2 zFY@1|L2mFcKBR+b_>#A3o4djNlFD?ZLVzl(&0+Oh$g=JrCZEqURBIUP{9G>#BB{~00H?vQS_R)p+_0Y<`DFVJ zjeHM>2PXiCHT%Ud8^^}jconGzRpu3@llpwgHSF)q@nP9MqnV`%dnQb~NIk`g#Yq*K zknsX+c91Kih?i)lSkO|*=!aTL_gb_If=@8!gdx|+evXW+MB;rxZq=qxOHcryovRq@CJ#3Jl!Y#)*QfQ1<<92h57pF+&8;m45`>i9nbNFD$C1mgS_g$ur5Jbm>11pEr_Vn{lehydw# zQg4N{BXu2gBUs*bmN961WY6i$o?LBV4t15#jR%WXpTbzdLnIA>ij_$jx2;KV(CN-- zqQU1GtJa^f8zUL(B$E@Kbn2IkL?vU*J4{;_ivzYR44*2)vM)S{C{{3#f z{Chys{J)ofG88E1Fo`}Kvu@9pe4^sNf(9${liMRPgg79V_+k_w4g}m01&Bl1Z_0WA zkpJwy@IHKpwCR3=;Vr=7@BwkkUF`?OxeOH=!jdi`%w~iq#ffvfT=)$-eF$RFa_q^~ z9fu!)*fad5M1X8C7k*8g5QpW$yJEDj$IiRy#1ZBjC{p4GbFgP~4A^pH`IJPSOA`0Q zc=y7Ib*F7DL^-~JwlsWmLe_g9#kzKg(|^i(?2M9_bPX8hDWekXX9|42aHYG%a z)>EW&Yl6-bjBAHqCvd{A5tPEm37Y%_0*{ga?NZ{dfb~tb=~VgntBcqr)j zWvN3bq8&m3a^_9zF4xCX5V`1fWlDYKJ!@PK>c$gCTw+k`r$XqJIOKSe}6m3k;CQlK*y@^`4YjJ9F(C#Ji#dQ2!GOliRFp6vixOMkg9+Dq#vh^%-toXBPyjoU#ZiPjkzU)!!Uy~dWnD@|U2p*CmkHL1tn zTn4GNLzp-c#h9j|_r_6RI*#`*LerE5jY{Fy!dkabS`1`WL%@8Dl`*EgetYCGv?M)z zFws6KqItas^|&?fuhtOfU+V0A7JPq(e0K(p#J&T=JZIm=Y9u?nHS(IT(=Z?eJUlG{ zyQVe1jZbdd?pNa-g?MT^rhh<|)44>>=1#*?tn;w6Wj5#bc#WROBNK~Wb?RvhAk-vV z0y)^AMVZ`5DgTGyV6W#+TQ#tJV8|@qGp!Hl@jhhmK?EJk<##k@77?n8mRA>z{*-g4 zn>~hG&91_Oyc1n-cs}?&GZpN?I-7}GcRQ&g8|+O-Z{8kx0=(yp)T_>79xDs1B!e4K z1z5OsQ8Yk%vpx9Ib%IJvb|Z4JfQNw}L*Ju%Ubm$+-yPSy@+G#Nc9r$oB@^Vm2kOO~ z3U)oqdTgnJpkv_fjN|(xUSGmmlzxPDELBG!-x)ZvI#H^eyDlf#9TAf{AgxyGXoIcA zkJRVK6968$w-og|ih62#G`MRu&u*>Pjm7KJ1Nsb<4{UQ&P39#KJ zzkNnO4VbM5#Pjv5G-wKfC<|cF`!#4Pf;gd1!znt;FsU ze8Ki}REx4lIJtBl-*1X=&Oe!88;%VuK~ky2?C&K?Fb^^0;{KD06KsnBR0R6$sB`?H zb-O6ppDtU+i7Wx;j7ReO$LJPKrFYmD>EmZHaY=j>E}RA1a0Iv zIdVM^3r!d129VEqGOWKe|f(?g1&_1q5y>z?N;)&fi&e& ztX;Q1U(2W2+*qadMj2cxx8+iKj$vy#^0>&j+~Mp^4}Tc}P#}^0 z@tts6Gc&=Z0<*!D0x>SE5{DzZ*5ED;O$V3L(TgQpqWqg|<=!h3lXz6NK#ujn@>nsZ>Q7Y0>^xpF0 z0Ztopy?u7E&o3}LFwDxG4By0}%G&>7?@hp@D$cgyGv}P%W?`mh=`hU2lpHo#&-L-E|JylgFM%KWMgp#_|kwHY0DJ|dV6su%L>RCs3 zd$)+Dd%SH?h4BbhD%qul(#zhSyKtF*C*x@kaT1qIiPR#q%)f(EgV2aO%Z#`OU<@*G z4^ZY_Hh1AA*m`Kd<*i&lU-AxGxEJFRK{my0C)w#Wnao(po>q4@xXX3Q=IA1AZxkH8 zSLuPv2)RVlco^7E^RutRC9k*u0hg%pRHyB2M^9TKJTD^H1Dk19c6eixW2c-OG`%>fM+MwwYivGKRgFVLAhHqv1(Qc#fllr%|%STGx^sKP8?VXF4sb+<$!4!I0O& zxUmoX9OxtLKXe<;H*O8Vhi<}Y(}Xjo2|K0*YaZQzUEO}se=?cj{u3!@8XcdhLr2*j zSVa9TfSL=(9upY@mC!hqdDcL4W7SeTT=%_#q)y3>@JQG18YpbZbI% z%OO^b5~#v$C^JNF$325E8$}NADDx+5&U^CF-6?{)JmU$Tqo{Nh8@y`!DQ;ytY=Zw zvxuo@5V+#JW21i{Yax~~CO@yW&Pg{&o#Pq`esXfF^OH}>TRIuZK zGNma!Or``;I9Q@UInDtH?{S7_{9+5aGI8aV6DAE_sQ)t;DdhXmD)jKC7aVihPeSi5 z!gq14Cj`6RL}q|f43tuNF5~$7Azql5h3u+^K0UEmMs1$5KdCub=v79X6)RX9%0yyD zDDsm`=gr7hKyjE3rGrB(lpr;WnNCr%G;3#SZdJ^qA~MfR@J`AGUBW?oS^IR*ULw|W zBj?Fw)p=5tesmW94O?4trT-= z@@153Y6W6qYDLiQ8?DEl(|N-?Xs}ameV)3HX0lgW{6d_1suh_qH9Aq>x9S9qycO@i zQ9>f4VMI3ZtNOsQZY_HJdQEp>y{3x=rIo({F8Xj;Ki`XTLnFMtGv`CZ_er+x+W5|V ziUq0L9{LRNFB=S$0inOaf)e*EnoW~-iN3a}Q0fTgFrOiqNpl*HPn?SRO#me6cSYM! zPiX=)*}&jLAW#vh%9+qv2@XH?^2Xh!PPc}U8JTkcoJ{7(o+P*2F|Vzc7gIO`!ApnU zD=aBJ<*SCkT*H>L*H1A&x!$5guxh?Q(II+SJzr?ChqQSIm>Vmn2E3{ni=^`S(roo_ z8?-?!D|~tb;rMd^>)nGXTs5{n2d3M0v(?)l;5ycFqM|N6aVhRSxYRZ!V#~k$f6w_3vHIr-K*kd^!U4Q%k@z zS_1Bkm%$5?8Z8pLHRMoggd!9r8gN^syWCAGWnG()0&n-K4R0K~Aft9>HoQaa1#jt6E4RY7|LIK}ZB- zG6MPcf=q+A8%qk9ET6fc&#_&~8WGJhH`a+=Exjey>=+jsqcrahFO8f{#-P(6)AJ{B zF&1r2cfxpPfYq$m7u+*(yglHqy;226(gInQ;c>h%s7V?`E2R-*EZm=Gd>{yi~@KfEy@hdxk*91quxHiK^|gC zR&vFA8T-Q4B!X+m6M^@V#^ZiXRjm}y9{^{-R;&nv zZaFga%rZXNI!z|xm{~ynEU7#Yh!gvv_9zRt39epUc$-UCAZy_>f$=ia zf!sfc(aRlxN_Q~6umA~Fr@X9RyeSetQw{#afAYXq};h2Z#yA_Y|f*3h!!AieAu8)(L~plg9J4C*{8p{$7#rxM3Cw4*~>+M_Yt2MF~iQ%dUw$Aa>` z^_QSrhLLBk%vL7qRwinZWF%d@hnSJ~h=NU>oDBN-W@`r{UtE}9jP9c5Ml6|UEJl3z z&s-1iB&tzKJ46OCZ+8w}=Gc(zFq-dqVlU$URp(Eer_b%kjw*)s?Zwgc_9o>yoCjD> z$77BxAFy~Zu#gW}tPL#W0~QYj7V-g$hXV`wfW;$$g?zx`(ZE7JVDVUBAs?`KJg|@t zSUeF}$cMBY>c%bM_yqmzA?8TsY{T0PiE`w~@5t-A?ukKN*6mTseON>hYSsk|<|5cz zX<}KieeVit>M3Jbu}-u@G1QY&R8?cA#m6;OwKOhlF*685uSH*DUFDe<%yR79k#%C9 zZplpx;1i{j&?1h;OiTw0dlPUXv!Ep*b7RU9r`}aL`wHaoqpiJ5>(7cdIbvEd=#>*{ zjvH5u%EPot&Mhm`d3gPF=0fS=3Fn$bnn0@(`P-^Q>hc_I?QyuyYs#y+cHzIgLR0No z&8_SS(2nPZB_=kuH%mS`ZI7}%D&~4dF;_O^AP0c8w=+h5?{b`uxZe9JKKsjxUTN~Bq9TDpyE75&5n>Re z_ZJBBuWXO@5HnLN_V5~%^4@~fNL-x~8CcB-I-%W_vJ_KPI_3SS<=i91k!9%n^6Hb2 zmOFJlE`?HUDNLjv7yrQhg*vI$=@sFor#CD4m;+T3Z6^Z;~gDI~qD7$D)>+ z?7)0{R8&WME(MM`tSaZp2NalDj+bIv_YLD$HlWJ+2)}sM_z{HIJg^jO1Ggd^11Z+clw6g&M>WaL1F7c<@)NVA%44cGJKt2-XLndQwix zsECw2^)51&Av zS{|f9m3Llji@WXAZM-AM`xV^G((4he|07QdO(@bt$i~J6-x*2pIivd;I57qdY52j&ALC2zLeG~wC8#*7(LO1N6MzMk3Ux0l% zPoSrS^?Gh94k}6B8^0RS$8l>Y&FfwFv8V^WW|vLd;Zh2q$B?0jblkr~x)q&kl5}fb z8>EpTi}l_1&@D(Blf-(NiJ=g2+K?F%Ub+S{k>GB+6mn%I@{Sr5ZTRM3#dbX(-*2*A z->%!W+(9{&O&Ishk~nG_iL16CiKs0}@J`@Xq$xFpq(~2F?T<@qry;nKvNT`)2gA5i zhjA2&Ky62lw%UQjQ3E8dnn@B-vq%ue_Ch0SHfc(2OH!mqg!P1kMT2(?@N|Ex)AJU? zx+j#Lz3I_b2aw>tRT5Y2OA=B0ksz%7NpTA+Ns%59#*-2T4WaZzWIgat)^oG(TJC}{ zn?Z;56uh zZ(1a!vb9uk;S*pXq(is=EMOrO&6~8b_pVAA+Tawt(_t9*3@0r#RG9-=hHEqFd*bD0 z<{gV7^`U%~^ZuYi!)d1@GE4HHw7r-o~^&Q5PD zbXXqFWL2EOh*;Mke(y4VJ;UUqF7KDM$8veQ!<4sS+(3C7uG;eMVR`=%fq8!_N0t2( z*ShZ^o`v7*_Iy11j)iQbwmOQ$QHw}ibvQ{xEha&GK0;_j9Z8x}gCs?IM7w?kVQ7PQ zLa6UxSno5e`*m0+GOQ)^XseS*aL+A?t4<_|sHG$bYnjl9T26{va7l{vh_L=FVbS0% z3x$RA6V?X|Ypo7zIm0@Q9&ME;NvTswinId^^x+U?8oZMU6U@oh6XOw$A@`4;LtnNU zB5~9Tl9W1|q(~<~{Y9W?Fc*&#i}Cr8SdVM0A7H7ZK1pwQFP0>w&Lb((4j``y2o1ce zTE}NMU|4ves_>M?IE87tn7(jV842F;B*8nLBzVV@q(}}R{#6iZ@J`hk)q%4PJ3?Ku z0hrKw@o{$#P7mKCzu(7i^%aC14>6BU3^c)$nQx2keATssRB**KS0)kRF*D}9jyS;o z?>WiP?)9%Dq*824JYbhgdNunnb4@Ft05OOVD<+}OS5HDY!5dd6(wLW;So0Ks ziM2D@3>aN*XK;D&;nz;cWVg6B<6|iV1>@0LTatHXl(o4ygDOoaIdvQb4K4%!Qxt9q zK2p~=dZ3bTD%&>Ux)AL(5iX8ze#CABLJ7_QP1Rfra z9)j`8G=XCW9h9x_OT#IkmeLwhj$R-z%a88YB zZ&YB)!zub|T&^2jB=QE6?dCe8g*@^D*Zax^BQfvq+FmP2aDK55u-!7Y;}^h>)1b(K zHV4u&8vWDpgXxTeFiS=ox2?#mW(8+8K>#vyVLl&)iWniTon7Jv`5dXvXG9u})g71t zZs&~G(9Fw6QE{)O&fAy{2QTsBNK2@8aa2wu>HRGv!jhGC^B zdAZ1MR&5Q^E0n1jGtuCBO;_$^s9Cv)UYct)7nb34#2V#@xu|z0SkYb}^lR4<+J!4o zdTWAiv#gdd5tSkf?r@A+JHUUGWmWQz`D3;J=3I|cI1BK&CdQ5WXXA@?nNY!=HP6oT z*hx&vok}k?tqQZ!H&F#!a)sK=sht{Y);(%72rBM4Am12j_j8DC0>NylqANQOMIv$% z%Db9${7%5?p& z*Ca)HKp5{z7&KIbu`lXf8^ids4nwgVeov3KdVs`H_ma5kK9Y#KpCqMzM^Ypsu-_AG z8oYBu<-qxQlGv|>;*VGIi2V$SqaG)5)e|HU^&|=6|CG>(dYUw)9wjN#Bf@%L!lI!f z9Sp0TVf`%>)(iA#t5--I^&*L@ULuL8mq`%TAB9HLpGZ^cd6FVMA}pNkL;a$mCM@)U}L8HODM9_luQ-)aUHI}S-dg;wpeI$;`lBCpFk|LdeWeXM!dg&wWmusI+ zVl_+_`S=lBKW$ELwwgrZs0k#lnn;pTn~@aB0Z2z6X)sTvlrX!9>1s^rcebQITg@PG z)K(;}nog2ZTaXmV0ZdmgX$T63X=XgTi5UxFZbyH%nneOx90_D`BoMlh6v+Y1h+xtX z#$=iF5VJ9axfA`_Y8Mhm?M#wV^GJ$x0$5bQXwYET#o`u;>^RE@EGX>~3;DP@{~ous zgw0${Pe$323f-Sc{g|T>r!k0Aurcm6VxEJk(VRjHA_=`Mr?41frP>?8+p+c0QLrtn zM%5@>${O_?VC^CP@*2l;{mWp9>0#15Yrs2m0xf9v-;M>XYin$s@b)gWR)n_?!gFIo zB>v?DW#DZeHE`q*<49!^QhyB)`)6r`qa%%m!*bsP@#{tW^c6QYSV5)Iyo6h}y!i8YQ`UxGcbt^rZk;s;n?CUMkPNK)!Lk|Lde6&EZT zyzB8pEJvQx8BeSX%8EW0qXf}Pjv#@Qi3GjmQ9>i?Xiyu^D0Z@Bze=bCP^Bz1)@H=& zGFZpZm#dB?iKycQ!&S!%ji@D{#Ofy2*ND|ftgG#nC&ERPcTT{^`si3Pd>srER?)?4 zGHgpL*?P%#gRs$s4Csl7A#v2FNL=-4l8Cy11Yun$G@>pdO{q_k6zLIRwMtkt)X3*1F|4UNERoM$Mvu0- zoFt_#B`MMlFl_=uLs>pYnVLt8Ej5OWFQ2C`TU|ktQlBF!(he9&!Jwg1rZ$-v+h`1t zseOsQP=`ry_c@8Ht|dXUASsdqi0y(%gO;hClFx0&4z$!+lrQ|I!q4;UOQ`T8AFy~K zu#gW}{5i0Y4_LeySjfj-_Ry=aI7u{&EF36a)W4tYluQekDLON#mjZwC0gIOd3;BS> z9|H^dfW=>Eu^To+6u<0@_j7dMq8{;D$%S8by6o~Nx-doZ0gzV$3;8$&SBf(w9)?A{ zo?K+?9PgW`;u8@`j~7MtUux$UA=4D&Wv7=Z@{^L+j4u5<+1~4n3^yLHgHQ!p9FF(5 z3LDe~_9GXA_M<$p-hK}5Q~{r4howtcGRji`ON`|4d2oe92V5qK=wLV8=GV6hXbbdX zeVH|8le1TwJJ$r%dl3+YUC=FJ$rwEC_cZLx3NoKRmX*RAKs=zdg5RpKbS6TXD>4Qx zUf2THMa>?|yBA#u3)-}>;oQ=Y2uZED4zBfg0GAvw#{RG)`~Eqm-LlUCd+x?(T>)M*JNqY&3L%$TX&WiQxb$f#~w%5XLDEBS(8zngOf_)%4EQ{yZZ2xQk z;*GbA?XS>ZojNA+?h#%#it^SyxQH3A9!0yIl2ecVq^*av=7M{KHzM9^H#XkfBd1Qn z6rBg=;W*r&ptH5FoGnc;lP$Q4=OMs1KYJnkK?ZL8m@5+bULUmQ)6-)KZ1&qYqaoYe zMtpNVOC$=8=5_mK64~sL$8c|KNk_z?RFx7m2iG~+=>XJ!5n`2OWNp%2>qfF^?=c1p zSxTHo=SwBhtRFoK%H&($*0L1Je^w)kQzdPVcM~+48pqxR-I7aM6Zr+m3SmAyiOE zj3@sW!gy-a!rJL?A$`bLR4rXkKWaaMOH~&IH8skbYK*9>Q9erf&^1of)YZ!Vg?(8e zh)3_o-j|JWOFi6J{aMw+eVl#iccJ~lZWethKdVCG`1ilrZ`&62C$`Y-&5V_D*(?@6 zZFc7xJuI?+Y+ARSed*G!^?bgw)$WqZYxE$nu2*03WK5NWYp^fac+K_RZSWwy z74I+L85+GkWvACl&a^X~UI!+n-uE~@MERhrx!$<~;5-0C!_Ni=0NX?}l6)zU=5-UXJ)#4KULE`W zx}oy!)1du-`774Mi5LvnS1v&sx6<{)F&$qa=GV#&zuGoKQu=d*9>S7$YemVwmIIe+p#oTM|!UEgZ75AFw%+2LzAzPXQ z!`Wgm*O;Fp26K)13Nch)V~)x1yO^@dY*;>IJ~|meO-CNsL+`;cbnXRl=)t)c+Tz?x z3dyTE!&>c6&b@4ezZnwV`<3B2Iy~AUymYH|1{tS9lHkO04S;U>IT!Yll+0{QkZ zJdXAmW<~f7JR_>Zw}*%+`%TdDb0h>b=z!;YQZI%We3^$P!^6GhcjV0|Z!RL@Uxg?M z;~Xek(#G+>2rId7g_z`*bZb}t>RSFUmH8d30Xwr>vwb+;A26=+wQX6fl=a=vRASNQ z0bY8bwFoX<+9OvVW_6RHE^K}^Ru`gwt|z0i(`s}Mx)DiEM!C&o?lS)bylB^odlO|I zn>)R<=+P{)=;4xRtTuP9321rI)0~?FUuAxVM^&j*V3l8k2+I1XIoF{ry>&>h$2C&0 zzsa@=9ZhS6yqDq1Vx=M<_%3`a_R@GWj{kPxa~5{zyblPr7dvg1ZN%c)-fbjbQJ>y~ zqwT$c-%js7{FXt{^I*&LVfZU66AE(eW~pWxt(T0hHwVSxp-|wF8=tK6Hz3SyB}@~f zRJ|_mg^D2ce&sy)#MZLP6vmVASl+ zQ}@FFO^adYUh-uSU9^Q;fflUAD$m7bK~UM5dcC=Lf36NT&`*e1TzBHxGt|F|e9E?Y z4_Cw*wXlBf!$0$za+o?eW4uQ;4rWA*M>iHDYRxLgBN8rnv(_q?{ICg{$e!sqG@5?- zTEZ`;QOotWL-`hFX*rSX72H5skgdK&;;3(sxaylEDfM-dA~_%@%AmW|hOk_JH^g^< zm^+3re@K6}`Uwf%Q6q8Hk4f;H8cC5H!0Z%E8p4>A$<8F^E*ewzNq$9twz`GHQ8$yM z)GtYjbOKnHfYD$!NP;xaBG#T7YZ02Bx|7~)bq|T7?jmv3-6Sb>2T73}fb14X8ob5u zX!4Qq+n$*Fh2r-B{n=_QiK8AQNvZouigW^4kATro6~EcUIye-+C+Q9Ql_ZXOio{h< zlcdxWBt>!na*ROI5RM}8k`&1S%&~$=L%2+c zIfs~wLzsV~KU=*?;;1)BT=jR7lzN?{NDg533MLIZng)BVsv5W!nOYH_`vqSa`-G9gr>v=O&~xEuy-Q%Nd`Mv z2fNK+)2$Z!WMUsoY;0gxWA9AtQw(-T9qe|4O}AQXpV)^G`>K-i_F&8|CaYskT_~L5?Ad`l2W^n6v+Y134%$3_g|Iq+?SYZH0IZd zxj+5c>L3zF9YEr$14&Y9KawIjfH_exY4E;LiMby!Kd&)mTt1BcY_*WYQ42_1HAs?D zhmsV@0nAB)Nkh3$)^%xrVqO`-Jd*xwbqtB4jv{f@(IhE#1WAz`!1M%@hHA_MhFv@0T=d-37`J`EMg|oT~HC0dAxgw?g*7h?V6EG)aG>d5r9VX(;p1WOzcd2RwCM zC3~RF@UjQtuaG@x{te0=aJN`!dHnw^*#p-lhp_J6pzCgmebxo6pSHS)#8DTLq|~QL zigZGyohp@<26KXu^T&;sV{FrEBp@Qk*dC@~rb(7$p>u zUL1_(tmPQ<`Bj!<%x69SR;Zp|$|`NEH6)I@jKo!!lcdyYk|H@!-65cY9D|17z%J`M z+s>iHyisF{%;5|42c0q!M_oyhQdf`^=>)JX1dN8NHT_}4`o6{znZq^oW~;A|IO45mr5MI+WehY~Cqfq?5N`JQcI*FscMv_w3lN9L$u&o4)hN}1t z66>Z={JuqRwz`qTQQszU)ptlz>YF4*asYC=K++J7ALRoJiTQJlDSgk6=+9O+kvQtd zB(C}iNlN{Yq(}~6&Jau*!ev6tMa2A-#+3Qet@MX?n@I3(6A9jJBEh>&Bt>!nb8Eq* zp?Z8joS3(UFz=#2Tm6>AQFoKL>K>Amx|5_x4q$F0m^4&lE+*!$Lzwr|ALKzKxE+ba zRS%M+)O{pHasYE%!K5LKN!iE|#Jnqn`4s)xY8{EAo+feCGb9o9EJ;c|Nm3*uptlof z8UpBA*+{u*Zj@|<&2!WHfa=e`X`C2{zZ~f{~#%n1DLY}lZG;;mf;*j%!dTi zRqumA%Wycu(lVU)U`H7a-E40L>_vvNEj}Q_c^E#2mEjyq>_-gt`a0Mj7;L)LVn0gk z;bb_+5&JQNZS~g1`$L0Gw_5DSi9MVQ=Xhd2VX*Bw*bT%)p3u!;Q-)*m@MS_eB~u<2Hd{VcIJD8nh$jF1dxJ5+|@WH?p) zBE#7Pev#p90>8*`Hi2JcIGeyPGMoy2z3x7ddH^XE`zdrZGi^SjyKU?ic;;0=+Ts4OzrM4$2k^`7?1(Swq8O|xhd|zYAoMadJv(@e-j@p&PRlAX- z)XpSDasYFlVA4?TlXYG4iTPm&b07M%)&3-o+Ly#t`;ny7-XukG0COk7q@fz~RASow zqC_L{JcRyibr^}G=99SUP?D57n50M!VD2oKG*n}rM$AYE^KkmJ)sZAP@j!wT4X`mn{ zqa2bzo}+KTOE1e5=JjEN#1@v4Tt|Fp^$!vG$QsAB4kaM|Z35=-GM<_+x(lt?mPb&C zzio{J-A8oMhJJ%4c2kT{4yiQ&_>i&l$u@3YM#e;9fl+Sphqay>zP`*W2N9*!jqr#Kx=4s9Ua5b+C&D zn{Kt(qlrD-eB>-*rwsPFb+A_&Y`WEAr-?n>eB^9mXAJfy>R_)j*mSEM*E@+l+1nAGrv5j5c`*iK9M4;;M^DQtCpIB011B_mHMZL-l;5NX*SOrp!k^M}M~Z0*RwO zPvWX8NK)#vBt>!nb5Fsfp?W@|h&fqf%6#Nn`m@z_B#!zriL1Usl2X@@6v+Y1y#$kn z>iNh@VouYTG9UQ{{n_fiNjI#GIiqWj^vl`h#8z z3G`Y>pw~hIy%v%pIe@v3VA4=MA6Z4r0gWm1kzdgt&hL{zuZ08$_DP`LLQ*6LF!vQq z8mi|bpCIP;8dJv4-_W0}?jmv29VD*0lO&~XCn=HxnEMGP4b|i4dBmI(!u&n`+3J20 zoX;o0`Fs)_%qJ<51DN{@CJoh?pCsnI5az@5XRF6Z@E!<>s~#o6vmhizascxH!K9%Y z^L%3N62g3%{vabEanv&;u6mXvrJf=wk^`6r3MLKJn4co%?jg(<=?}62637NfAR8co zY=ERl4qzT6m^4&lewvtjg)sj@f3|v^#8I!2xazMYDfKEzksQE0STJcQV^-|ZaI#U} zf1%0jzfgzN?9p%rQ0Ae@@C>_0BXffaeNgs7WqnYn3Ueldlf=+oyaG}oE%m32<_7pZ zPwPP1-o zW0kHc)Ixbb)h-*Gsno6IZB-rB*=g=;ipbgZvjRQKat77xPkg)~Ynk84NN1g}tM@cM z?x0aGB61IQ-LNb7LjDKBj>>!2CT!?}hB95ByDRI0e$1f<`ym&w&)Qe_S+XDU5B5v8 z`X`B_-XckK++J7ANMXUCgz~Vl>Lx4`m!nbD?0;P#&AKJmXSg9uvZxMt`>2io{V{khp3~l9ZZCQX~g37YQZ})tHwN z^Y{?vcJzlkNl0)f2?_2bA;Fy_Bt>!n^KikWA&kjAmdlBGVhD3C{ozg$5=YG=an(*F z5w$Z(O6^EeBqN{~3p5P@w5*X?{%eT6JcPX$J=$tt5=ZS#;;MZ}Qfg0kpC#rgA~LqL6_>(=UD!y>GGF;bOFoQR*Og+HAv#Bg(N9;7)g;FDF36R{AsA} zr#?^2(?fOY82Yo-@g$Bqmc&)Zk)+hoBt>!n^Ju}OpexAH9Wj5c&T&S}k=Rt)GfuR(E!x{wz|ZK= z-mS3Lx^iPI%lZQ9B+jXwfn?(WAm&HZf0-Gw-jSUw-o3Fi_^zzwbNz?Fxbk$=O1Vs@ zfRFXjBIgh`chbFICCIJ$V3 z2dZl}PNjuo>#jVbGJM7GpOWzD;=RZ4-^WkXf1reG<2ttLv@>TnChfv!(tc)T*elCv zr_08rop_s`cJa0Htjh4uEvKC>_0#TJ-$2^GDEV)DKf^lgp-lCf4jGLjbUcREoLi|+ ztp#@oVAR`8_X5U#Hl*gA3*F9zQXRax;%U#2r*3ml5#CrENAhNF;K<@EqdxQ~FMDz= z`c1_7>Wz-`xuM{3M+D=HM$I--8N99%ayM*qZm*E1Qk+dEH-fhgbGKP#q#0*kvHPWp zIA^NP4I-cM^a@ww%>(ysJD#i1)jo_pz>#dQiH$hMj$@ zyif5vjCf50PlE;5IXiXkscCl7fwkN;)7F5OdBV*$^fnJ=7O_OrvzGuYA%{(+&Scvb z#uqdj3uu8y(I$9hxg6h?RuT7q%g#|+LeshfLab~FJod|z-fX^j945>Yse9YMtzHN`M!rf>z-Hiy*EeLPH>Zgi;EN@*Z6lKBPPlnyh{-K8#pZ};CfMR zQu*unv<+0FaX)F)a_sfd-=W(oyo`Hy@T4xA%}ERy4^H4(sM|Ql$klnCT_3GJ0)30? zU5?0=-a_R%f^SG(i!v&lkD>?aKY*yBt<%5VsbQ$LY&@8+}GIvex@Offb^O zba?k5CRSiqW^1;ivAFlRIBraIR}LH9(mf-Kj|k%HTHiu^udf$hSq9YBedHpp`PX&7 zW!&C2ikCJkPbZE#iysr)gCTE8-8|cx~%>k`iACoN7OuahUU1SBhjAl4nQLuB5vo9<}N;q|h3viUMH4H2SbAWX?XC|$Mij9O*^@BWYT znfVSp=rQ#cQ%>mNW^{}iwxFcGjjAjtcwy%>j|%|&Lk?Q=@pCBtX5c&Mryjxg*EU#Y zrWYO~y>N3-ugclhl87A{Kk7u>7H8T&8tV(JXYEmwmC>lq#%SV1osDSEIveq@p`DCK z4uLRlK+3t|bi|PM_{eFGSEW6Mw3qJ%y!OkwKl?HYf{S(i;G8|gHN4}0AN@e!AaAPm z*XR2I_$C?v&Bry~`N+SoGylTS=|)_Mq4A^s4>_ZK8GBTYEbLG#Bw+0j@&5uBys{w| z&7fhYE1cbk{~F!#548;U(u!CAM}XutDpRkniciG40IWAKKIuk`&&~0sSZ1(i+jczY zkZm2z=#TWYaXAm`@iBM|BDWbowrY09tii|FLFvgG@t((}OMB_;W+-Mr2am?uAL^ca z_28JF5BZE!aTAlgcoEzk3Au)2-HteYgK;u3%C>GZ8PVF6>B`^_b?5E8*Jc-H*PwF}KWi^2^?6IMo;z1+EW>>ppN@gXnqM zxC7eKgW@m)Uu)%SGQJ*?uPnYEmai1P9+5Bfr5PFMnFX>Nh7HfYRTFS)>(gN1(p}QW zJCeSM^c60UIhCV6&8d^CE&#y`BkQ9Va+>`^PC=dt`&$No$OG0L3W@w}F^(grF=akf z-rsC-jKdr_7^XfzTKRCtL)I z{zb=QEOV=j}T4sPvxfvFYBkqKfFn(gFnv#Z{;n&{{KP}P3g2n{* zVmU0?xu})Fb8Gj=bw21Ur$h#D(SQ|;$}EswUKjd2UOKsDxTy!#?BDM=Ie+t`A;bt{J%@9u0;jdrrpdjk2%6!E#H$iPtu+a99qEj=CgWAP)2OYO|1XK8le^%L`T#H3zgS_z29 zXP!hba-&iQUdUvwCY#d9rc0OlJF#Fwjc{5`(xwDSOEv|$RZg4jeTe;ZdGa%E$Gsn- zgGNJ}7)I>Ozg!c!J((}K>E+a_jNR6Rp8TMpI%9e9Rinu|{|GkNaxCH=udMCB`%k4; zcG{EeQznF?(V?Nif_u}=BRT_bAQG_QY`3G$PPUbbqa)dY;#dpk>f&e%702l0Xgt~; z%DqV@{w*`nN7O|4JuHm$>pi&@2uv3WujK7OSxccL)5&C=LfNh+TS|o@p(K;KN>%5J zDV<7&ID<$u>9_N+FW5{N%CUMkNB(C}*NlJZzq(}}-yN{E- zGa9P(IDbgYYc!_lasC(m+3IT~j=G-2RbM5+QwJnPascyq!K9&DkMl>w{4b3udYs>( zKU;l|#8EerxazwkDfMlVA~}G$L@;Tn*5mv!F>lbAqQ{9#qKWx)5=Z@%#8p2dNvWTZ z6v+Y169kinYCX=M5c4}4Q}j3?eIn-VB#!!T5?B42B&BX8DUt)2CkiGF)q0#a5%UKc zQ}j3?C?w{+B#!zWiK~83l2X`$1SUCvxl}M|sMh2BDKUSnF+~pp`(VVx9uYCI14T@1 z;Suvek|H^P3DFkL4AW4(5BoD>{xpR7B>mxTF%sM@MuNM=NN~3pNs%1DTrQY2RAc^} zn7;^NK2LwPdWpnQFOazEMUs?yj-*HqV4ftHG*n~$f|xglF#k+{wt9`kQLmD?>MtZI z^$JOm9KbwTFlng9{3S7O3t|49{%rLYiKE^man(OaQtAzoA~}G0ieS=Ejrl8L-X6ky zhyI|)L;^h~66i6JK#z%}NDg57f=PqMT$n!)lMdT!fSfn{~ z7o?TM8%wEhaJ6Wb2D|Ef$tYp>#)+HuZN})(nUar!>G(;(bo~yEZNi913?+;Ty;MfH zygyA-h{x!qG9G0fnhZ}!FSQq;mG{YcZz*ktzdJwg&Z$YF0lm-Rmn zyIPmEoba0aKx#Cn{-e<45|O#3X1)`@kQe&CkDJ+-->v&{(QkDi-aua-A#s#Tl2T9` zLMKiqbmFHsX~URDde*{Y4iQKLw3VIoONHIo#{0m#z?l7_He7WG?i zCFa^t{4(@st1c2pb&{kMbYK8RCxGPzjE1WC-A1g(Lh&0%Z?@W;#8Kl(T(ucVO7)Qx z$pOfMK++J7AIGQvCg#%`Q|2pE=+9PLkT_~8iL0iOq*RWiNDg40E|@e_kFUQb=5ry; z?dT6Wo+QxmB!P}633NP3isS(18G=beHRkQad^v=<6aCq0R}#ECN8+koNbvj|Ns%1D zJX0`fsK&%WNt~$;VeU(RwmN{sQTvg&YJZZH+J~e_4q%=om^6ej_eFl*LCn8}FbC<+ zR*Oj-wUESBi%25saFUe5UMQf+2xtiEFb$+3fF5ZK+ejVH4Ya@ik@FZ;I-a5KVuL!K z8;I`6qr-@O^agc2|HGiAUt+tull9=OP(3)Fg>0)6NgTC=#8oGdq||XFMRK45oFf&0 zhM)p)E=k$UUBvviU_$K@3|cnBxssO6oCG_{X6R;neXtkV%x3t2Z02qF99A}SH?iL_ z*nS=CQw%oUYO&uX_HeS9dx-s>!9J}H_NfM&ZnfC&6MHz>%x{VPfx#}+!Ok0Ox*2TB zW=x)}C-!i%ncornLxX)r9qiK$Hr;BmvG*~&Z07gGZU6_*G@n%m`%HsPw_0qQ*c+71 zlxjvuHnTY@!*H^hDt?j8Yy!W?W;TIeWHXz!MD{VIe@7IlZI;9%!9=2(wHKf`6~U{>IM?rX-49zuan?v zGm;`XfVomIX{eUXtR-fz#uVAicj?boKOk|`_efmzeUg;Ak)%itV4f?OG*ruG9wO#A zjVW`To9GX6DH6z~NFbLYfn18DNDg4G5=vUiZHpP17#W09dj?gNxnp0M{^-aAP6dMhesprl)2P!#i297@+*{>BLpgTOI?Plnm z$06Yk^lxl=17<`Vt$=Jmwgw3HyTc$7A6Ilxo|5`t4>6v>qno3tyd3cgD9$E3<}GKj zTK&HS2HSBEZ8l`b|Eb<~6$go-?VUt^oo2MsQkskGFfwTmug;i+rYz`doC59wj;S_| z=E+jTRLd)%wr4%fxQ)iqmFi&qpCQ!rmd@xLlm!?M|L3p>7$q9Pyp8X+eFb&=8DiPq z$p{U6?3zqE{L^676q6Q#{BMrWYy!JAy2XlRymt}T!Y_c`GH?wn(X*`q_k^f_IS8&l z;IHk?r`=R%VlJLp=KY*@8MFzV;VpWjn&lbwzYMpapi3M&y8d-=lUBh8NRzHq_|2>Y zl%9S1`X%!@p1+COSCdYyv~C1Ok%2?izU391^gK+m$PzXhe@|&rVbdoBU7J51(A%^^+3uy z?Y)64oM`)bhGPm#N)MX8jmgF-2_!%&49dM>4D)!Jb=zO9Z6-o}&&Kz^Hg9O9EyspG zfj-M}EbNZ{snPMj08pHzK(RH&X8xFLQE7=muk%(zsbOno?`!Z8xE}LlL(uFU{~92fNPNKcVYoND3S2GiPW~tNK>-UQj1pHF%aKwJs*@-JVK~*c0p|SXAYO>E z<6m8llyo-G8M2a*{)PFDS==x=7|xfhWl3L-5c|8O#|hfk)=2a^$rCAK*Z&H*tqG1P z>xeGk3Er(t(rx_tA{k^4f^xwn@c#$;*JA?onO!_?H9y^$ZpqEIoP>`n+#371q@Lap zn11yYYMmq3p#UujjAMgfK_g@_qOphL37G{g3CG_YJr5L|(A7`9DR?xDVX~N?W0=qx z9EHmqe4L_3!xwG82;Wbh`l{%F>4WZRnXu6+%9r1IDJS@L=(6qmkXm{bqyPFQ8X3LHs;ok$Zj?JJ}8Jl`P%N?y`ov64O-Q;%b z##^mO2igwvc`HQu1)at$(iqf9j1C?45N+}^P{F+40=p@fNUwek{$#n^o!=7<{a?^i z9n}j~^GRPe1g0e3{w6=!HWxF0@DDS>-!ZOT>h~nsUUe^NYMHu^G?*be+S%2vE>_Q0 zkM?MDiw4S$;MQIWoK&g@VCL+MsH8;IZ6IQ;K)7>RPoTi5U09k^#^cOQU@>S9FAB z&|eGZukp)Thc*H|!z&o}Gt4LIu5&gq^eG;vWgCcCzXg416XPrGJsjf*VjQUxV_eaK z*t8_#(o@KAcA%9&N_85R4Q7@tK!P!1rKgWd#sd5GE;|*@;>Md)Cu1hH$yjwNQTvBW z=Z|mE=?u;ozbxtW9zvY_hw&pFpvi~rG2s7^?s(_^5xPaEG^eFXHVuq}n?1zhY)-et z+nw6tX)!=WQ;>&!#u;3+}0 zcWPBaLmZiiP6q?$sN^V^sX7XGWMUllQD*2;C~<-b^J}OYP8pk#L`*Q1IvJPzlM2$b zZtrA5Tss=m9c{UBRBII@@yLZq@qb4JJuPXf7-;lwsCF4R4MNQOg6m>@zW8hs1+DV5q41j z7oVV`H9gcI>CXQ0JkVEk9NEp7$7f@(Wy+fIm&RWo{^)}vFK4N_-B50ig1=e59+R)x zuzOs-rsL}g`SS4fqnZsfjjyNWix*F7AAFh@@o}vkf&OR2r?tU*20VQ~LR2!D zLK8+y4`X9vBUbXy!eLpqbJ@b|>}3nV7>8qa_QGWg@SVW-vIU$^yVe$)f@N?5zvDO7 zuZg#}vHV@j7K~lCsDA~*iy*F&z` z%Ca<_2M1-DCr%lq#{jAP&AG`T6Gm9JM<;3;%%w}6LEZW5*$al9i5U1qIAA`!zhio9 z_3s1$!X+pX$6E&g)Q_J+PBL2tNseBqKnQ9C5TgPM|NzzzOeY+a4#%B0{=;LYM7vf_uI9RV2PS zH<-TkulLU$z`b;Ai?ev>vL??=B@o2HK?0hlQ1089G8Tw<)b+wSk!BPxwG2W|zvwf6TUt*yHI(Mn>|0R8Nqel?1(|JoL#TkrN?a{Y zBevE_y1YYZZAWCbte00)n;dT+#7VE6FwclN-hnXlY;@GZ5M;eB^+;ytQZnFak_BJW zKnI-dA!4^An&UW2#E~h2KXftHa{PT6f1^;S^YHg={0%&bA2ZY6b~Y9Mk*W^2-OcYr z(=7-%e+0jP-01BNW77ci)arXVaab=y!+BXXtd~9D#VWjr5V<;(c%?J`OElw94Rf(a zRwEPAc}5%^OeyX%Qgp=HV{!%(olX9;!qL?pH8$OnsO$NNT9B$I5M14ixN6uavIE@Y zsC-jLr5srfVqJ?ce=0|~HhQ_)_2O2U(CUK9#dWQ~DKQ8NzK3vi)wtv#L|Y3AWKMG! zk|A}qk24pwD{E$2?M6~lZN*VnSG!Z!-VIe-34>=f{#ILWgBYG|4{-%4)fv4Ero-O% z&@%M0QahcAlE-XsSL8TZWm(OYhW|1g>>);MnK>E`A+ha!KkzTYUBkCjlEqRZMyP)t zMEu@h{E#zT+GAmsn;DH=jrX=CBwVr(4#$->PKRY{YYiKRP$mVD;DV-D^wOo%f34$S zBsIY29BV2l+9dWaSc9eJN=?8#E&tds6%B>=mJ}Y-s5f0i%ES5S5y1O9;%(O6XrRHO zn|+NKGp3UnqABRg(PvDy97!6KFaL-v3_2a@23pPA$)Cu_kY8xtuiER*SX8Y#9kLF4@-E@cSmqMXGXz zST+d83{IGROb@JBSCEczfmvjddeJ_7bveWJFv0QkVn|M_v~L`rW3pM zhJPTvg>7Ze&QX7a49K#J^cEeW!TTnBPUP{)?I%!OqIqlfoclM!MxAW2B z#(3I41jLH1^;%Hg@osIjy}!eYu^Xf90vPSDH?VvYj8uhhjAxqz&$po+8oSZj4gyCU z*pi4OzM!3AiQa_^w5ygW1_59pir!)BgKU))mCnI5-}@yY|ADZ$JY#!QNbA3tRwvD8 zjIpklROw@rJa*Y^u}#}I}^xaHO8KSCXsJiQC@4;i|iYx3S7#4P;HxbqTXB`3FJUUa+K~ZEw=DfK9AjZL4Ky`;wt= z75o+62DHLVgw?h1Gekh`2Ltkr?Q&Oe{9EeC5WQ5&v4-f&@!tUeS|NI4WAQF5TGq9W zZmC#&CjePmdruqCYj4V5=fnOu=7+t(FxrDKT>m`;f+=(;!%!gxoA!5qcT6iXLH{cF%hY|`+ev*jk$ zl_I53&SHKjgV5$+lyV$m;YvZFo0JlWnxyC0?dmdN5g>aiL^D+Cf%eQ!JF1NuMuW53%2 zTFVy${Q43n>pdkp?~PbL{14&5!);!<=89?_?+@z2*hxXYy4LT2_dfBQ&dvg6>L?uP zZuNQczVm_}HWu`-moC-)X{^-8{vHKk>`WhPd-uSOhsULtjRn1IERBr^AIGUt1LCqr zF*|`BiVj?Lf*CezA7!v+lW+A^P zAUR0qPi_s;=~!38*9VeL)3?pM7&eyEm6238SushrcNYR^w&S{gm2N9;`dDtM%(Y_P zJ?uUsG4FSzSP4|seM*ZFTj?;7DyRV5&Wc)&GR6gnj;G$F`-7N?Hpc@U?@sHC)jHnj zObO0Tl}(FOdO#V+4}cBF@dlI`CXIR=-=Az!pQa&k>yh5VEHe(j!t~iidJ_?kjNsdI z1h#?TIfOwRSQjaW`;dNT8^3?9=XZy|uj{$u8POv;!*{Kxxq6DS@AM*YHDh>oZgbR+ z!hGq{crc8&^qmt_vP4kHbahIUs#pwOj9qCM*DzAS5FQ620 z#Y{3Gg{RBYNn*o+B{v5N_5OgL;W$uY!t?wHJS-_;dU7Ntl#nnzJrWa2Mwp%*i3ugL zHQc=y$z&z5ZOuzCl6nUh+6l8-pi5zM)5U8ZFHD^5&>+&9PTRA zb4TYLb2PK8G>Llx#T%Z)F$z_axN_EpCvj4cLoCO_{lqZ25%qQ2WfE5|1LRNrN!$Zc zz4TaCo(pk4%`vzl&gDtm|IJ9tBGN2%vmWwSw9X$ zJBcx!g*598c03lKtM)TwjQX7*P$>A9CZR;F_7uWepSr*p)c5b$(M1f%4P;Q(U}eyr`R^uAW}L>O&sOieso z$B`RU^OjkoXwUrNT1o%Qe+JRYe~ob)!?*>zCVCACc58I1tZS5mCzhh+;5x=3=027h zP~|{^dB+wlbQHN39?RV1TsCT52=P;b`SakjEU2T9M}=NEH`;|Ph*|)TcA<}-EDpOc zj-QL6I<>ufv-^xonZ$C5uA?KE9(w#H$+-a%A@!QxOmGH446hc+jHn6l@b^GZj&xeP<9A$&_gbH?w+9gY4uE zF%Pfzx6pB+d%7Ws2|ehC@3))p-EY$C`=n!Ih`;%{4a&ST1Ts(%Bj2x=lZ`fdeq z`A5g(y0Uw@P87BymZ=Ql^*&@wWiimYtGlbaFhJg!p>V$($}VzckIZ&eEkUNe9fV4G_u<|!4dKlZTW?1Y)7s{SZI~jz!iF`m(uNJP(uQ#`Hqrd+ zOvF5Zp1w0GtGAQD=iRyJm2~6Fcspym@vt+k3n}+S7KP z7$IkOEp*iK&+NNEd``&tdl311>523Oc(*9Lah3p|8P7-w!#;FLSk^OB=7>C2^1aSNNBMj&*9sq(N3fpoRqNXv! z^$@kSJ+!pMW(RB{t_0%&Wk#GGh&wup+`n)w+y-ei)eC#()o{^T-55NW_I#c=cR-ru zT?Cb`!a;}(CfblDq&p%|m`!s@8kf@ONTfR&2W-?yD~^i<4+bZ7@O%t&jh#JmtvW6* z)Mi7n)BO{W4cQKH^$wwz7DsZ}n@eM)&a|(16xhI~C<2N1&Rp|XuEK?hk%@N_n zlOY{l$*w7VR?H+c(lwD zPvtyFl$YW`XS=+Ti>ag+hjs_RYPaM#UDggWgD@L-jnQ+T1i{mE<2jfh2ZnvN6+Ff z(wWOSB<1ZpfX>zZ6MG!o?Thw-30`i5F38E4uE;UH(0SOumm=}rlFqAKDBhdW6$%4O zqk@6u5oTaHR4}k4!VD~d3I>)zn1Oj;!NA-PGceaH7^KV9k(`LG-1OYcn^x;h%wwBn zp5KS<0lfIr!S)vuLtBHJJq|W(bNFhbyykFZEl%4l25Aareskx^bfdW-!%1i5aMI!( z0p9VJwQ9%0k@#YV+v6XFFHHA4SAU2J`Gho_ubX?_gp8*C(R7V@$AI|9^4lKb(B&V8 z?;fp}&89xdisi3D`-pqT!y%nU^p@bmI{`ll|3v&+18<;*cCxbv$1H-LvY>dMLC0)9 zFQ)G8&S<+7+A|1`Hc)zrdQc8&Oh!&x1i^e{H3eYouhY3f6PIM#UycAE$`|jM_Kfxs zU$nFXJw+PX#vTBNqF{nDbOReU`j5`cAZ!xJ&dZ27VXw@BL#$*PeE>SAP%7aawSDSm zlL_x61Vd%#Cd31iOuGa3s*f4?FBFzl*ahNn(>kI{IufI|WML#!n~$nL$aPKaU=)+@umu7&o(^jI0@x&B-yz zvDaJ4F-X!Fd?O&Fr7zhxYd?`mHWyAtdSv>Mo!-%s#h8^H-O-xu?P!a6r!YrblC9as zL5w5Gwn5*A4QhgRpiO3hlN>duzl>|Af2!s>t?XT9l|316ejlPA>(U&(9Z9zjXRBDt z$0f&28G}JD+qy+8iM6xM0c(76JoM8WJCauJAh+*kTR1mMZpJKX%yxx1H&1Sk!UQMI z4rSZm!OHcK#|!aHNKP<3ZnhIFCK+zrV?+}e9UGHPj*A43O19#P+(Q`Ggqe-S@?S&E z4i!kp#P*4zC?+R0<6d48yBsYB6+GE8h+J8oY+YU`5L;LNWJ~9Qj`noNq=7Gxi@~|c z)gC619Cwr%ZNKo6fmi?x6uJtGT zr;N44x0K5uBX!+e{H)qh{3GROFt(HZGeN9m`xr#aN=`x*nUtKAY?dmLOXg+`qKcSY zYS*=(orrbISu@lvXFM}=76Xd=XG?gle-3HPUqKS>K*yh)LaEEqXz`+}EFZ8qCa{nX zSR5Nz$Okf!_iS&2D%2wLLGJ@}{m?p|D6<^zLzuLV>S(bj4^ikxc^d0|mcy7pLr3`i zIVc5DZu|+Sj<-O30=2>XGcbroGBN$Rb$Gf&jTMT;`B#Lu2bU6)m!;YfX^&{FLeVB{ zas44AJz@Jr5UGCI>7h|G+kw5({1DSU*kmV|CVJBI_VW(ap$+Mb2DI;h2#_fZ>8I<$j+=)``EUbu;zh z`OgUVICnLlk|r(vJF#pliO{yEitPmeQ+fHkke`L}=jrl!5pAVn6h6aGuANK}TrJrJ z5gMLW{^W$u*m81cJ~@#zpPY1>Pfk$HC)XGD5MyFwjYEt|@Xfdc-_kW)jJTk#8F?hr zo$)UbyCE8S{MBVcd1hEoI7#-dt_s1AhPyO`5S9?ArH)4Uy1~Q2Q%HLgXun zgjgIwJnG9P$&o$0yCNdu>tEc2&T3hegB$ zMnuJ|2nN6`ii%-$)^K&Z6vH)(;x&soXUq|Ez>EnKpeW{?^{V*2?>W^oJ+lLP@BjCE zzVH9>JnTDFea>6C>U4F5))^@9vbjn67v?5e-i6s&I*K!Kl`?=5ttrI5bV5!Pqw}-$ zXz3TuB-;5|diDREVW+g7pEJ~Huxjm`TBemj0yrptSyq6wp zD)wtxuB4vOFTZXi+Vp75ommX3^&{5Nx#e|~a)_#(Uzhl4R9SiL^r1AwJ}tI@rYk2! z^V>&4q(|?Lv+y+cucAon0tS0;d9W02%$;47%kLA(KR#{Bouf}Bb2LuU@NGWPyF5tQ%RJ9&tSt7M5j{$hO^>A|TNElMTU4=bzCyD3s7tbiD#aw& z;e#Gsk}aOqVX{SMP$b#(K(hZ`o@`n*g=EY8S2Wr5C`mRwmX>T$sGMw3#XX-DlFdh5 zk}Xt&Bgv*mmt>1)RhVqi*(#E3dLY@qmM5DQTp`(XlvHwhlq8!TOG~yWR8F?2;;U+f zWb;v%WDC`{kz~`OOR~i?9VT0J4vQq49!T~t<;kYCT1d9cmqtsQ9wo`9$I_B53YC*B zs&moVbZy&w)Fs(M6-1Ivk1olkXa6wOqB0|rYI-2mKbNPPhIt{?GL0NfH9bmFO^>Ce zS`;d$nvYrz?3!fycS*AFToFmKXqR_q^js!PvZy>3Nisc<yjUSs23jka1s!8RzSFe0fVPd<9oq)_xMF!+sL)q{ zqFtA}Tr7mLZ{>aR{WiccL4ESeDYPjJBW#}^4mi3yrkeaA+%)kUKB7T1uQKf$isA@` zjT9y+9H4Nx!Z8Y`E1airrNXTW4=B8>@P@*d3e_8FKne#a7=?c+T&i%j!p#bIDLkt1 zlESwNJw^*>Mxn35MhX)Y4p2Bw;XH-w6=o^CuJENodSl^SMqv$waSDej9H%f{;ZlX0 z6&_G{M&TWWj}?AY@HWv96joB$Kw*Nyp$aD}T%d5h!UGDgDtxT)t-@~#-8PjFk_vSS zYbb24u%p7E3MVRDtMH`42MRql6S5YC5el0t?5=Qx!Wjy;DZHfcuENg>>CJ^~S%nb_ z8!POpz-|Zill?7#BMpGVEPzG^Ag7YFwBR~aUH?=#N8x&fI}{#OcuC=1g|8KQZy_wZ zD;%eAwZfwcA1l;tDUv%Vw-L`i zV+Br8_(`F0oOrIQFj3(wg|8HHAg_9Jn zQ+Pt*J%z;z{q_>hK?-XsY^Jc2!u|?@!U+oJD$G=vtuR;N6NP^(q$W!UeG~>OtgWzx z!W4z$6<$%8r|^lwFA7zA3t6MWatebLhAE6!n4&OE;VOmu72Z>5*hk3LR@h2m7lpGF z9#Z&BA-1n5^jA1d;Sq&-3co9?IYlHFDr~%;xDHo1L*X8U=M=tI=&`>@j#Kzuq0a&0 zd8NWL3g0WNbf79IOj77jIGV71{$xN`>*T1MC?0XJz@-Y0Dh!z0jotp&>PqKDWT3*v z3i~OXs&K2q>k9Q9qOiQeUJBPM{AoQ85s{M>o>cfy;ai126zUEY$rTi~RCqw4?_nA< zh1C?ES7DjchDjlyh&<&22zq;Q?WB85>$$+Pnn-d5;!w0Lf&aEiiJ3Ud`2r;5k`g;f={ zSNL9G`C~+6FNG%+;>U{TB!x2+W-0VNPM(cZxK!awg;kE1XICn`s<8e)#q$h>rxof> z5YOEe?og;bQ9L(LI78t%g*OxyD!k@9tdXCq>t}`JNuu6EVFQH@g?kh}SExT(B-c?m zK;cq_4NsA04=Qv&Rb0C%T%oY?Y2x{W!lS2)t9_clc?z#8)SV%on<|{AFyKt_yl=X| zHD?Q~bgsZ9=Lsav7r5vmf$A9oH(V_6?Ii*SUn-EeOyD4ewJsOe7FP&7qOkFm;`&Bm z!>h!#{M7;{Dy(~rxazJI*!DVsHx!P&UR;~sAaJpQccZv=Rd`w9x|_sv=bHtdQOMpR zt_cdKDmxLExWGpWS3e=H`X>d>SJ?b1ac%Onz`)r8cPm``jJQ^KR^VBM&z}?5 zyypcLz94YJivs7oB=E=_fvaB@cvRtCh4d@pd5J=wSH*Rq!Va&A>u`k&6qb8kJg-p5 z&K1|b3g;-az9F80!gUJ$-xSY@3dbs3r!Y_9-wOG+MDj6(hPTBvUf~9X*A(1$q7zWV}Y3pa}>7wL_BX)Sn*SFou_cf zXX4uW3xPWn7Jn(O%fAvB{k6d6-vE|#{n5R!prLJh*Z&IV;bDD(EaCK5bLl$~o0q=s z>W!IC?(Lrh?8$W{`H#Sbl|A1;6dP<4`R~M?kbS#3T=^Zj6cg*~tCBtzf$&<&fyvwz zm}$Yx%@OtZWN{@Yb57&h$~*Dgze|O%-c#3JtcCFE7@pVaq#S2gtRur}+}>X6pIBV6 ztNh))X*^evO`SEdI$MVaNjwmbb>QLP+*a-@9|4{tUGiX=$ajdd#vJ!Uz5qv6BD}L6 zD}G`)v#%#oQkQ$Biz6gu|-24yk zbUVoW1CvW`zV%!8Aag|V=aKyBug5I6r!Vjpc`OX_R6(~!w0p5^Jfa(y4HNBNJoF_^ z+hn(ooVPJ>&cY<-qSA~U3!r+~3|N2$=XeOr2BF%(ZA>d`2X^GB+{vMSKh zy(l=rU#1(%-U`^V_nfs6r+SIE+sRCf`8ZKC5_gnUT5mh8$z~Aw2F$@Fav9FV1&kt# zjdgZ^@H8xi2h|rmr=t$mW;g1}6UhoLNlGWJXdg`gwogis(-5S83;xKNiVSyUggZ;t zl4FJV#>muSwrkWcMvkDaX|~7wo5M&m-B@=t8kj-6J2u8TDJ-Oxdyl@wSsJ+i<_7}q zJ0{@1V*>6wCIpngskzgT9(6?TJ;H(hP9r%tQ_kL~E9O_~x#kZ7?mH&nzGFh%{7%5N z$Ao}_pgu#W>G1nPU)RpZoV&r@6v^kNvhtD@UA6Xp+PGA?KBxbL56}Y}H4k~nYA4%> zk7kc^P@COO)^F?T9lOHEwcQDvrnIWED&x#F)PMx{xv)CM z(-7#9E>>lGz83R5=5W_sGt-bCh6dYG-_W(aAO$QqG#ac}TUw(*pQnP^{k5trq2*Yi zja`*$>Zi@&Om>RDBP5=ckdR(sX#)Nw+PPeJ2;+N%(iK2k zlGr$`5_(9t&d$2DHPoTM>H$xVc2Ykj+NeJXXAC~__KU>ZKclo3@qQ!JqQr0?g187E zw-+*vhZC`#weFU7oT1C&$9R0R8G^I=@N*`1kPI0nKlyk_7JI9bt&jA=Pu!V?pHm0o zC$4$JPiJ%dY|i#=uFkgism`w0zdAdxrDt`vwWYN>+qY$8b+%EfNGlh@NEJy8M;k!) z?a9JxYSJ;WF*&2WpI}8pKat4hm(Wk}))v&*M0T5KKY`xAkas)*ADgEjGDJmMs;2Wy z`kK0$uns4>)?q#P25ZGRoY88KRt?)?CaTsFYzwu!Eg+#MqNRol$;0Q(#pmPQ{2T-rZli+@U^#jhWmYY4=#u6dx22|KXzps5 zYdD%t8$q#$8i~F~j4k#%A0e*&8CR^6<=)Da8UQ_UsOggWA=rLSOHFLrzIrrcb+WN# zpBY*ylTCVLQgRu1CHs3bk}YWnzA_^=tr6D&v4a|pJz-elvn?6{ZW>8u`(Q5}JjS2# zE%(iA+_K8}SH_}BVGjZPp$o%=M`*p}G-7{D8V8f4aN^JO@im3xad0|LGcO@QJ!pSF zDX!EjGx(!vLQCU}q|fw5#*Mi1Dia`Wr7G4mB-K~yUN)h2SvBrn;XX1HMm*Uk_R0*m zWi8pA32PSla~LjeIsHf3+|;tx#Z5WbkJ$QzO`zG$(V5r9FU+645ZCy~o<=6Or}{R_ zK0#bb(_h_XWfGpa1_MO4G2$#SO*-AL1Dk-;_kFb^=39Zi8d`FeVo~Y>4 zW_c>zT6Mlzo-c?#@2A&gu(Ju-A1Zw=cl0o0s`I|+UlM)3jPfJZh47CGpVuIEty58S z#Va|g^Q#KS#89SJD1)>#+O)_}6~-1do*B@*N~xqx7rT;>6Jtyz$=(`6b}3;BaXM!u z$v!H{P9~JRy|N^BDsYz)Z`BATPpT~0PbIk>IF!W2>6JpaImyk!VTy3^S|!Q;%E_(4 zp=4DkSzpM{H1e}0t)kfBR1kd^!--^QnP`=Ya#wJ5ex#JrohsUAl}50(*SSs8`>aw8 z+UCODP28ebogXXGCxp@slF?Y|Vv@vD36_G-YwRD$u&|6y!w(UVs+I%)!#?@W9u;maU((tn> z?K9-9oM(99-a15cS@tWAhx5B4{USP(-755pa_Zw6xJfD&?G@QM;956$7COZmar$?1 zKtvZojMQ3ovpN&x1MXWT$=* zcX*;t+!`giob-u!+f6UVO`d}@Iu}=y;Xu8pp{srC~-O^ z`ltl$bZZFoFGyq$O!w8tw3_VWmg3{B)BW@@J39NgwfJ~wdKrDp-pxKKc1_|w0tkIbQXxjXp-8?WvbZ1PtX?6`}^-`yg= z<3@^DM7JwfGJp z=KKHa^DNAt|6rcwY`hUvoM)-TgC@PCc^2|Svf}?>o@I4pYVl3?Z_Tsd_1ak;?YLu0 zofDC}pxtFL;o%yOkTKl|0sS!jFM3#7vry zF$qFI2{4`|jCA--P?Y+l^FIU0IWEFkM?Kdx5Iob15Ht0JjOj@TC;`rY2`3%poP)@@ zy>iN&Qg7L95j?XzA!Y^; z;$|QrW0oZZ6a@7-LQTgK=ag8d{<}FPwr)F%ggGU)Y3urL=9JiMBeNUqSO1shlqz%( z|Fd&S%+ddBP6_k#j*qg&5pGL*m%{|kU(YF_ql;(v4=0qEP)sNl=O8Lf+5N@j5eKio znmj_p{;!xn(ov=2{86PgfPVFVe*P$oLvj9yh4f#~A2HtlKb}7->l6NW=a0hiW<~b7 zJ87RQV^)?Os%wT2JcIKc+2^(sGNz3XPy(IpxzgFvp(7aEg)4U~wUKkzNI$+h^<1+C zA!Ak}1oQ*TdBQ@6cG=|M9(J5_QP;6YBwp)M%QYhjo>`BOG3yWlJ_6PGLPdv-P{@Vj zo$5OFig0a0HP>uL@XV%!jM)m$@{;F)a*8M8GZ;3IJ1 z&@OyLp`(mz2)Xu)a80C|Yjz@dW=BHCOdte&1g?vOiw@<&G$31rOasb~eEt-?1iHC9 z(9qo6UHB{0&-OHBzAwd`PUP=O2;0#MWvcPvu^Zl8{K8ZmP7urXbW-V5dV0$$6JD92 zmx|yheZ2R;tZHAx&x|-iY8Om0$tQyMMoVq&7~>xj;j zHOd?qXUlA|%O<_}$~P~CH$?fE;$MeoEYDOp&VZ50{r&6V-tqEiUU8P}jFf*dB3Ylp zYhfCbgZf%{17zVPQ)7j^c;n6Rz0h;UDlyKp+ZmZ`&O{;OKB|ipW)K?8#RUHbT$_z| zoQ}CbbD?;x&vLmR<}lRnM^-d;Jb=Icz4YNZB-0=zRYrcm7WJa}xir01C4J|YhKJ8COdov_-sP3jSFR`F{SCd< zB)khs!>iKp=!@{Ks1#ngo`knly@Yc)>KmF4zK1j!X;S`eXd#$^!Or1Mwxrw}Xj9F& z!gD*^1JdB5ekS}K@pBN)k-1%(mu-X%hIJWDl2r`Ak_Rxt0Ok{}L>h%wiK9pg!~@&C zLD__Vs(Ab3z$-p=t{hF5e;%D^Ze46l!bu=HH^4KJM@oDHb_7k0{?}*~_<(^ZyV>2b z8s;TLs^doVEgd)E4^G&eLGs+qa3Ey%7kaVIYK{x(*Gi>(=kO6(&gB#>?OsGl32Zz( z=N81{JBf#X2PkwZzZC&6*^-8yI)$|trm%9iFmNY(w9|sGN*h9oSq*d3#TRXK%@M7> zsx=u}_He&55g{dL{RH#gnuShMK6$j?8BuLj)xDwWN~CnuE9x`y{5HQ2;?B7|OxrQ; zRW8n7^zXzk+)KhtZS=oEo(^(5S(1{L8kNl5Dw$X;rvbK{KH*@eWEh~wAjYzX%N8BO z%p=UzQLmBd{yhk)wdV>*%dRN!;v@qyB!;i3TVUzPB18Ze#oh%;e{TqNozwUVqjhbz zHIjat;rkRaTvw2w-3(1iJx3HUNHl6vQ3$MsUT!ARbjZf&jdKe)im0~+oqMn7zXSfl zU+S0I1!?E#lbq&yM2t4v!HD`Al7Iel&_dC@04U}iCTNy{=kxNcD|2=Yo2mYbA|a!Z zHon|#QmE0A*JW(dR<+%^&NzfWQtC{nv^zP>(anz1s*KRx?CNeOd(jeB$rSOa^VyN; z!?3+S%ed%wu~or89O>&gSZ%@Yk!5Bdm^ZKmrw}}|FCk<0CIozhs&*y%L9AtnJ42zb z{aDz64TyGNp5KV)+KI*d_ChE2pX&~e>L%n4)e$V0);Sm{wQ&yr0g-XEhT9I0?Opna z5wG!COHcW(SuORb7B|J;jxvzDal&th(a1O1-ZvTPeMQsOsfEZ`J^l&zwaW2NH7RS9 zt;++TIP1MLDz>z3d|T%n_b^nJLU-HGHsgNZ<6y_rXeP?7pxS)h2A}m5Ek}ASq(YYe zR7ZOwCyR1OJ5BYe;W3;i*ETx8C#bZg>jk5%!=ssW{KHUl3GxG@!c_#xD08*?T%&L; z!Cws19pW8h&^U}d(Th#^lr|i7#6puF@F1;t$PXO1My1@2P;dK5y89oIlCFcpK-=y6 zKS<;7zX#X>!%wo2x1kU5oMRC8N!o8x!q(*r(4rlr<#GfCxJ=;+g)0f2jBoT-6^++X zhoTOPU4ICEEKVFoyZ#PTgn?7}BzGsgx^pH9+{?{J z{JeIrA)E00ckx??q;1h9`$?GJ#j#xDU*$9}SB(GLi2s_>$4QP=H`XL^z#0rYjGdZg zUTy*sfDb;Xgq+)s&%YizdaXgyKZla@Jh51!9Zjs=9%;Ni;*qsyVsD4v=#*J%BAfCO zxx4>5_3>S$Ijt7SffbjU12*BKtq~KZd&N~W-9ucjsmXsA`KtGJ@_j+=aF#*jeZkt{ z^o9Mm6#KoXC-&dp&|3?6?n*U?ga-qG_AM(1!n>-Hy;-g&;r$K0wIw{}d?dUY4UfJE z@9Ik7mFr1(e?w30aJI-uc-9W5FTz`j{a)0Q@cxFL+Tm>ak?>H5nVUhB|9 zF_`UFVx3{#NqqQcsGjncJ&}!6Ds!qn#h)Tu=>T5$Jd{%-UfxkY@G?W+&5bp}D%a3fIo8$wDHbtE;!%U7vOvV@pgkLtxsg38 z_w`tfmF*4tf%PGk!}^;lTu=BVvjs<}^OVg(MOlp7;oDy?9S_>Vv8Bpcdvw@0$DD1E z=B0$!7o%%wfL}4d$|1g57Gl^ZuDeMwybgqSJ8q{z$6r2{F@3}BfS~Eiaj5ZR@g{0% zQ)ygq?UN+FQe0V{}Zl72!U##wxiOC>%j?X?fFx+Tq8612+<0h}UIls&4imu{zf#S*H9DbC7LC*Uk$>hodUf=|3JG&Pi{>-bPyWc& z^148`lh3`}0}u@#bk_$r;6Z47J;=w17j5M&nECuyiDwoB2YI|g`pWeryuYD0O2WIjG(2ppVtDjLc-L17uUt>UTZ$gXd#*&O0`G103| zj+n$A4E+P^xR=A~D%?IPQ(hxJ=7WwD6zXF(w$t$q9G_J1(IQs^e@9oW*W)f?s@EkO zn;LTuvCZHoWbuv0?PMb^+=klz*xyb)zO2+SY%E&O^Dy!Ig5k#Bk$FOio@cV6F_qx0MRTQqnz&fs-zj zi_^9~`au5cjsGhl&o{yUVff85!Z>p)VkqN`{D8;I&_jN}`iiiz_oQl@u%ZaWciV<|1pC{7hF+q z3+$G{Py$t4Q>Rqhz-tg3pA_|C&K=Mn&3cW?I~x33F@hB5>0~5r#OgZ#3Ru^J68?>d zrrj3Qh|xJaNX!BkR?GX~l)0L?(^Q>pcH|lbJN@gVuyB+^V*4D-1b5>y{K2S-mK6af z^W3^EbElCtHXH=2(l$(Pn0pM#_HU9XpaI1-zqUmDH)g&Y&G!wFNHdFh>zYRio_UB6 zGY=Eu<`F{1JV*#Ai0r=^r0VcTLtpc>n}gRi{-<5X0+(w$*M-66`Bx%8q!P4E%uhy< z;DGefu@_~c`kP4JcHSN8qX0ZZ7w3fTA#z8E{D4l(nT#+u)$(YHNtP7LgKsrhIhq~q zdd>0jsb)@`$x1@s^?GBmBWI!``?WZahV3u0tX(e?V;^M4@9hxgX3WE>nuniqKJz(d zkZa};Jo7vuW?mq~&5MNYG4m2JW1b}hR6t(dB6&%N{d&&&8FxNG7@JGFT)!C=+x7df zdY4YB%ZrrkF1jD$b{4qxRZI(b<;mp=EbLKB3_r6d8H*#`{XiQ@H!GWL``Is~E4(h2 z)iv4svr)&sXn*ywbm7I1%R2B0xhZ!58)hAz9LT;tN0-k1M_<-tcMw0A{~xCL9ZB;( zD8tCtg#R1T{P}-Y&a;Z8*E$brmNP7uSk`A0r9E^y{~sx8>3`XVwqP4NF4BhHV#9FF z0)l7WCdAA;gt(bUKpUD*%$PR`0Ts}OZk0AfN2Cq84#U`zVVn>N;|nUf=39biz9huV zSA@9vnt(9AA!f|ygn$YNW2S^bM@bm$Pq$(iCr85glZsduyBxqX4k2c`5#q)rWXxjW zrXaX+As+fuIwIV0XEMg?t-*~hbSZrR=SpRt>TrmMjrL{K4cnhO<{xbBHVzrc`Qn}+QsL($4%AZaWG=K#ppufm=`ZT{FkJp6hnJFX>Gx@xe@Bn!6T6j->?CQ(-l({Hkq-K0Xl5iw0mjHVVEO(QwQqqARh zhg)MY0mV;`(e6hU)FTub9;IIHg-DNKd7c(2&pMWwYcQY9^6W*xdSXJ{G!Rf{GJ>cHuwvo0zJhYru`5!{g??{~ zq9nR{WORidAcZ}i!zbWe6q`8TncP{4&^;(moRZf!~oe_sll z{f(z(jY4Kwb8pqEAyHjT$aFKAP{;))?w3l}bqCY=WcrWFe8;jfr`zsz&2AYsh{7mF zBdriDH(%)v)dBF8xyvDST61;^S+a4hCAzSS@9&sDb;h!eoDr!bE3%+nGmPMwHbTr~ z32`%+fI8AH7&k)%6J{mBq!}uhGAk1^23JO*&X5pw<_@VdbZDI!oj;cblvqgm`E3de zY+6Y6V;gNFyK1U!kn69A@g0}6VN91y_2yHWR#9~D#4Ci@ zx-=E~Ls*QuU0hEFp5h;Qrgk7+!OHYnLOuA?X6q4s?za}6GH=;uk7M4R70KI;m?2ot zNbt;PLdbph-6d>vShg^}+mY-12-mh$bIk;TXSO56%=U!1*@1xgjwfc!I6^=LgmAZnKu1Y@ zImT?yFfNLOu`?B2vpWHIDiUI5S3=zEM#z|*2muAbeUEU{5#dfcnL=668uYryyC?hs zg%V+T{XLnn;PF`W^7dZUP>r`7;ZwSzg$bh^TbuOtI^}=E9c8g>bD|@U7YS^Sm)Gv3 z|E>BLZEp6VTSPkh+V3=2FnAnF=Wjd+onqvr_2?#M`2yt^10bw337&lXi8FM5dpd!M$U&5lp zKf3U~mX@{5n2Y2-g~Q;jufKNx*@j{Fha&{=sw=~X9R>!Wdf0vJX=ek(H^Fi*aA3Vi zIY&))S+C=81X1PUODy*FR}~3;(#iHH)U~v;>EGj9p#opAH^N9)WMv&r%Nm!z5zm#& zc#E86zhaRP$j>>JNMFfzBx5GyA$=yEQ;zKJ&krH3tdwQ4+qce91{$K@^ zm+%iQINd}s&oCBCA%x9Ec0rI|$EJy_Ki5X;>`AN)u9;5o%*lk9IfW26rxH+qP7{oq z(*+Y|nqbnLA(%2}5;NvRLO?>)s|TcB(NR)|@#g33$T-{(iNiTmbj`&C&zwt$nezy7 zb3OraxIi#&E)-0div*Kq1~FsKCIlox*bhqBbd-e6_OlbizBv;16;yQ1bp+2`Nr;)N z2yt^Y0bySw7&q4vGv;zaKt+T#OTwa~B&^X0YiEWvGZNO#RCLWuf@f|a#LTUPjJb&r zPy(dbpbw*;j*v7gzg@_AM}+e(>bd420%k)9F>?Ll z<0)t;=4BGQ=5>N+ULnNHtAx0DjgT>O2mu8V_G1z@9sX(15A7F*oz}45v|&G99`^1G z`#}wRCZ>1ITO@YPd;;EG33zuU;N6vgcUD3`L4^H;giVKkJM_b_=OOGpz`gW$KE4a! zh^0|D5ez0X-?TzIcRnLrX+i*-;#53qtStMJN^b->r_4%@3t0=+bJ-ja<{Pc3Uzh>% zH(;!A;#c|0R%EV6?Yv3M!-q8wahyVxS;!1>%|`^!yibUk4+wFyh=4lwAu(g#BLq}H zUOp*#Nr%6i%}ahW{TcbP=U?U}-=C3}-_hcT4}YSVmtOuMSlZ=z$#>}5WGH@4QM^)i z@=XlcsodG6PN~T(Z#onm*){u6CuKQ?KZ#?)_lU0lgT%RH;{{Fz!y!l5c!Bv|UElDu z(`RA0??Ur^FXsE>m>tG>X~(eLJb~ZH_a_OSd5RD-PZQ#1HUatm3=wmegn$aj_opP^ z>F`fx`x%{oQ6_geVX5yXN4XsGnvQV7pYL(4;9Mx{IM_YEi#+2ON2a?v**%uaAU$H(;k3+-mC-H-#&W9w9Dh7h zrt2;b1IIqhdzA24WLs5s48j|SU)8wgcp|=-!7PPwG@@fRB3_$zO%r0_q&+Pc(+C$< z2ED`YDah>f;>0tM>(~|qxhg~e^x)eL&h~2;^yuX*ZrrAu(^sz|org|W*QcbNohQp{ zsf>U8HnlJF>RHVzS+Cq10U@vY5wQQ8fc@VD?EfYNlt5UskyrT45&N;yXAbatJhV&x zxve~|)68OnXc=Q3BKrU4$Am}aC-&U4()MmyyWho)&B=Fd+4%{>oyepSTGE3SLUy#P-%4H0;;_#0n`cR@MX1@7|nB|OE} zfk!|kvuJkeEk6c~y3k`CPQA5_wRCo>Z4OD1*BrOGzG@2d_Jv5^Zq592%{Bzjj3H#q zR)m0$kg3lwQ@J*3f9UTg^`&DxQjZqS?9&z3IH{@@-39`EnMsVYYxW{|W=}%K>_G_l2(F4iC7e$%`*r}+jZh{;HX9=bxqLZ){ese*ns>iJFPp;pcElPxS`< zWc8Tl!9iEeh@6Dm-pl$7gQoc46gBzS)X(+zKp?pnP|mqEP!q%8xIRgrscJttcq{i5 zfbT1qILTOWSt z@?C!vezd=hF5g|;xOK71@3I~cFYT_gywkR&_Wx{1+wEG6)4ofMlmFTOe2g$ANt~8- z+BPr7Y23~lr-}LZQPs52i+wozk(hG>;(8$a5x3ZasuC?LnviAH$p*g}C|yNMe%esf>-~WxQey5e)gRU6Zn<`ff#N}>u z`fbQ-+2(FbG&TP)kUI-juCI2Yss98qsjHS<;C>v*Db*Q8o$Lxuekw@Su ziRAERN;3AdSVVpw)=7L+8o^P-`qpC|I{W4N?yd}+vD|%d`F|kPdVWw^K0p2!M5cTG z5P;U-DJb7U0`3BpYUb~z1c%&ueiG`5Pm%o)pyzLi9IL_!a5^yWxJD?&qxjab?W|Z` z>v`;6#wy!JxRo$;FJ*MH1Dr5&k5rCaGa^@q1U`-=C34FkHidZqAvy4{*CRkA|-K!K3(Wel#p8KduIEG^LV}Jf5#r9$8)E%wf5K>#f3EH}dkRCMn|BuB2>Pe_Q}?UQmY-srKf|95=2=2`6oK1GUtQ^@ z55#DH5}tU6b!ANw1NmPH1M8n8t}(-SwsC!U(&4h64?On$oj870>^Ywc9E3ofL09 z2^Ors3tx^4ha97q<$3;?nzr*jh7?NVb~1&Hnq;mRJp!hWeJ7w)?i4hdLGp#PWBq zhGn&PTot`z{+`~>LH6ts>Be%KiW#~%aU=_)bdzz4#xWQDvgo~Nl%k5+)=!qtF z$2#VRU}vx-_CD5$<9!CL1;0;pMr%1GokQW17ki?(+TU)(-W}1>STt5=S9c=&MI%Y* zoga&K+>%aCC|WA2SDd(c28l2GWc&RcO*qN^}7{P&tl^XL1DYCEw)^t*b>@{)uV!SEjF7DY)5hy)N*|X zYyfoR*y)JsZp-IRXG;HWQYNl*z4OrC-D+8C;d*~PXM+VDS$}WO*`P1hr!VDvj-sBd zPhXNAs*-eWTzV-#^7)%kve9DG66ULp&PCuwo0Bhf_I#HY5Ea|GzQmu6W)30jQKM@T z%=3H_H&oHHCef&E#_xe_?Kl}3bR_eKeJy&k@VlFNQ7Df?o6s+AY~$llhdZPWSLzoT zl=g^a3oH4eEQ_idpl>SA!t;T6p)8h-!_i`J4bPwGLVP~Dze%e{E1{abSt82*u z@->mWSjr_ket%=RbJw(#N0XMcUOXV=)x!Dz5pLInR1L3Wq-Yywq<5oRfpWIZNy-LP(nj43p z9(BALnYTKCQ#-E75j=AsA!GI@1bl?~p65Alh33PGBd_(02|WbC8Mfm?!R>ZFCuu00 zBZU2l+-E{xwBr}R)#V(aay@CsOVS&ipC`?h)n4c4C49bj^B>B1E}mcu|67E@7X7zT z9Oe~zb@WF!W?q(`GWqyw@#ky&iB9@L*1316@_O;%oAPrWec!-O&iy8xQ_!{!leSrL zQ>wgz#)t3C7U(s~yJmUYlSSOaH)0#-@lfH0)o<{d`)1@+kD8R-xC$(8mXYnM4qiz= zW|L9SEivbYZ6+1AnZc!9eAhN(ca_e6keOI)T+2o`&FqY7m6AR5lJoZb1>IrmpN}wg zg(W+Qe>iTyf?#8-8kA1uF2Q5eT;_0n3a9bcrFx}xoO3%_7vi9dkHGt2V(Aj(@o`m~Gm1R_?Z0r;a&;khp4QE#!D+ z!r@4+J(GY@E19p+AiW&p#8+~}h;i^@xs~99cR*Z_5c;6ofKTbn43?>#C#m)%bHs|N zg-yyjunm&*SHS9CmgQ*J?myPPHrdbu$P;UT8JoZgb1j|0(j&u2d5mI z-4N#fyYL=_X)s)gAYT?@d?{~V7;3#Ik4w&QVE&=)F;2Tp3FG9+yv#okr;fSOcf`%% z=o}C_8wIAUQ#d1JI{PMgv2i38C*FWy$3jNyef$YGX|9h+utX=7JB~qY86C8@i}17K z1IiwYUv?R&Sb*J?50>L1JVu`PvR&LH)I}Lss+sHQ!I&M_8j!@r5Dt&>w&`ecrk5AoN(0J(s)awcGX~MBsH0S5pv7?BCGxZfZ5eR))}hm!8`u`v<~BnrY?~{u z--Y_j3a($xP?xoicU+8I$$co*ptPaca9C$oUAI_gCn208S$^DI%#h0Fl8a4=Q;K0Q zIW{GHhHZ2tK&XmbB;-o7%-UvZoDIil__QP15q>AbM@PWk(Y}`rMhVAqm%;-r7(2DJ zpVXGhEW>yfch&}K{nY*V_K2Ox*+Ag}VAu;8esEw3c+u+9Hj3USA{-2q_=_w5^6tMY ze9^n#ZJc5-X-$)MK7nT^R-q~D!8VwV55Ie3#yr+`337@*!mrtUZclEp59H%CZD`kl zq3Z<9gGOXzQ44QeV?aaIq#OYt5!Ws9$Q67fi9YLcGLwDy5$i%zRklgr#Z*U*(~*+{ zE{R5mo2cyf0NN{fYjx23vDAyPas%dqKbk{UV-;>rL1)bU|W<#*AeP;MRX z$XMsg-ndSr5_Ym7VErlqD^v*qAHhz3QND}PVON21Zf7%a&60esaKzW`NPWo^7LLv5 z2Zx$$v%e{lqZcC;k8sr`rYPH(vk`cYwtY(@ia9(w4D(V6zY^~U_>5J9l~#KAHl`U9 z{vz?h1Q)o-*&jHiLR<$II9YpCb_`^vRtO(`Uc$elLb_f;?$l)aCvqR7(%95}f}fhY zIr3EQag52@f@3OhOWG=Nzbx9ll{=9mtuHBjC8RB+@7M~wl0M-L)8{%XA$`YL*-AlT zSVnTX+rUPOi#f@(XnoC}q6COJ>0o@-7cc;*yB%$!Qd zn3D(rCBTW>QNT$@xX3T$JdvD>lruxl>C|)0*#ys=MTnVy5i;gXLO=;{&J|8N%I_>V ziJTuR=cgz~b3XN4a}mKa7Z76RLPExzM+hhZ&NqaU4*zo~N%9SIUD=p?WB0lMntO1#6p)> zBJ_)0CIg?r$Pzv4!wpyob&|nZuqM8Bh>Bgbbt=u+NSGxt<53gEgLqhfb>5(dv-~i} z9|Wi4oa79<-&vEt*{(Q$b_UzkPui|zP2DUuA=f-iz>+lrP8uKte1vv2A9VqCMNHOv zgMw?Cx>&TD4tWWPM7SiA`10kIzc+Foj#&WP{-{c}{ef=&CiokyM=j2VdFBJEgzv#M zY6nuJ_#R9bGKJ~pTA4GM?q4J6p3Nj;Ej__A&k$nfSwhA8xM&eLC{33Lm1w&r~>Nwtr2u)N1t&G?iPQUySfxxuA!W;HhzTD%F|Cc@+5$)acYK z=k#ZJxlW@qc$BU^Vc3%q_E}Q5xr(!j2Ge)weRJRA4>m(E&Xh#C(iLb z*7di)@h%yj=7rab369&`+=BBp@P-!o7Aex5>x1O@z}X-S~%$ScAbb?Ls$RKQtx#{ibv)_Tk~j3Th@I7Y!KLGibm5d;~6^ zbaP)&M8y-i&*8w71D`e~0?J~R?tQpy=X)%oK8SUcdlX(mPx-G%yN=G2-Hm5qNA4+8 z?l>sp;8sa@s-;zqPpeIjSdOBYN@Cdlp0Fx7k2c~%(NA#bCm7k*6XU%Xub}778y|eGs~~mFr7-(~_D0wLo20V<+*n zK-j)A_3pm5H@|2W*RFQrtuUy%Oi;XhutWZeo^JkkF)_&tmNppt*= z%l5!8nC4is*7_Oz<)oq(R5{jR8L@kKaX*6`$HMy`q+iai7Hj=fL@_V1q9d=3c(@A^ zi6sbZ0;1R5>ZNi&idq|1>!VfhMgVI!eZ)d4@s@5+y;+CXMBL719kzpW40q@@dQ$6h z$Fs6K3zjLdC2I0_O5uis5*mZ{`BPu1?P2;Z-5xILMeX6G>8YK` zT#bZRrS>U(mu{aH^`iD^7rlx3=h=IfAA*D~@?!)cU8MYg$0wnO{D8-&p@;l{$7i93 z{J_$C|2q_zwc;MdEA$|)$B%l>;zW^*9WiGT%I+MLT{v$kDsz1`Aft-y3+A8{+Q1ZyxYmYtvJB(=-e+_`LLK1pNC>OuI>xJ*s~rV zjPTB_5Z+cDi_5}Wgz&n@lAXlduViKDfBv_jBc~Y2HtaYe=Kc-Fwl&q^X{^~N(`MTQ zcpmF>m>F3#G*S8uO4VL6#~jZ64hLEiA0%^sFoLPtY}a(BWnPS&=l?b5;{Sw`@2VGo zv*S-_VK3JnoJT;>axYgmf`_esfQ<170UyDrd>2NgI{ba0q4O@}x{zGnU>X5BZ}%0l z9$eoLJo7anW4Cyq)K?g6kr3C4|c}KjOKI&ss^iJ7S21zfkRZm7PJ^ zl$HI-%BCyJUQF34EBmvRt?nwj0^)E9WoxYLFOY?m{i{`}Emc9eYg{g+PIs&GZ!6q` z!g0p?{V?9-zl^dyt?X~g|GQPGqe_A*f1s}Dni%HG<<#kAb^frz^%O4V%Z2Vyf8vSE z7%#?;#fe4=B*8XtDxdftFd7nP#^VZdE@wHb2S_?=0L=2`saYW&S5jwy)v2|@1H)i6 zfG|(4qU<0m+uh2pK-prP!?}~IDcdHp{_(7jb&QW|>IpbIhk#RY2mv3V4lR;8M2CMu zNqxMAT1wG9|{*8Wn9;iYgmMe&Wx)8|K(6(bOXlC#q?&8iA$VpjLd>j9$e0m? zfD)jDy@0NPj&L(}Sgtpcb95xl8&JwOcBG;zM zC3Cc!QOz}*6EbE~LO?%|d@dw(6z|Vt8gC}YR*^JrLoL^AOYqECLd=XKWXu>sKnXB@ zA&hjCr|}kYj*G-=BK2@z9Rc^%5pZ7}A>bpBeJNyg*h%9sziuVh_(*>3K{eOxN$|`h zLdNV)2>1wGUkMi-h5Ygyw(ptb+EKVXvkz5ptO`$Fy78LU9KI$A`b^c+652SF{apiu>=B(@y%73I) zIfyD{{WU643V0H3K(0PzL9ahJv&QVt9kP131%URSp)ao3qI#UU8bBt9z ztW33#Zx2!TaI1T)>Kf zn|iJ}m*AOm2pRJ)Lcm8L`&P*4@Xs%dh3xMhC)ddlu8XPWn#%~Dxr7iiml85&1|gsX zD8Ca*IxHpfN56ACLC$H)DgE#@)WbO`1kYSc$e61M0Uv=3JFd{D(-G}Jc{DUyl5q^G?crxuzk^B4z_XAYKc_;+WJV=O{ zS%i$apAb+2q(2HN9U*C$_NU2taU?&Vpq^`A!8mV1bhUtpM;E#va*>?t}7y3 zFHj9^!I zlmO>1!bwMYnx7@-P0A@Y#(UIr&HDt;EF@&iyM%y`K=!MU(NSh&JV&nEluK-kPpRgb zF9@Fbj1V)Q6Efx#LO=;n{#z*Nh>pKZ^Yi4qJHq)r^<484!81P)V&+Fe#(YNzC;`sj zgp-bP&KJn}K!o!T>bb@l2=L5ex?<)}LdN_~2q*#0--VNoC@1Usi{yMH!kHqOYig7; zO^BH)LfljnGA2m~C{i)}gA;e58A#Ro>WXv*zfP$d@Q>f_(sSAC`%jAA3!tGPh zHEjgg!UPz>gn*C0=ET^C&=Ik7*w?>8u2+Q1Gef8nGb<6|W+;H>&Z~GD9VQSDPxceN zO5NA2?#ik=Om$bWy02H#ZAG}RQFpG@UDZmzQ7RqUBd=5TO)I;ahO@d=d5bC)#{Rj~ zdE4r&VTIo*6%P5|pzJ&=J6!okSe5xyDH|g>_PV8-jY@uxD zQTHROyP@iCq`IT6?#I-Pm_-HM`PBWy>TayMo2c%lR`=6Nx~+)w0_uKdbvLuppHsS6 z$YHs?OW7~1?B*KI7FOlUQWc3C%k4etd}VdERGqD?&eznbP}U2n^NrQnT6M-)oo|<* z^FDRHvpU~j1Ef{+N__Dt2UC>6R75zlL?+V zkq|Q{5i;hVgn$yDOb8_%VFrerpOUjzg!2sQx#lc_XU-(V%ydG=Od|x80B2G-=_u#? zjGRpo&I_pLni&MoTu6wSiwGHWJ|Un4I8(w&N0gIw=yP)RQ%fP$b-3pE|#(k!$~t@~e)d)Y{QXHpTiECIGG0k$jwwk!d*EFqvExT}Pl zjxgE4>%~+K%6nbGUL!yZ?ZC zI7^P;nMDK~9!JQS_Xzcq@q z01c+m@UAqD{79XRtcp+^RunE;7NOnuD`mH~vI*r+65=LhHOEl1IP+7qN&ZdUZLDru zb@8#1y46;9EOjGMEX46Q>W;IzHCB3CN|(lw>G_?q+gaIKE4w{qivxUUNBlwA9jt73 zMkZ!@Se5am^b!}^R*R`K!Rqu>ojO9?^s=fGOG7K>!JpLK(dyQ#ZiDJ(tnN-6qv-wz|7i3YU4(jk>#9-QHGuH%dqIPsd@Gvb&3{j_G|Fh->;2JkyU5 zGs_S%rVk;Y1lmk5X)|;b+l+F0qvi7%NlcK01>29jFK!lmHu)5Hk}9 zut5p1K?wl`!QCv}bc9(T+{}YCxsQ+J!R}Oa%_M?n_8?@;ZiIl3z}8#X=!oP2xvI!@ zvU17TvoFrbXhFrY%Rh@N1^<6 z{Ow7utAz`eCskm10yzF&1Mf&TFMT%O{pzT5t<||!b*{5I*HzGIg-$Q(TyJ%*x577+ z3WwuJJ!NmSvNtIIjaKC*sua7~LYx|?bFP)H@N4nzJ(@5RhtnO{9d%No1VRdh>q|5wkqV645_fFNl%PQSTr3&e5rp{ef=Wf-x z$Lic&L5JzfsC%E)eL!^|RNYxt_x?({OkZE>K45hp zQr(BG(t~A6Eb~_A^rOx!tMiBzeu%=w%n0qKWhncwm3>tCA0x!g<5u&LvS6g1Fr5C> zebnkcVWl6VbkR}@R`!XmvP^R;WuLUNPcbq$h1jY*MU`SQ3Uzi_>O5_A zW~b$5r zFIk-zE9kJk4W!OXR%edtyiACjSFGwBsz#C}c|qMl)P33NzN)&fsqX7m_m!@?Y7ebI z-Pc7|ZLGJb=$d&1oM%qJdFBKhWKIYufo`!?xB4Z$-_gqUe2#7%EP#$*Tq1;IT?xalb2W?l>-_b-vWSeA;e89?yNa)g*! zo{%xEgn$wtT|r3ch~@=3S0d*h5l$Q?NX{Vy&*10_a<&sPri~C#0-U~Z(h=ok{$l%1 zU57iQIA^#z^<1+i!829p+*Ni84W(PvXY)1(A2xNnWj1HTzVclAlT#b?V?M5}MfgyNi zcS6kUL5Q14gpAph5Ks`z?ZQk)7)`0SjOS|P?yKDLUNnV@xC@Bjnf(YEvo9gwBd`q- zHaa5nQRG^kT&)qVJk?xt2mv-X0me2V;3IIYBwTbvxL77@kZWKh|2nDWnxhEV`%J*y zJp^olCIplKqrk$n6o^;~lj!80ciV&+6b#vD%wC;`rug_Djj1H-;= z1UXlVaGpUu%<~d3&r85OF9Gwsgn$y@944G}lyk00&Q&96zkqs}=OtjCmwig40Vp7yoKIU>S&CG}i$4Z$;45n|?QLdIM{2q*#0RfUs|C@0(G+T>g}lJ;Au z=bGCIp1G9}GcyTsa~mOJZYBg21odh{O-Gmoh5mFMa&HjfzMqO%t3dF~1B94)kPtVs z2pMx9A)p|*R~K$NBHa3ob6s+e7H-cxMx~f}oDerp0QkDGF`ibm4c4RXCRX=J)qP5J zpSHT2R?=-nevPE=W>$B$mEOEmI%X+J~D^XQI`auR03|ar3TK-LXtn@`k#bQgjxHk*@UH_P#{a(tp3pIVO3EXVGZI9N7YkYf+a@wsw* zVU;FPsY2OoNu52d&X=n5mDSmcI+4m4j(b~CXCKi~Tl#zIx#njA*0CtdkA%4SiGbxS zgn)wR1J;l}fR0EXp!V9<gt8T(tP=$hpTSj$a_nPmxavm5~{y9ogW!M&Dn(@`=n zxE;91k^30s7W-!~6)}fP@Ju@)W`+>rW+eh@?@(gKWC;Nk5XRaP1|8w>BVz=^*p^|O z5D8;VD!OJp0@h~}us)j*H|r1(#=1l-*Cqs1Kp5*t7<80`L7QPahH+{n|3_2NHJcJV zvoRrNHX&rpMudP8AYE5T=?F7Ev>CQ1=a~`CG1PO-ID%)kA;ipBLdI-O2q*#0^@Nj- za?Tydc}|3LBK2IeGXZO^2{E%10ZXq50VTjWQaI^|a}H`y}nS>5mFb%_X*^_G{Su_6)`_c@JyZ%GaZDuIfRfg2N41af_s#3 z(^10BdNGmQS1GsDy`!k;n&SwbIhqhNQwdmYOF+FimY6Yy5KsYOY#?FKQBp4$#*Pf* z`bZe3Q4x0o5t1oT79Hj$Xop&PNt!G3r*ax}m@+=rE+7S;d~ z@J>#^r9*^(k3hAlP|=~Y=tyKYtXzz2A!_DAAAZFfIF(OyTN1?FQnB7eF+M4Xd8J}~ zDArrp_{86gSq8RPsaW448=n-|;-zB!D3%g7KGEF?U`v#WEmLIU6T7pjSWde$-=2~> z0!teO&T@Jh?h56!2W4k#ed>=rs%94J4D56Q4xu0f^h4%uE}2V*-wILL&&RT!M2_c_ zL%w}HMlIJoPQW#Xgn)kF*g`ny&;knU%bw(TQ90!M+0)c=&1^!(JVglT2aYX;gAV;v z7IN%Gj+Z0xc%E9Wd4Z5I&k+LpfnzJ-praTM*15^#m>c1Eg<4qOLBRSB0@imB0zLxO z)4*?26103)!F5nwye>JzrPDU@BL;Y(S5%rIQ@DZw+J z5HjW?Lcm7|cpC|r4o&}o`ER(Zx46AjcdBz&Irr+toGXye`ym{sV`KQ?W|p?xw%i__ zaHs8C-K(3A^CPNqTj9^3ME>C4ap{QsZmh{}js5iltgKuW;-)T?^X!+Vm!MD=HYe3I zz9xkL<&?i`g$;M=Fyzhfr*P08^939Do&6=ga_&bW-|u%^Bqdk4;n0Wgx#KmFy9L`6 z{I{?{SdP_~ak7iv(7)E>K5`t}<{ZHAut*#SiMz5_z4`PXv07kYV@vJD1Djf^F3vrR z0IL#Ba&?V=CqwUpY1irnJ!^2N_Gw5%$29z@Uf}Q;)55;;)z=8`AJA|P{LjMa!wNGN z1s)BjFFcnP&MOE%C*in_(_02C?uL^Baav|mBz1DN>JFUYDej^$6O@FmF8`WUX3#9ui>Q!L5BPFA9zsj zmh3weCobavgM%c!a@}7QQ{7fE)%}ojNcE36#4*Y3&)WnhOA^?K zYZwmzual`yC+n+tBV=8b<`+*xM)a!c)6B3cWEc)h)(peVGVOEga2QRso0OueudS;c z@f2vl(>+<=6Slou*VC2?(3T4CfdOUD`tGFc2};}_qm;M{rv14>w$^n|PKd^n7u4vL zOuW5i@K`5V-ym^q(75ux77#aRTpK{#P}iWuxRJ%iHDT%NdPt#Z(@fU&7+=k6w-OEN zfs!1LR5T^)nR&swo_Py9z?3p|3loDfZ0)0ZFjowK1*^lxpyYp%w(CQGdB~qklchN zfk1$;?@3q^b_h%3y_r${J~Vq8wvE@>dKZk`Kaz`c}pI7qly1E9|ycn;B|@09!yZsDG(cX{rqoX zC#$IV8l3$+Y@qyaVXJ#HlS#9D3G7GHEM2vRXy^`l%%EXOcYyeXr=~QF+ zV8piFzoXaIS8T$D%neL*aJxX8z8q>9Itg43r2_X!M=zJC(7ud!3icAAPm_)aS64Ka zKdvLV*U<_MdZaKEFFMHNla1v+B9zozc+!lc^z-cCD$6-g@FFjw@{+5jyfReXSmxk~ z%(5bM^&}=0VR&>3;?fQcO`dP7Q?7!jVd-gRkmlQHswPYa+WORFzJV9sn0F~)EaMdn z=Jg3LA%0-AhhE+#7+7G;WOz#xu4Ym-dKpB}xIq~~4NQy%W6pvhr89;MXI*A_(TaVA z<<;MQ*Q|Zm0JI4&Y%kle1*~b;E!8wsY7~py`Ldpdep+x*3{363jMQ1{^DIi3K1D8# zyCyhVz&!E@6{!3g8KA7hpii;Ldwh(%1=-5Cq=B0baDRvh8D(YjIWRJ=y=6JJn+a^p zdZz(hrLepT5wqT%ESoiQgRiI!>T)d>Db5ltjrw1Y>?wbiB=X+-Pbp<*QmLpywysgM zZH@N|bTss6W6T6Jhj=0+8qXf$A{nrz(=^Fyhjs%Y;dvJ;&+>p}X=~hC^~}EDM1;JL zcPEvWS`Mzyf%%g*L;j7GiK}p9sxqP0|85C(Lc!e|jgGYh zJnv9<9kN3+?bKV)_@)L`-GL6bwN!Iz4s7jg0CW{K3`InB&XGYMEwbm)xN&ce(}-{F zabVrH_u-r7J;mTc-Z940;RGqh82>WHSo579*z|_^mDiARv27y{aA5x=4)QSHZVfse zr_X&If|T>=7bC4zX*aNf52@;wc80TBX;a$aSY>`o+scP+B=;?VM0z06q0j@BX5xBv zxrxMa!#<*J`AqsV-iS2}=HC7W5Q|01Um9WtP!+Ilx+>#k6)U)c$ zo&lJ2NCq=>kyDeju#FoM-B&_xfhHc2${X;N@k`m@$M8wJX{>Z&dysc)?S!8%ejo02*wDvgN`?(t%Kw z``IXs#}gY#gTgYBeSTfN^QC-oX9mnSr-i#Ku4&^n}D##z;m%P`xNt^C0pWZ5K|vT7QT zEJN!@R(mN<4y@3!XRV@Bn3AUvm+C-`L1eXr?Ppc`GbFeuo}@-Er1TI;DPN3z5gcE8C7pw$3uTi_ zyWaS?T1#QIQS$$DuUqhY@q32Z`jGjW6qdBRtr!iqph#c~iUhWxNNV%~*5QK17nQCBcI6dx)sFjM z2Q-e2sAJs`O(KI4srz_4?APB^{W>%+3A@@JsV9INwNF>uP&?@HC5#cf@nabk5PJx5 zjo3x)W5l*&ygPLm#ru#@53FoS9~ah$Q{89QQ?!c?-_?e}FphSB_U-3$c<3YPuh-8D zDettBx75$s6s_%VPlE5UB>3`5Qll5-eT2xHFR}XhSz_f3thtP4`#Y03{!SzXe-25F zUcfq1u=o^Iw@4g+F-gKdjHKW%B&jh3AdePEz68T>n7&JhInv1UQpU6W zqe-y;kOVspNow>0*f9de7ejvh)^jPb#waXllgBd}&a9IZ{NqS!bOXq-0>T&77}>6w z$IFP(VdU{-#NF4tZl7xRMNx@%6Qey}p9w&%=iRbZhVvaY`Rbf2rT_nNYMH1{? zB&pF0V8;s>Ut)dOYGQR6@;aN*Z2w#m$3KUp;GacOqZhDF5G=kZc^S?0Sl!&DnZ~<} ziuQFsVdrFY88z)AT?RI7=K53^qr>4v+)zW&;YjCjw>?UCSC>R$Lqp2pCi9_A&~e4P zlC|~F=t{)b;PP$l+b@lGX`gr+jeI;53G*1ngn$G3=BMEo^v%*^s=3BBs3TuM8E_GT zbKQo@iwIZkgwk(5_xzZ>W4kpK%PVmfusA@<#o=riekg9ZO94 zM6hy@!fJtDM9^2g`nH#m8}1+QU6!4s^gp-3HD!*VE+XPHe8U@7y`}UL}>( zl3?El3HE)EB>k_FVEYG2jRAptiXihPKvrWk^L`DnXByZyG9vDwA;CQ~B)Er$1ozO8 z)EEMwrwS-vG^p0IzD&&7hCIK?c(#8FiQ|8Zq~PC7Qll5ZP7^S`#LDJcV(nmH-OgyX z|2-1N{|-sQ|1L?vzm25E5PJ2?qy*9hVihsfyD8DOOo)PA}RRmNNNlL%;kc~7Za0p{d!{VYhXUZc((r> z32a!9z=j1$(%(P=Qx+sO1_bmO0?iiLaT4i5jD2Z%1D}cU_RC zni?5N$OVBT;ld=ur&vWDy5H2SQ~O9pMUGKv?HfpIIsy(Rt+^2pW3I+}+{e0hm{Hf> zXSK5Zk4PNH8+JmKk{+&1kUKK>~XnB(T>(0(%`KHHHA>3W4N{7NExb7BNpX zFvl~V?RSwl{sfYQKar&1k0Yru1Ta?$CST&1w-EDm19J-F+5S`#tl5wxd~5|Jrb|*| z2w<)fOum?ytV7=>W>sOz__`(I+5U7A$KQ%1;crcn^tT}?_*;BF`J$68eK@giBlbB8TgLLajA;A2 zkYL?{B;oH&lJw`1U=@R;#(==SK(P4|8PAA)JF#m9_U?>m`+Jc%{vIR=e*sC--;<=^ z??zH%Kww`e*nEj#vt50M*eeybw1xc`(e@7@!Jc#yY(^)k(Fg{)lb-sah z2&38lA`+Z^BuV%SNpJ*`q{a|{{G34Y#cWp`%fCm=&niqA%a33@+h0oJ_(zf?{3Rp> z|8SBTLjdz4!Q_iBEZr8qPt1!A%wri3YY`-le;i4|Kc1xEA45`O2w+|;n0$$2-a*Vu z4a}1n4{H-7Seqch+5`#KCP-=w0nE<}CSMe0w8K9p=kt2;?saGGFwxHXLhyNbDPpysu?M*fJ+^ z{Od>({`DkD{|1tR|5cJ20|NUB!RCt=K{yw=kJw)~Wbh3}#Cc&7Smz;uB}kGQy?}P5 zpz+0!0p)o=v2Ipa(szHG(QN-V634%lq~PB|Qll5Jt`aQ11O=}9>>m;979(BXV>H{p zlLR&;Nnlfw1jZyuY77C$FA5}Iv_e2kmeG%id7F{Gdl=95?Z5oa4n9RER*g#S~Lr2h~}!GD0H#(=>7l3?>C zGG;T~KOy!VM!FwkM9lF?9RG2Wg#SyDr2hm-!GDyb#(==SMzHx3NjJ;vL1O>Fkn?XC z(e|Gr!CapNlYEjIy@2**LF0=OaC87$84O^J=*4uG9$!x^hCQ74L;=nZ0LB{t(h=^1 z#ZWzw#3*nf!yRDb{3RJB-G{=NWEAgn0p2c~!MixXJD?w)F}N;+XMH6%p05?!R}Fba zuYZO1i4I~$ufJA@=(ntXbJWLJG7o)Zx+;tJigQ!~R|FDx06>u2J-oXc$@OpZT6?EOZOV}^pC7Iu)$A)lPx4T*+K#v{3JDoK$W^ysuW*z1=W}j z5%Ycna|7eq{$EHO|2dL`|2#>-Ur$nF2w;9iF!^F)vd;gEm=743FEO6&|Bb})UnVK| zFOt;g1+X;&#+Lw0r|)56{nThb|6nw%6OlOnYa|K(pCkqURgxM*0P?E>$rrPqq7M9X zVm@qOzRh^H|1JsEhe#6sJ0w^pBB?P1FxLtuUrbE)A&(IA7e=1{!+5s;F^S`UK$7r3 zBuV-okre#*NoouT=<5WUFIt>o-}eh*KW<qf!)D~*mpsK^V=jizfFSk+ax%@O;Te(VD||&Un1C)#S_H- zvw=OC5pf>@iR0r^QesabDfp8}Y77C;uL~$&G$`8y+t;s%`K%$|X^dz4Tav)8CkYIC zlGNx0ux|($Ujo4ri+O*NSkD>ho6cyqUnX(oIQ|YK1%Eq|8ohvav!LxlJ|fweQEVLgBZc8f@0 zsfeUTFJOIBu=rwNu}pqLtXB;A?apYp?~4TUe-h09NigvzsWAi~za@}-G3zHWe@o1N z7;@Z~@i6Zvas2&A68`=q1%Drs8bbi{7Qy6;7NG9?o+9S!2Ie7*hxtDV=Kmy^|C3<; zPf}wDV18RL`4Y$c9WmcB@_q#4Vg65o`9BHf|0J0Ilhhajn70ZhU*dWHJu%-gFpp(C z%>PL+|0luxp9J%Nk{Uw*^EScci;2m4`3GXYXXO24#)I8_63qWeF#jh>`lpd#8Gxk5 zfPlVTp!uRj5ca2kB=!dec9jur|11*6Urv(n&mc+qXOa~B3Q3Itf&Cr9=8M9vm@DwD zmt#ji*5Z?2b8qL6uIAC)1NSHJwTu}urqjdJ{{8mwR#N?`{B>vnv1xK+X#(!R&3u9I z?s$Ax5BwA1?t9q-FEiz)Y|m5rn>n?pU=N(354{ftYRiIXS;pdfVo0ciVf~+s)N+M9 z_4~#>+z9RH(D)7^3nR>X((;h^KQr&mxWsnq%=)L5@kZQWFIRnYMAxXwmh=~mtD&?- zeZ^vv(SqPsnrB>-7Os>wc$ezD=hu02IfkEfBK#)Q`SlB0=V7R>N1K33Oi}&s2Z8=~ z8UjYtL__vx*Fhlr_;wK~DMRbMwjNsLLGK^fgv{@&$LY@@CIds}n~YYM$EIceWS#fs zWZo}morfXwH%&m5dBfMX!-^bMNImX7%|75`qYvn11GoK^B(RG{0=sA=Nq+?i%%hRi z7!ZBHccl;DOTYf*8Dd*o%HB(vr(eK`*keKB_!p8S{Lhl$);N-ae?Cc#0fGHJ!RAW@ zo8#cK#C8nq%Nf!3zd+*nt4Rv}Wh6Cv0qy&O#+Lw1%V0gRQU=x+8O`>;Oyc-glO+5v zktF?VNDBT{BsB&E@*RTAmqV?S z3jU8tY77C)djyj&am>FGv(3Q#Ipe`51c~E6LITUUBnAIrk{Uw*^IpN^i;2nl@ggxt z8<X2ylK!trU^s%L#(;qSp+NIRLrd8a`z2zx8`!^NMBD!piR1sC zB;o&oBssZU$k&^-TON+yA`Ii z`S%#l_CFwT{P#(4<26aa|2IjEA%OXSVDd#Z_IBI-37opeJGT2EAEa!#@AXykm;jwb z-!DE9&*0HTf*BM^jc!2wsi5*DYR~2$l6N?3dp0g(+5Qv~d}k$r^(>May#V!)K=DPb z9vYj%aVQT;itI@+Tu0Sik@l3_YyTSfTJ_!Jt_0xw_PeP>Jo*{A)Vw+TOY}M_h z1&L046SG=d+l$5OPq2HlB{@8qKE-_kkBu33nuOzSvJdf|Uc38r>kwpNTN} z6189RIx%J_3|ZsNGZt(Wk>HYUk{aEB@vvaXU%Rc#|008|i@AAY#BQ5HVnD2pDt&#v_8kmwGxlPQOKrIR-{2W8scN z62~7$Qt&%SYV-osF9eD&3d+!AR;f~OupdV6I|2{g?%pP^ofR+9H*hyPc}*d4eB6xA zcIT25eB7xHmJ9)wj|xk^)Z22>nh9*RZ#F!S5uCFds*J*@!VhXKW-)2okt2_48?B^^ zGWZwMwW}e69`d&REl6;qB1yrYN>Za267-lPh%ZV8z*1*C-vO50`!AgGGtPK^Tb=Qw zE6#X6j=25Kc*f(&8PCncn}xK$3x1aE-HG#Rw)X@4R{w%&6nY6c^XR>b7x-*U{R7Rn z`Zt`}@%|-F4JFJxB1c7jvZ(a4M5=os_o)!g=o^9s2o0 zJbUQ!U>T-g7;h`MSAQ|uN_FYrjOzUoE>>63`!%WeAmlyCO0_OTckFGA7#kA}>7L7Y zboEVyu6`fsbLTKAIFp^UPTf@A!X(cNld~p~S`$s+nn=3VY$7@Q42`tlGa2qgK%a9w z=)YN40(5U1BsW*u4t04to*FFJQQ8&{-u=i^V+N=B(Z!FkGC@`|-lLR74@?WB+)L5R z0}fGVAV$xRHVhqZZ7hCsh&9@4r`NM!s?M=DTe}}(4MkXKYqU%9p43+*Z|`wnN{)mp zzS3jborGnZ(v+Y?Vj;XI5dpjTlU8d(Ndlr0FVpg>2X<7+bf2qXW-^`5h*G0=VDWbU zLA`lpysX$ZTDA6M)tUv5u2uALpJ3Jc6@JiYB=r)@eUdJVEBCSTyF-vV!*&%;>c5Yw zCnxpg0S^Ds4)Oqp543|kP)-T!5(jsAiJaX3pc?Upnq1Cy-@|j|32+jd59rReu2?S) zIlc4WI0~Jrybcd zVLTknj>N<6xOhAo(+To-MHr8!J4}9<6~yEH5v35syDyAKyB%h{5&iRbLp|P$VLaON zFyl?{ACHDn0)E31x*T|DeEW4f(`PAKVye;&FI6knu>x<8`f(GztFI^f<)BbU+&M(# znQ}8FU+N!kJ(_ipl2gKXFas5d_uKyQZmP$-B8=CZZ=Tv=)T9qFd`0VV2`x>U!nean zun853gpEM)NZSRGeiuf9!Kp~3KQ#7>l&bCkft{N{MLyX_mWq2whVC>Iy(M&~ zStO2MCMozcNNV)Lpz#~jMD-HtPAO|wG`kN~eh)-qWu)1`mQC1d=@~{`Qk8=nEts}= zFli-vn%tcr<%Ae#C}k2l!7Xs~b{s}gdAFh8%cay%mPsYN2O(WKV@1y4d#qt5H zKm3Tzp!Y}ML6dLnX@(p24-nw12$0m~n__+|r49WMjA;jg-A1GB@-?t@g90ORYJ|HO zX)r8Mu&2mmfWCtugfiI8ltE8S2E#=LhLws^lX~ed4duT2q%qqx+v?e6p_hgf#S9cC zhtZU!rjAP4?!ic8OXKiH7t{Tm_e01J`DPq+G_x*56}6lmyOeg6O3;xFw)d+N+Xtz| zl+5izTucb+#fW9>N;%2-+9;OWH?d)(uWNJ=Zj1`YtoC({4Z^jD*^ zJP$nvDh%|1kI<||Q;-KZd`t(>jif7VcSrO@sF=8@6b?3wlaq{aQz%4hQ2)eW{K<-3)#s>V5AgOeEBMUmlQZ3zb|PXJx*)Hv z_-C6SB~?#=+7Isyj$_-cE5gSQJyggN%-RP&I! zhL$usDQ)62pOVeYQ001V&!@?X+Sxp-*fO*+WIv{-4w!q-qn5Y^IV6t=S;*bIOuzM?R z>9m$GTacIEco&c>tbK-DVcrv5M{2G()hJv?dVR3&8!|jWG5j!^BbfU%b95oG$H3C3 zwhB2mKNi?yH1^H`_89LvjCz+5EM$;U3~r6)s6F4l*&KbATs!g|A=l1)C%ATKu1}!h zQ;r?pt`J_x@Jn>gta~$>qjC9hW{y5b?D6^WA@+p)1YnQX*rx~B<2{!-B3Q@(ixFgS zdo)KA^Ak6lql?J3E8i7zos^#hu3ehz2T7HqE^oe>qo2_^v+kp4jwa_Pn>o6e*lykp zv8Uvx0Nd5r*9X|H_Y!kNurNnQD+b?<=BPX0z1bXno?J`$Qpj~`ek!<@G*>s^TJm-? zbM#h1a`bUDM?Lu-Ge?&Yds=>4h`mLA3t&&v*jVq7@}K7I4(!Va7Ut**#o+tV9BrB3 za%5^&wh+r!LJhhn%fnxk#<+n71JjM&rj(?jfS^V{3M#AS@~IJj#d+Uc7AqJf>XC z(L8ToGe@`3IkS!@mW|Y0^29Q53F|U@qFOnb_H4Po8LEN zxnF)iST@`@U|HIlrM0j35cp|U_@D?q181|ct52Hq*uOvdBz==8TKIulfLUQH*Hs*A z1@wcBvd(ZB{h@|n3ACYdA*MI#u$ZBr*`_|$l7Nl*a*66iBA;A?3rX^+ei|7x1}ZjO zzDt&|d;^UvgUK>AvUI*7(3YTU1=>=ek*QZFs*!O44e4xb$xtI}K;|&#&Zk8qgBk{n z42$$bs9A|dHjElsIzKGn0Ts;D$e?u*EU&-UL2n)E@J&>-T8gk`DQa52==HG-Tl1}98B)*6=384vma(P>ZS2n+>9cWd zjEYqpd^t6?meC>jXz%L;kLyg?{1|{=FW@x=9@D(27{$SFVwjeW5WK_t2Em~Yg(;_c zlg)Pm9J)DD4r8ZGc}(kq!qX3YIm5I}2*D?KHxV4_Ob8B*1>h3_{vw8RtNaiL^=w?j zqAt@f55PS>oTLgy&5rRWW0Qi;w$43{41-p6)9@C;5RW$%ghjbruS`vW6%#%&Otnz zF9WF?@c4L_&F=;9odvv8fyXo*j%#u7n;52L-w=FX?|THtXcne?|NQ<)`F;R@ z38TMN{uyei6VI0=y*PSp^=`UKZyU_XlT~mcv5u!#tnhhvyFu z!H>uv0r0~C{v@Pgm2blj#1hj~j?5o9b#8nlVwjdCA@~ySJc2LHFAc$u${#f~m0#L2 zvb5YP9Sqo*igI-R=&3u#V3#vY%P}GBG2SY|9-BWlggq{Q9AJ+H>{ui=xK}2RZSHd( ze-HYIE2_vys3Ie=SjfFrMVpSwR^8#8T}w~GT8+u`^W7OHXUzya{X)`|l`u(d+g!@2Ls%3wYGAUNuMX$RvO z>*0rx6#PR;YIMVr_wQuMn=jFQX+wyy5YBpE+9JlX{lz4>dyoW&GDvFl0@UvXiZ9_e zpM>=ZYK#pme5zqqbE%l7flu5cxeQr_ILwut@?(gYS{EJM@zF~HpTWS!B1w6z1dgs) zK*b;mtgR^VY!S9sdv2KZkIf9su3~| z0+o(Vt$PbBjPabhZIPvd-7LAw=&8fbNX6SHKSxX0&oHbpGbrWiJkY<2hl2J-6zxc&oh@mjk6VIGYTDB7_^TOnzqkNa1q?L`AEFK7=()5cYQLHlv z+g$ZXC@W3XCHTb*4|_I>EvYg_E9iXr)S4D3bm?`8*rz)5P(4nul*(st{f;A_>?UE& zrMPA}L$>6ySi8x2olq&O{OIZ}1-Mn-m!N6pTB`i|B8L}mB zW8rB!dFQWwZsG*MS+%vK&!_}8dR=4%sL0zJV|;a={?J#^qYZmbv>cKi2yU-`cHw zyH~-}>XTZr#)!{^Q;)=wZM#>6Ti}ID%6cf+<0ydmYFTr>GZ4V~SD0jlhA1lYokm5o z%4LiR;@}H>X zKN0fBvRn{OR#~w!*Mk*u2n7?a-0bI2SvEA`+iV6dm~mmBvt=$a4@Es3+ReKeQI{<) za<~xbMD#69%pm@FpIsZ;S~Awx80*Xf_AS3b-2bj`nK5wRf)-}1*~;d+DtB|J?xuA7 z=GzhNMrm&YF_}7O6P);o*#xOVoMk!L6=&+=KMM~VQ)jdIRr{k) zz5QiZoD&UsZapM@>LERs6$L$C*acB1$mW|{hLtZ=?J8_*7?Edje=XZuZxkO3%eo@c zN3}IS8fFEa}#M>0g z^Au(XomQA3bVJBcv1QnLP6e&nf&I^&Rx7H>`l!iu0o3&##B4Pd&VM zDwBgn{xCVb9W{l^QHO1qEZLP-ltg)>6}6xhwdhtPx5VM9SX=~KZ$A*fjsJ~kN4ov! zb5AL>pXvqRuGcUw#52|(K1%|tZzMIkVc`KE!?D?vFVQuOG%+rMvtGlvn6YgC^CXUc z2}!}fl%z&4K)o$cdgmhj>*1(SNha5QJx6c7%&nKXL3ri zlG0b+h`DRXFSeAziCrWf&QX+PNu{s+h#4=orot&)BpxeCGkxWDGhS=~lM}E=Jna4~$wEnA8FQMtTw=>K z>?ez6eZi*CQeXK_GfHbTiPZTbtgr#Jggp~1@?JAuY&yYSG7^uh-0d($=_}7O<3-nN zc%SpsUCboP*%a&#Ev@(@sKl5*ii>Gf#n>ks&hiFfkc=`|P6l5R2J~^U z&sD85^vMcv$RIYA=a@MNgH)8k8DwycFrbf%eY0w*ps&20nSu<@$cHdH8sXd-N&COeb@O^4myt+4?ccK6BeS9uy83TP_49-oa ztlwf}$;uepF~>Urnm6V{7%+!BPVnBk(0c&~RfY|zU+6gLx>oNb1kGU&YxS$((m?aQ z%P}iVtkIW+$}qTCoH};Uz%s_|Vx<|d$e+N=`ztt@_eDO4@tyugm>?Y<&K_XDDb+{J zDlkT?eY9BfoLz(ZqjiGDVoRp{0!9Z+t#tK|Ew*zU8;?OSEg?iRz|u&rzV_Z%Uc=!f zj33hvIGzm@zY56&YQo}3{Ft7=ac!XZ;YXIf@~BAsn7+XAZJ_w!cNbJ`jv-Tevd)^Bk^N;21ls2{`Ie~JTVe0rfP85 z8HnozOtsQDpd1^yj;S0RRmS$`8YmsOr`3oW(>gd_3=|b-37{XH7Ks|uCpZ!e6cwiq z5ET}{4X!awfqncyQE@5(QE>*|h#J!Y*n1BY6=w_(^~aH@vC*Af^FUGmg2mIm^7)ad zv2mMQ&YG0i)(6YGWj7Y^>$R_JOz#m#AFjs5gYzD9W8%14YHb z2qgHLNYvQ)$knS+1JtGwj9NOf&N4RgaYOt-@d^@e(g28SG0cQ;!O(`wofq<0gBsni zlWcbL2cLYBX&H~v4R>qcyL{Rjfm0qij&HU%hDW_+>c|=6E7)ylr3M}wFaS2;u7V{YOLcEROt;$U)G^#(k8f8&T${vz-~xY$s^spRGW8D*IXxU&fu8#_41+#DdI zL{bQIB=r==1`~cL-y9&LL{fO82^bq)_z`k*fQ%AJ;l3tdY`8%=4+NMfE;CAnaZDL* zgmx1aN^Jb$_&-1jqkxQ4y|G@(x0`^m0f`F1cKxeO!vs_``7;vAsMW94aj_Akp3vAp zMMYs|f86wVf*P2NR_&`}4lyxfgBO*DZTe$IsyL%mzh1}tKD3cgn6bf(%EUlvte}HF zy`IM9j8=Ua4JK$cN0^wgp^gg1f&J51aCbtJZW%g!XyvZC_UW`ml`D-78zw=bo+dwh zT&U+EHZ)S9*uFo%bmd#vCR7@(IV_iG*zc1vfnm134jdaescFpX58N{HayI&|bvQev z&b1qYB1H8Yb>UAp@nfSaHIaew*#``aPY4tLcThUQ!i^2V)Kmt>XP3~m4z|krrJoQc z{&EvPHcnHg85o~E#K8E3F!4v2__4v9I?urP>@T|3Vc%B2^b^9wzY97_D4*DfPsM0p ze0CoL;}gQfKgh(7sRh)Y2F7QT?^*}jPyNzQ2owJuC=X%!W4Z%Xtby^_O?9ny>(9Z79uw7r7FhJMTSDHaIDh-ZiOp8s74)c zqocKfhR0Iwmk9N2x3Y_rvlbj=HGrkqW}5pccn55oGzSdwxk-aycTcZlPX~5`=$3=! z%li(X+*TB6V95ui=7 zE+)ojP-jbXEGNCF)0&Hq&(m-^s?koRVZ!SH97=9VXBRePX|{x#eyaM%HY;^*0@gbk z66s~mGVe&JD3+CWg4?U^(brecwrf)$2FLv_YaG_&Y^xo7kqopI@p7L7Jb+;u0jAW7 z?wdN1OykTjtmDIES0Yi6i? zPi?`I>}8%9;?{8bB!N(fs}eC34VJ7N?|ae!k!Hu5itx=+ZVPfS{^F#)@58gvhCRMF z5Hp7bzu-pjp64@x74pS)tIxc{mIQeOwZD6fJ;Lu%&eMb}^S7vb(?kb-QAp&wZ9Sa~ zByD4oU1P-7qOewpZh{v$uW2kDw#K;ww!BkO$-AgvgB%24l z7qYL>8#%fISu=C=8^sVsgRD-ndnK4;S1Lo=cHa?ckE%S5!AHs%Q&MY~@Ep4&SAtcd zX(+A*9q%u3mL8`#s`9DBh%*I31L*;M!rVL zm)Nc%EI}c+mvyHt8$0H0_dk52mWa{Uc0a7YjkMj5!#8&>8#g6^JYgS^#+O~uBn$eD}mtYy1m79~4l z_%(l2@Q*B6rD?;RR`-1f+A3|u$Ble!Z7fY3?u=CKrfYMtG9%@j?%qQgl(1JTC9S9d zo2pce#xlX|b0PW+Y*}DWSx^UW2dCkx4KdXa=eCfhWSO<0b(>+q8*2lk4xMeJTaS^5szN54t3rf5N1e;`K zrM6=@+Gwk^4tLsgz|3*(M__?68&JY$8WLtdcLmZ|FMp(P(DEOLkVX8H^1p-+IU(0p z_X9F5O=6L&$I*P0q@YfGs?z627G3&G+vmYW%TJ^?+$kvVtTcWKN(M!X(wkS8Eu|Ne zZ5M>bPQeh_0J0rWW<3|^L@_;Rk6VJyRc(DIl)7r`^~3rR>!Do}tokq? zVkvI}>&H@WyX{`aK!4mlY6a5-Lf%1Nfjr9}dP-&pgrV&f$LU$ev3S^+x}LL+2LRZ$ ziayn!;L&HY^+3$BT?ZuQ9Uu?FA0zfpNjh@=L!?FjXCx#1hZXs`a(qOQUnue@Np&~` z>OZDj9#`a-iog~M%x?x$2&b#3aZ=@QbV2I8xI)G_4A;}@u4I&K6@y^IDy!gLd61sJ zg7djHZvG==jVXquFr`}AHKsfn>RHO3FzngDp74|KG3*Hs$GoA@uF(~vJ=Ey__Jrf{ z-owbh{8Pj$2)|!P`C$hW`Oy{ppr!Zc7mp|WHWTkqlwDE!wHiyQ*lOrQJJAg6WD8o+ zI(SuYg?>}L4L^;UR&OmTwUzO1r_N)gTNgH@?OqCWV*=O7JYl=P!85gFwz0OLexTnb z57id37#Dq(F%(Q_tnw&zb5r42890s(p%Uadi{hL^SCYVl5?ijZXvaXTs;RFd;iG8-3RVZ;M&{@rYM6pB&HSZ}pSsSeN=P6dK?p_mnl6*oo zr8nDlFIz?HLZ1XfH&=}5%0>cLX)AUw8xY>49rdza2-{BOp|Y_0Bn73SdcQ*;q((S4 zlOwjzBGnD$=drIgC^N`z$QY(<7i-*c)>f17YUBCPuUe8`ws#z02xKqK#h81*hEq`` zsHjp|lq@Jw>m&slu*6lBrgfoqlR6l@s5${aRqCq0UIN~2EYlU(3x<1!sYYewxuLZC zii6?i{+_uEyoaDv+pTIRGTXG0F|sb^vnA!SiVl{FBufJU4lK#dmsN^Y#2X>OAeQ)e zaVR|djTejH7#%MdEEq2)Q0APEFNPbdz2nQ1U^~{&Ku0ofyyGC}{e<74U_|^d1m4Ju zjDW7*dpO=u>Lg_(8aAUh7QTi;DmImN#Oz}sy~9b345_0qlM4ZTqM_w6erX|=SN=$8 zS=rWwO<9$$VDfpV!U{$&TWURe!Fv9bLOL)q+r49*g5-^g=11p7$*rOCCw9nxLK4o^ zS;Nd+5=VuI3U_HLYJenK@}?^r6gaySNsk)#$afL=@(&Ryd=N^-UU7mR+m4s9?Uwr3 zMjth{F@JXFE9feuXf*Glq)88Y^TUy7q`O$kwC;jEsNyooNnF{w1brQ4krXX!G-Z)g z>jX|BRZO~vuoq1w+ZVfc!vLq)p&X8QsBDZg5_$L&b&~<&NZ9c>0{Q?xl1TWpwFSbD zQ9Ss;fNK%3GY_M&iMI6Oh2EA(*LA9|PO`h}`KvM{OO$7c!tbEO7^^V&Q6P@7^&l8K zf{A-5Jc}+y6eLJvwJR)6?F_6@OwV)#zkY!97+6nX3SP(RP*_~-k7Lc)6xKpX*AZw= zb*xT>#f5zXtDWg8Blr!2rAuM`88xU9_h+T*b1M9RGl zl~s)XHkKOj9z0r^?(tagIg;hi3k%euy|dPvhp62%oT=EC{R6}-4H?lrtyS4-E;?%^ ztbE`qI@fvg85aDRj`^Sk)_(_9cECF^qOmj+x?0=fV6CmG)P{o!SGhR!nM<{07kdY> zJ*mzN;n0&|O40MIx@v++lJ8t(vpd=R7d*b`HbJzXiU+HDSJAoNTcCODJwQHoq;=YQ zJ~|-l?A0z-Omb*Jh?p8RSayD2&kkFHu-Z$c#{7I*USDz>A+-O3mwW;%IyZRxY?fDh zEMM2SrwA{$omBg$$d`N$Bd`7b2fT)%po;FN<|UuTiq4JR0h{F&FRyFer_m4m7c!L3 zWJTv|-a(t?6_?>x+#i1Wd`bJk4kXa`V(n)PTId4QvY=t00UxaF|@6ow0N{v^3XnL9`-=0FUS9r_%G)WUKosJn!#cWDOijq z1&dLnqk^Q54p@%~k}{SlE)G3Jxor*QG4xZxZVkHfur0gnjv`BOF`I>UqzgMT(V| zh7C(?Ise$O;m}5_`dvhC%2o~ss$PR$aTbmod#5Q2=_*W+PhY6E_&&(UoaeO!D# zE2(zYgP4Jqc`JR*31VJu9^N}}^24%_Gi(7i-nM%;uAtJsM40;ByE zKPm>pyPM?2NW$wy9f@)FL>xDgJ`BP^`Wj1H>o_kVPH?{y)Osl9Sgah4rJ>2R_jj^? z6+dCSwk=GTtnLVZB)Un-9R{B-fcGG2;9?{Wt1)-@K6S((iQp!=oJs^j&D5#*2ZfLc zlggcMxs1ljHzzXQYfS7v@e_RfLPA&$zXFBPL$r-BvRbHCk(1@y2Tw86(iEgPDZT6< ziI(I9iB6V|93;`)U8fVBES1AVzfK8f!{l+#TrL|Vuas|2X1zCO!$$o&A&$gHW+ zyiv%yG*abf2G1Lltn-#C-+_RG>6pQ?$MqPUy;N!Y zFne!F(c!>2dnGOvaZ6r99v2m|!lX*Wn{iOVdz+H@7lWqoaYVjl+13<{9X(MwNYMqg zGF`^e`oU_YWG^V=bou$g<-qJ|Ii$#~rGWWyEj4ZuY{(~-)Y6bz8lLY`YX4?X{YgpM#-R|)w5Z&qS_E>-lxGeu zHxWl5w@kSi0SBo+B95T`WXdlME;mX;%Pmv>(I(_Zao`J*RE$jdDu&dJq+cyk@(5~C zrgY*aM9005q3AM@awxj@q{6|ZsFpI%RW#&v_95jAJm063|HGge)XhL2{46B1MO4O8 zYN?g1VV4zq$z-Q*K(u+46&%lraU@ ztXpcfjBhr$Qbae_el=9dE~uedl*r&>=5EnY%vqF3DCQ5OGGmcgmk9TN!n~}i6j_uA zSCBtsiG0MMS(Hc?Du>kjJ0PGfqh%u1IVh7{`KrOoL_{5wNv?d-;AJAB4$_koLu-SS ziAXvqlU%tKh=cVPl(R0AT=}1yEE7sOER&onz`@Ief^OEm2J%nn!HY%7S_=Uk*Wks% zZL?vq<_Nv>RLbKMVV#xFGFx}KV}h=ZHc{%ahr{Fyk5 zfU_-eg1H#dGd4)im>@l)g^qMa2^|%rceJC@J0?i4OtY9?wUWnG!8o58{|9`yVrcTA zTxR|czgmK;=`F@*@U^i|pPznwhM~Cs5BL~sZp@Eba*Od9e7*F4oFBE^7UT1&ip34p*03ay7|~D~#ybkf;^J;ue3zCv-{zMc_a5nY z`Eds;>4pnG)u?rb5x|r0NEmOpzK$6zSMUXd^Gnm83*)9gvU4|_;setM17(L;O#5v1 z6X5j|!4mbR$4OwFQSO>iy~=2``4aSm?HJaw_j4-KGT2e}A+|`kFQF=7K><6}_`Mx- z^IgVX{+cXxSN1_5ZW!E;yY!Ei7u+x2HL9{oo=4+(Oyxd4tNZCNbwRCM{}57@^6()W z7b;K0Z|g$!CNIiqQQIOpUfz(dJc{_ zifr$X9l0CQlPm&BO29l=`#Smc*nsK05ap^Oha_^afy&gqTz zewj)e9;CEe-3dU)+Cfm<@}U_q)<25ySt+wjP-f~)UX+tAvlc9BUyI6y<)4K20^qpU zf(CCYyOYhn5M|F)yd4m}O~BjX;oB&@9Us2sOCzx1ql9Y`lBLFx_(`|n$HqQKdq0%~ zqkQvN7bk1A?~y8agM-pr3#SGYX2XWWBx~cSwCv;O*Q|GQLlTq~_s4Qf-I21wx6`kn zLDEjb<@|hvbEl>8xc6BqKX#AX*Q2gw(wWvpSEu;1@OpJzL)}EdZ(P5{>4q^_SVTf$ zrVNt=;x7UI9EG1;?2eT!LmpOIb0L%NC=-~o37L395ODQL$;0|HdmPN#4Q3p_?*Om4 z{7q@Co2NkMy(Z&QebT(#YaeWOf9-D@w^mQYr<#WMvvG5xl-Oo57fjAd6&XT3O6ax)b>Hip}-4Z*0Q!7db8LoQ(rxr${a z>|(&m-3(wj2*brlFTn?_?7yHFCkd9rL7u^?u@o-gQ!&qWTluc9Vpt{9T7k9Z~gA#UgV!@(=x(^ArmADPy| zJr0@gDs|UwL>}1tV}f!kTv4N5K!#BM_=+%{`oW)>KhS4{wz_`}-v1KN^#Og3)GD3G z!#hvoS@!B>bVNA*iH4nxp_J z{mgh8GFAP<;>rtXr36MT zenOTu$=&7X-GD2yyo?cD40x(_qVk-oD~~+D;WX_a4{-3bgFL|DbnPGyaQKXNkOw$a zw1Ygrp{gC^0S?QxgFL|D4DBEfa5z&t$O9bC(hk9c`!=$x`%83$@`sILy$FY0&OS-C z36aE_8}vG>P3N6BQW>NhO7Ia-}u!XW_c4Q0Y)A8B4)dR=)3l|Q)5yO;TK zyk_=+gPo~7WT`r*I2!e57lb;VbpSd+FH-`&CXE3U4FUjmFH_QkBO8SEh5{AILeRA1!Tm)h9%J9!(8@5sH+$4DI$^k_a6Ja$S-u^4iV9oR$~6?V>=yp_gI zSign)?yUPNP{E?ekkr4%J+svVzcm9QZy$m1~NF>+X}zqp%oTHMx# ziP%_dl*sT(8J?AW@B=k>=V5HO8$xU)KRIpEvpQ0d`ej({@7>iZ`_{xs$UX=0A3dV- zzPNHG@a0T}7UGdj(EC=KS*z#ICGHaQ{L+7X8nXRHeRuj*s>F zegR(-5+z|MSQ*^UJ4RP_g0RvPg_QWvC)6JNJx~^Q?O*X6~AkUMcRD@W#cRniJlXxSKRo zZ!(=rWAwIUQz8)A?7eWfNL>XkvqfBGD59-SL$of(>tO7zfMHj0nUZgpPF0uY+Z80e z%V6qZAHV9|j4o(kkz3l%G{?|Mko64wW6YC3_J3c&(_WjAe`(i<6W0!i7$Ok=jVS` z4ot1lp8vm;!wQtcJ}igoR-C;KTo&!PM?5ZO50=tUi3g|{oFhJ|!g~d&>5;KETG93V zSobaaF3~b|tREt6`!a1RRq^pLtc)@y@Z17j+*gqdUZI`w0a%-#}6EC@1=Qm-kNBI3DzmETTpx91jU+|R*?K2y8FP+`J zRNaQ^kCUn5vOipK-kV{h=0kH9jX)eYv902+6J*`ac(|q{=N^L}Zyd%lpCXHAetabJ z`N~m9MCBrpfT0mECT}L?Qb>bcEuy3aji>!bqh?nR0+Z^$aE8+7V1kdv>@r0rnAzIa zB5PDt%Vale_IcKL%4Bin2VkU{wxJtfsJ;{+qNmCO94^xi@&Jd+wSzpsVYPOU2RM8| zJIDhZuFwwh0Ea8JgFI|)yPfP(zJQgp?x#oVrPcLFq8uq_uf$d2d$4NM*M)QBY|>mR zrdFd?R*_-ObLOIK`3L3wOJIT1F<((+4T-yP6l7!BV`MSLzlLtoApI}P<8aId{A=+j zYaiPIXMfa_>JL!Mu$1sG6tI6Xj+el$`DrAMe+o&$Kb555FC(cj1k6s1N3m1&A%Bsl zJivh|5eIny53S!E0A6-4lWpilTPeMWuF#7n45Syu^il9!W#aS-$3AkApO&6Tl@ocZ&kL__HS2ZwpEg4A4@XSitOq1 z9n71{uG4`TlC= zwbXS5YJfuXxB&$$%|jm8HV#92=SqDrrW<>q{(Q}-qc`H&@o-rcma3-?ho?9sye;5@ zlwpBGyP&4SC5Ww#PO3T4Ebx(fHyASN5sjfJRwE%lR)0x^z@Q6~`isv!)*({&bp37H zNDB#>%3qNE#?oixn*-Wdzw~1@nK@9?O_UwOqp5AFnZlp;ik;Rqt`q_54}vu{OR$V3 z#TUz*`lQYFjmeynqutxbRwNB$iky!hjs2(%XuCmv)Wp_pm>>6BDA(cDf=LMd9^t0&P5$)D4z^p zHw!%E9nHU>8qQEIAg7S-hVlY7R?A6xzrt4nVsIsLBtGgiL*c;?%YHy%t?yvaPS}yN zWH4z-@>|gXh{kyg@TGkOc7b@?jQhBQ1|sQL|5rqv6ltb*FZ17NJ-%i;bdcPV$3wz& z!?K4G&A_eRW2@hhtzHE`PUVTt)m@mU4d=9EH^GXV`UYo(-Shmsp)gy4na`@#iU_m7 zgP%F2gAEw7PgLs@+gr!?SYVqoHGeJ2+wst3rQ?wc~uu8c21dp;y1G+ zQ3^$GG^zngU_W%At({9>#Rc&0p{NurhH$GL7fQ1@Z=G6y1;DteY#j3KVfO}?_vNK{ zB~IN+fnZQ-EOnw5>;&($SeRnA+$;47-rN*Sog4kRb?1Fnht4;*052LK-|Fy;(~L1L$omlO97)QldF75+R zQB~O|@X3)TIMC;-J$!p{jH0fNaUvt58jf&a7e^6y7Q2UoRj^jidjAaK9VY#h3g4i@ zmwyiTP4-aVKmeF|Xu=9FwvjX^vWtq|7_^d>1lqvDCVVwtILyg5CpNMJ6e-vxC~VlD z{%gfz!*N&^F*St$rt4`5#_`c-+NWbft4vdZt^lv>0L->8^?ru6<8tdb*88LJMdx5v zx9a_9pq;}eBdbdwmhJ;09!ce>>^>ZXc5*o7RLqrk#xqO{EzGsGj;XE!P(wQ59t|hh z@NvAc5CV^hv$KRz3mnHz;e*~AI6Bv~o;w+^0Gp;>lva9?4ie2h`;u61nDMYenwlVD zpSyCd+s=`x13yz!DU9oEIIK6#R>!gK&JcjLehtEA*hyd^1IHQ`ni|{KK!6uv_;eC# z=&b8PkzTb0olXz}9b2yQM?_KGYbUrjZGee@x+bU#<~an?E6TcH5~^TStV}CzNw}LA z^~v2(%vL-8C*mKew{Ytqzcr(8PFdf@`w=4h>Ns%BRc*9}u9R0`qrlo6`gX3(;d^mj zJ$bF9=noV4GCvH@n4%tq0f1xrPaBgh0pxVOF|4@9Lc;m-ZQ9t zXY9a_Un$s}fL?~VLaIv;u~7+7*hB>83q9QD$HqSb#1o4I)`mHoNPDW)8!0i=2{UhW z|LFLD3z@3)6|L^M)*LPCZ^3=Z=436Bg}fowW9nk@0wNgw9tT9HdCP#{r%55X|tAzEim8BB}R!?18$SRC^|djKE#roquPX zl*Cbk3geALJS_QO?&);?Q-N*?W)ez11jD}t2Ms3F!;Ma~1&b|7EVMKy`rKFy;=YLR zM^Rq3)6v;~q-F1iqgxY^@RoG>UIez)i0K}SEO8W~Iy+$idF(}bOh$D;yj6&&qIHZ> zJI^^rtC8LqqPZ&zht?Fc(mqU4df_tH11ICm8kJg{WC}vL3bzHP@~9bNP)y)#0i?{2 zHhk=oq+>Ww%QvbAk(8rVeiJfduh$0j7C0n53E>;dUzHTsC+SisQURc+>}2+Fk!kuq z$h6mQnyxAc{i-em(pZ|C@;F1+D}PPF9v^QCTTe>X21bdTTviShSnM^plbJexz31Hd zekAgkP36Uvyj&B{3+vDSLSA4L5_#D!o)>ixp?_XfI9Zi&r|4{;&N|kYk-%dI%?Hks zc1!Rxlw{PZiL|W$g-nzr6QfL_2MH}1X-tZ3(&JPb+Y74Z1~muOW`wGQMVF@(+yk&< zwy}g{A1V(htl3Z$#kPXhut{1gW@R&#%58X4=R_XPHiV%0#YJ8jcf2 zamO^w+O*)z(rjA&lwl|QJSz3!No3>%%BHvs_FEguw}==VnIpQVBEd$V!BvtB?v<9C zaZ?$u2ZCF+FlVDbn1)C9=>C!$9?4x6+lQDrYI9f$4l zx--^YaYH9x+!`Xvn5QsLBIf-D=EaO>`SAxZjcNSYJ=S4j*0H6%4g0FNz%2VdM);6Nn8gXuqoJRUZ9+`@>q ze>;ief14!X-%677ZzK7C#JvZc9aa7RJ(-z%wsUV`2U{Y z|9Q;owfUTL?)UpSWlpa(_YojPP~5cF-qONN_)mfR;R5$(Pz>GuK;-TLV)t2~;_d|$ z{`#Zhk?jF1jO#EK+Sy_NRbffW=4u7 zdw#W%?sYi7UEusCdZGIspj-KX*nJzQxbFZ8_jkdX`v#DrATKsIFRV!I^g{O!AaZ{PYVNN<%1 z@?w#BfhG5%Q4ZgXA3rbn(Tif}YCzDsC!JbCZD-L2++w+*sPU&xHG#0{1i& zL$?kPx#>XcW&jm86R5dCAVpBzi;Wvg8~0goKU?5l55>^U1tPaT5W5Y4ikkz}+`2%D zpt!d&ZY(X_r2AXo{#}7vmxjarIzZRI1F_o}sJQun(tQC~a~lCE3i4xH^8-tZAJiXb zftuR`NRbfd4#tTk z*{YS(!TER3IRfW_=!NbOAaVx*u{#*3xdVU{332XdoLG{ro1B^_3eJJ^pPtj|Ij0QAj{G_1Izz?xeDq$tX(oy;pNE#D5m&c(0)6#P0B#n7D&M6M3R zZY5B0rvdV7)Ue{lz?wS+NKuquJDXov3Vubw74qvm`IXJl52xxJCht_IsW}+dC|Osv zERlZC@bT4-`eLO@{fTiJsMs`oM|~SP*wn&yV|o#VnFSO15h9Q2zaV${F)ojri=Sw( z{{&02i*a{xG3y8yQfpT}=VB^aQ8=Hlh0);bx9c=cOTU}JrybO&CQGHSnJ;-Leujbl zt7o65h#hJFYhByB4z#*X$YqBn9oaLrPxl?5I6?e@}J&aqq|Js zcVcgM9)trG1pNw8cCgl4`t9aM9YYviF6MK^%$fbY#XPGJvp${AZ!r6t4tjFt7Zo4< zT445;{)8jTCyKhWkAwJujlsq^*?PEONL?46u*-U8=j<75k~7P*S+FdAhv6#d!y zJf(;0oqe34U)kxVCqy-t^OhP}y&G*`MBTn*R-- zRXVc_(v@Y4Ow8wtj$~K+uo}FxUESIf+SIpFHiAu=$w{`QY@bU;58e4dD8VQZA;Dsv^&Bw``k>xO3rf4 z)v<R^GWg>Lxp|B-S=nA1*cqirR(13rwm8602e z>ym-CX)ev_Xp-wuEhp$&sdq_Ib>QVKbs!Z2cSU)b;nVV}WBRc}lavSy$fK!~qo#9S zJK?IyE*p$n;i{AurWkN*)+=Myp-=z)vn8n?TA=)D6!BoS<09grvGK?s6jX(Eq9Sxf zdvH5D`l=&OOF}d18Z71^(xw2GO0q2^wyCe9uHxTqGfaMiN7csMVeEgfL3ClvO^7w- zuG)I0vMa!eHdUeo*?MUyzO3PV zM0w%u#5W#0Q=g#Q?_1D zCW+4@9U~h_B7d5VDduYZ83m)Sb4q8jKn88J0ayr%KY7I@#k@ZgK>sYg>Z(>WL6c)QC`o*r^iGH<9 zXiKIi;a`XL3g~RH?b+OR+|1?UddP@s0>$|8u=$R4~ z(p0MiO4I7v(zMymSSC;%P#O8Sd}>M4Lc;UCZT{>M33WEolpMU4H0>;>X=PZ4O*Fgd zL)nsm6(v^ZYb92;G^p!$nu%3WVsSJ&TTA;yF#YR6BaI$a8ok5HcrlYSC-Hq%e!I5g zs4Ay`R2y-kknjIW0h;N*p5>fsGnVx|CeuM>`)|Q@Y-hFm;@?gDW1KQm2a`(BZ@JSe zV%OAv$Mz~6(!M59rqgAC-a2?q{g0UJ`%NvC!@0rKzG{5NbBZ`kxz;ajapgp1oxwq$ zTf3B5yE^L6i6d)Ft|YHkl~q-Kw0|eds?ClYWo830*p_D7(a|Z(!wRf+uOvR5o;pv7 z9Sm)be-EZj&dbN6!B^hr%SYZ{d#AqrSk?E}Y~JTux@Muf9*Ep^K+SysNcl2fH zE`xi5=eDupr%(*tXMxCl8i?IpK*ik+X#DmW!-~5HthqaZ6h-;9m-&UIFn$Z|UAxQi zYf{0lub>#ZZvdJn1T;?wRNTXW{Q8<<#eE&r^dXRDqn#8VA(e ze{f6@6!(6{jU`#y$P1M~_YMT_5_dMfR#lm`ZER0!R@SPvDjnLKv{yD7@Iz}=6W#VQ zTCz;ig<6}c%r-O4RELEAqL(l3Udwhcu_mq&cku3F7>caTFle0L(a|&VF)B?z3dslf zzDGJVykL4hIvJY3U}D3(wY}hF?adU`x38y*v4f3ojuux#Yy)*n6!1mwR+40{$&-5c zfZlUsph;(_M>W%qrmtOvs-~>VrI%l9fFf(b1KsFL73D>eYpD!XbvD?n$Iz=t{a9XB z^}|}zs%PZhMu_@X56x3J)u&i=o*Y}ksfw||Ozqg+JHdx@IPLG7IBaL-uOkQ=hc^Vd z?yk~1sb_duRjy6{gWic68EcR)Qo59io<`^M?=MDgc!OZ{O{!$GB)sBzRnN(G^gr3^ zZrc$3t{6WyX3p;_^6?Cxk8NG0m%JLfsXiZ10W{a@Gw@^}MM4>Pf6KsF^2zqR&b=DW zSq09S=!I?;5V>`LnwtTn{3Nmij0{Ug#@OXnh3`G&L*?t)v)LlnHlagzM5FoxrLHx> zv;APm|F3)amp3*K6bezHSY$(~OnV!zmkp%Y5}3v?w1d7tU7 zHRc=MOZ?Z(>IUWrhKXwE<^z%27^t~w|G^f2EXh)vBVeD>9*Y0_h`%oS$j;Vj zH=&OCuUQ!RCRxULEn8=@J-VaUDHlZc)jR#hy#CU?*6Yj)=FyL&ylbCz@LWayM58Y* z3|H3wq8u~7CmPk8OvYXWLsu{$5AFOGasBpG3)m@oy3tA9mDlBM91`?l+pVPyHisucrrr%pix` zatAXg&-nAq*C@@xRUg%lh4Vg#`tv@x>b%b($|K#?(mCj|o}Kr3CA~wu54NLUS8CMf zD32;;c^E!mVYt0D49k2Na8(!%U0WE+dKQLP(o+)LAudZ3Gbm7yHv+Yh1xjM%3llSg z(w)5eKH;_GueiRyzOH2|ot_}qXk*1r+HRCQppT$It(vFJiW_gT9=jiw9@(q?ly*+R z@0XA2?^L$2Hz@6_j`Y>UCWWqPi~8Xubv4uVd-?X-s}TpMDU8Yns<&2=J^jfk-LJ@- zR*O}coin0xZa2wqCBsYA1&Z<5+vWe9^Y|rMrbJGb>px#62CPg3!+IvlpHC~4l-!HL znUm1=-r3nLpDyxsxn6uL21a}8*Oe+n*=a31=R>a|&@Cd3gIWmKVJ|(i97-Fhx{6=giCFH?r#NGf_dDFNu1W$}e@Rd|zCpGYj(%%6j#o_(vhk9!U7 z<>FS3+P9da*7ajRpQDaYmWb+4apvtxeabvrJtl|j1dZjeJb24}@Ln-|C%-ulUugFo z9b@53y8XGFwj|I8-AIW@I&{`oD6HmZZ&LO?KY@o}{q>Twcl{pnn)Sm-z_uV|Y1SJo zJ24Ma6eu#m^?YY-L0m;}iuWjFboXk)q`T!DvM$cC8?&@gT6t}6WuAC=kw0Fb8LeyT zPm_E*EBV6YE)}O_wmy|jrE1y*f#gA}V71p?eIZR+>EZe%Hby{AXc5zqhs#qk@Sw9s^-G1d%14j=I38P72#`8vg{wg7x6()NT==HSo zRil<+c9sp)zei;D!RqVO#R~fk`j%s_Q$?hg>D(gKLhAKxEeNCPD#JwQZL2H3Z*i!; zRNaI+Yd?J+Dvpfz2k`FK%KJfhH_dn#d){p_Uc(aaX7KJ0@BR(mN8!~SLwR_&Rd{cN zck_&QThF^)#%t(#2b&?@0_Fo?*4;i?h<^mLW~7F#-iG%kco$~8+k4&}GG4G`vknpio7?&yC~z`+4C;R zcnv-8^kzD24e!D5E^qKY3Ga#`?=A2y&Ukn6yh}4)!#3V+;5`IhjkmJ!u7UTkBJYRc z-8SRh)${I_@fx=AZU^t7@E)G=#>tMd)_*2)D|-v{-EM_<`;2#Ycq?uXuR+$F7Y|H|clQIdOStK6Tw-1YTm zN^+OA%KbZ+`*lg~-K}z3rXzeGtpBDYcSWn*f4tlc_1~4`R=3K%l*|3TBzJYIoPXvj zzOk+g8>@bks(pyRVC8kcivKV#VAnUHU%83!Y~OZST371t5vl5TsuLZ&_RaH=`XHL5 z_8+0KUwKhUSNFTTqH?v89Mwi*VetD0KSKW4(eg*KOnJcVMIH&={y^mR24c4lP;vVL znj6{=thqgb6a|gcR;XX*Ey)V;_;`9hZo`iy1wRf(F?1_{$Q=U2?ogoOmI3l(IaqTC z0VxXdagz?noeZM*$UgG$22Y0c-AXAVoob9A% zm4`opAIrQSHb-+gilJK#MD7Y8c2@#5cNvf(A=0Cb6iacA2F_2ydAR4a`R4bdr~R}* zyq;ylJUvE-AY^t0f+6V78i=j$nBH=`H2TLI0F1DYQPG%*gONQm=T zJtlL~RZ z8#T?b1Cjd-5W9PTn!5`~kr3taMv0{y=eyuMrNH?)^g{O_5V_9-vHJp0a}NM165@P= zabhWQ66d?&+)Xnbn%O#rIPWgAIQIY|wYbN-V|jX?7*J2hIcaLms|^&wP0Oefw!j<}Oa2DzHQ_?wfPXm$r z8BlX;fRvxa^(N!OlAPU=UiZOuzUNv6*RN3v-EV=&JqyI{H$ct(3P_O<<;g~gC2>Zn z_Rr_x`{BI6bDjg|AJNl3VIXpU0&4CLK*~=dJH^PbB@@l_fH^l z{{Uk5B2aUG15zYJd8$!jN#52PzR$sVspqscvX{{d-MCEzky9HE*-J*oPa>-u8J5Bt z8Fj$t;acsvE+%{(Xos%bb9Dl->++OUAVoryD~%FMa!G6Wz5wS{p7R}WPC_qqy+Gt9 z12s1hNcl-*rx_WRwpL0dcWto46XsxLN^_V+#nFUX+X{O11S=s95qTT$rY{P z`y!mzdd@5196~R2>jIIR4b)p%=PMfyiwF)Z79flU~UMNNG~Aact9bqWF1 zq(F*1cOj4>AXe5-L{DRX`w&L0&xKY*V0VgQl57Kq(-K+RnPq)3SK zZN`bE%=rU2A1`p;gkI=w0V4MyAa*wcHFqPBA|cKTj1xSq|IiG;@ z`2yz?=xP585V@ZKvC|EMNrh28#R`k+Uk3_pMv|J z1@7lj4BcOW$o(0J-Cux;djY7qKLII%;=aPTv9xe=E@}Ha#@{+8gCG9@QWWIJmF5Q)?}yf(?$)w~EkK%q`K*fFeJ*c<(Z0#e7pKGe9lA@h zzPFlCyQ1=AO`8_vKP?*!413^j4k+QK-Ame&?`hPSk~ z@H2SBj5qeYm5kT0#2dj|T3gr!-qPB_)9}U_ul5cS-j0md(DSmkkcGGcb7^g1SD0JY z7Jd$IHRJ8{yj>ZuVHDO|cw5#Mo`H8l#yipTYCEFk2g5er9(YS@3;V*` zvbOLmcqeAOlRa;5#%tKdI|<&ktu5>?^2XZ2ui>4X@oFz4RY{-m#(BhhAu6pcPzz*h z3szuS*A@=I2U}b4a<;b6lxwUl98{9CwS}f!V{PG(lANtAH02s=3(HD!wzkleYpgA- zD9PE{LQ}4>ws2TU&ej&1a*efxBT90%w$PMotSuacoLzunYYWF=EvzjZk6ra|X>GyM zu(7s4b<)1JfM;u4TQJ?`+CsZ>ac!YNVqx&}{?C#>rda;)YYWB^W*pUv2MYSolp$ju0Z5=24c4asJLAK z`LPtNxgCKN1^J;nj5Ykk(&on>@MD95AA6!0y8Qs1a|U$I8K}5@0Qs>msAJDSih}&m zearF#ON$?joBxO(8+ku$ZQ)Q9H6H z&X@v`I~R!Ec|grMAVory*BT|3a-3g)bGriPMd)d+0MJ|kpt%A-a|J+(ggCD=PAo-E z))xK>=V6*d&*$zBXNo;^M*vzs1ZwUmAmt~KU2kMqN^1*$gX?Iy=W7ecpr*A*Aach6 zu{$2n!XS_$Axd56tZ#y)7(Uh({to8}`XLYB8_^5hiGXfZ2U6U`@?r4>;Z= z=R8~|qZPVS0Ob`xtB63#PomPz#0n6WEI|3({fltz?Z1JoEqsJ@4&6tA$lV6i+^s;$ zPvX+`#^SV)rGW=Dq-=NQm+l zqr_5PTlf#0hkH(2TlgA!I%@(%?(0C!Jq)D$Br@G^rS!v6T3dJtu46oxtu1^Hwa{sr z3a;-1vHJl~bKeD0Bt&_uQDP~tExZip@t)Jx7JiIg=$-%~_c%~)+In4!$5(!aiFR&=Fl-Cxqkzc02-Mu)fs~&_rd_`x!%|vXh~YZhbJ^O0#*A=j+yL~a^Ta|1xi zPa@NXT9IKXtu1uI^$yQvYYVecQy&qCoO&ySZ#|&qhJX|aQEEG=D6y2+7P{cP%yZh> zLV{lChJnbb=K$wCpyoCNQY6HwO`+n%k}m*Ir!pVZ4d=TGoSUMjJ|Gae&4Adcv8P|N z1yFOF04ai^*3Mp0W67x-YYXGyzS?tJ-(zbOL$@suIknJmZv)iaA|ORVq&fv4QY^(b zi9XT_wV@ERxg$j@&Am+RaDS)3t+a;wVIXo}24eRWpyHHfHvax9SaV+lQWWIJ!{!GT@5gpJ^~Rcl_8)6b zDwub6nB0sZ2<---y-0&y_KZuBhD_!50iVv>o2I+o?HJ;Nqz@@hwgr@`bWQmHAm`sfW{B? zDWb|Rv*+mKrr!7UVhVTWjIYK!%D*D8EZTIGNXm9!;XJs zhk17`1bKcj$n*0c`?J99;r8y9;>9z;C*M4e{pkR~!( zr|{gF9+7TxV=Hh^@Z6-O$?$4g@{qRVTk{V=>m^shUE+cxnbY zs2%eTnPI>_i~rVPu&&~_9`#$eiWIGnDs6r4sE^55KVAQsCz50CpL-J4H+jz!uF@QY zKSWwh-pK)~FnL7Tta;N5_il6Cm|ReuT0cXCtOw{t-)jAr+?ESLp*Xc%)P8`9lP~Xn z3Bkhfn8L6@F$@Ei_xwrEMYri!1>$}MB0G%twenfOQStzq-c<+8CTGI+FUeWw#D@K4M)9y-J@x63J1E&( z9qct5&RyzQYA}a5nrL@km{yU;{lQjFT#|J4FUuDl25kEd*#lo*#ZGtzYbGn-7aU%i z{z?gdU^C(EthsL!rUzT@7feDu*h0&LddZc>U64V!wX~fG4dgQE-$L=8oHPG`F zSq;F!Zr1fzies*Q%V;26WwNUfO-@wFZe}8V173jGRo5eJa)zF)Ia$9JYHR9rUUS&6 zqyA>)F9pIX@W~zZGqGNiJ^0`s1hQ&3pJ&`qevheU<&Hudw?3;HMs@CQ0nPIOn&$yh zep2oF4Xa(TWIdOhOK%4Cj;TIwaQzvz(7gae?k_;iJrAV(B(8577nTy&MsWSC!1XuO zbRRLG`-lPEM+~I=B(8567nTASbG!54`i1ARd(8idTIl`-)ZB|eiknEjZ6sLyRp7)8 z4t=@aG1b1r%{ZdXjUxtXE(B8C#PJ>Dz|zXGF&s+KM*56LD|8cpn(GEq+{E!+!ocE`Z~Yp2PYv189YACZN5@fc7E-6*nDF zJ39l^)?^?>K^}bHJiwB7Ym}$`-t*VthrTOuH9zK{7`hFC$jt?6ZUZ3YC$as&*sx@5 za4l7MH-Sr^y1}K&6Rrh-?zI47Hy_aT7C?%GC?7FOES|DE%Ip2li+5A;syd*R)*G2O z%SAR?an*_oWTeJc!OLFgJ4rRd*lD_Op=ac6CP{_k-*y_-`)DRTU#H!1){7asyTZC! zJi_q>>Ooy8)3|Jf>qGQDq_6w*_{Sf3A!_(_R1VfzFp`X0bxF~hH!xY}i8g7Kg0q>$ zC0s=VYY$w7t7tXtm8)q^Ly;vUThaS4tLVY)zQ0_ zPOfcmvNw_xu1;-hc#sE;xS();6c2ZVasB&BTk8mys>7ZRyYogPlS{|(UFna|{k5bo zbblqli;NZOOuG-U^|yUdwsDKzVYGYBCKQJ;I?HLy)v3t}Rmsg{v^#+8!a82iD6}%W z789h=Th0<>iX}*PRgzANb`SS>OMB8(H=bVgF9-FFpE8~^z}@wGl{ktA&w=Sip+y(y z1GRMFhq|(dcKiTpALVH68%u7It}a3Jj(j8S8XFy{@b2;SeB^P{oEe$iOfN^!Z<@1C zCO4}QOol1`HRNn$I6TS!mh8|RWX;ua@Z?AOa`SkHZk|$T3-Zm_Wx5EUd#Vaiv6)YP zAi?I>RYuq{FFJ*8j_yTOpF|(pRQ-hx9d#AzVKV7c4=X8jQ3}~QiU;bCiZc6H)>4Ym z7rk;mUzY*b<=jtD_3>Uu@vi$b@WboBayZ1JTZ>gh^bGe`qP_uHtfjW zR(*`X(jPDEIlTRUzvu8K-L#{|ULD=+`Rk$M#?DgT#A&Ri8*>!&Zl{h#icJ~!gO67emZ=R^ z)y$c1FQHaVeq`yQyCQhk%J&VnRGN#Y$ioF(Q1Pr-DNfN z*)OsG#XozdUzEYJUn>5WMw6#95(hK#FxWBlpQ`W}zn*Yos-_vHOmr^BkFwnDRuC5F%G+_BFkAGFAkiYWS-?K(HSo=C@T(I+!VD4NSBgMg< z3dbVC(XXp>RAF`uEE^xj$xYT+Zfwu9_Xo3IP^t0rg1X6Wn%xcaLmkU+*0{+DQphVm zzVSxl-CDfiD$T7G@2(ox8H5wU6j$9F^<(9mw!5p!dUkKrE9o7g+66MJGWEo#Mhm`v z41-M+1{?o{$#3-GEib9Y?F~k^>Wx;8Zt_C7a!j)j-DijOXQ@@gq=P2P%E9cCZuVWI zuKtCw*>`Eov1IcnmY>z4&C|o1nn3xGQpKv(d7JrKuI{XKFt&_s&-gE_4sC`{AHK_9 zk))e@8hKWo^eh0%?v3B|G}xaN{A};y{}sNymD!AM`sm?Gqj_%#laG=nYJQWySQ_;w ze+9Y2OanSUb7KZMXmI8o%wYF3Ii=%b^4B@{sl4@De^)n|4IddaC!;6y>lz>HLw8OY zSARfqJ%Qd#Zpqa>qc2Vg$j>`+k*=P3r1z+K?J1Sy93|=KB?_&TvE&N7tSC(WtYF#| zKvy%S@OghI=-VuRH#iRNY<^>etvz0JgBx9e++-J$>H4Aiex@B*iyW*n~K|GM@fNOmAg#>gjQq1;yMyArj6OZ!aI zQj5H{!G_5T^059Qp;R7>0^N#3x~Q$Sh%29J08#&!#lnJJ94s_GW^)|S;+IXXWPYs} zy+uju{j);~$(4#(OU6(ot8n)xp_Lxx0}YOSJ}`qEG}84BW}yC?rW$1%@IV8m z*;}iNxQsKHI)O>9bM|#Zujh297=QyNP*131Nx zf4cl-QrnT?s-$l=d#c;3G%)R~SNPVNy4kY0prJrhuidC0vb^}RGN3P4SIAL0(rVZ+ zf1LSMi&s+SMDdgPO2dCQl`NkRBcBfoQEJKCHe*{TN8=QcdMB|dmm|WS zm80x>HKqbXSJP*MF{TI5`@c zdD-*&THV$Dq1~>n4h)T5TOAxa_1fyR{%fn#hX$^-F{pp(wK^kz3?a4!kmLw8IL)D$ z4V~=yhH>&X8(#U*cwr>WsM?-kc#<#V$6)>z%*`}j^#kWZj$wsQx93+!J|^)ly9jm0 zYR0qlg9n!HqLQPYx{8nfbl@i#9#!wUJW%ra{Y~WelayKXM#C|$D0Ol{YMWP-I;9}h zpT#1f+VBq&%Lm;6Ouy9cHQHX^VC-ez$F+IYUFpthpADe%;DFA91G+E@(6MkJMNmE7 z$F0YU#ZTU?7=7I8N%B*np2WZXlnVR{X9t~HeA3hm_nN9h&We)y-*L8(rA~Bt$;gEK z;%|+(_~oNy!1AjqR#fIS*J{ivXHES1`qm6`(A=GOFoPU4^X47QAO}KahuX}bw!0GC zqD->`c{P7*UZo+MY-_A6j~_Xotko<4bBpsQOjg(eX_S1pv^=_ssO2jK^~s8mpBAf6 zkq4@Rbk>^4EXa%pY+SOZ~Qn8MRDsWx*oV+wnH*e~wj9!N-`c{bchQ(+% zrj2?#+v4rNxPI6{bmP}7?W1CAMj%{8hL{~Z{a4=qv{#|Dj)I$RuC%;jmgDs})TL^N z$CjuP$*%Ct`Zz}g|2cfzQrZae-a1Ny9r=c1Z&SRr+u4%3xproYC!?bsQ`E-WPoaGP zpM!aHe%?-+230p*IdhUyNL9YdP|KR7Na zyoM#-3cRJWkDI|;I{UZ;-fG7Cde3`U#%t(#Is2G}xC7?W*~cwlZaMq73%s2f@8O>J zh>X{;jkgQl(%Hu?;cYqlxD;Nk*jPFo>3NUJcn#Zl$HQAX`#1vcGE$g+&9+M4UE$S& zkntYvd5_6>4LvVsAG37mf%jl#?!vu_Tf^IO_Hj3OCuY3IdfwwQUc)xtN${4=K5hf= zVa4$74zE_7EWF2i-Zx~thHboBk6QcL$L&OJeI)Kx+yh=MY8med@K)R#jW^CC-Um_X z>?7qrJNsw_ruFRO_V{3DAHAHNeQe78OLdyvzqn&b&dxqI<^JU5uCMQ0lC!gqO*vKQ z@LgZur6gx(ADeP&K>WRmyO!ka>|;|-`-PCZp}u=b&dxqIS1z7?Y>-$O z{MpAn$sbcKfB3VHCy_@&R|g{ZCLnev0~L1)pf$`>!J0b}NKsHf>j~>;VQD#|#yaU< z_%TrMV+_U6odrbhbRc$T02TLUKz^JF*4!wNq98whVt!z0^J8!P&>E}qxsOMRqRwvt zdSe^V8{0s|oeRj1^FTeh4WuZ@k0;F!ENy=5gCFY@{J0QB?SBO#cM%Y~i-C%JJ0L$U z0c-98AVoobJY{}hY4c-W{Fq(v<8l=B1~;Jnuz>c%0u{F!kRR^?wLKO{QIH>N%nvMW ze(Z-I>lgfZFN(T55YSuPfZpN;^cFWDKRy8JEp8x1L4N$y{J_%Y$Nu;+x8TPIQPjOI zK;&)&Vs{fzaUTNY$IW2P-2kL0$d8|yA6Q!aSgL$=0Dfpuns07v<9DDKx=#SQTM&rd z#{pe22&71e^l2l-k}tT^2ZQrKI5+W}Hr}`gJ)Oq_bSDd-J6QnT$pWNEi1X*hi6z@M zVPhCL4}x={=d`nrUqUZ*4*}YT3TPiHppB$`}iNyIdm@rdOsY{!{I>6PvZKWabYQ)eLNhlgFKg=eXML@ zT%ADVs(^0U0BSA0QY1wA2cyJNKKpnSoa&QOzu4KwbXp zK+VkrQhpNIAB_x4>FndtaH)d`mz{l_gIeekK>K)r*lh@CI}eZ|A<91)C6@Bp$7A4B zpAJqt`#2vxy(tbvZUInp8v`jniR^hJ!%{l?cr08edoDZsxDd6_jR29`5{TVaK+SCd zq)3QTOB*`VgQa}-@i;iuksy3mQXaNNFLc`jk=qWaxov=ypG5W-Bg0ZU`*=KD>M6iw zXCHS#Ep)p9ky{GHZdah@mH;UdqI|(9v6Rm~z5&iNJ*S<0+#5aJtqMeLA3*oC0x3U< z?5{?KrF8c31h`VqWoI7`MlE#90Nou8=Z=fEJNtMz zdZ9ZK&^aqW2dsdUpG5X|Bg0ZU`*V&{$XCIG8Ep%@LBKHO$b|(NecN~x+AII)yDPlHpvyhb>0Mo)K71G;+} z(B0F3?w$rxB*dw?F4aF+%ABKcs&Cogyd6E=Jq<+e4j^_P18VN0K#GJo#~CMZ-5jDadsOgmNI7wr^Y3XxId4c_M-#3{}0gpe}FFj15zZ!Io>$2lsO%o z8uBza|AC(Nk^{PT0Epc`0bM@;q)3Q!f^lLgbDjg|!v)Tl(bJor3kA9d8;IRFK-Xa# zClcc9F-|N+PU`z};nbL^5zZ>=x_`iPc6iQCpyIlKnyUaQf});i)L3$AtMB1H5AJUl zxF?~g`v?Htiw(rC7pS-?fNseKQUt|4$+)q!a5Lv}KHT3ca1WrUz3G7VrUTlW4rp&W zpz-$%PQyC!M|)tOfxfaIJBSB>`8tSOOqVAQF9SmmSAt96m)4O z*0J|#z~VH6!1<@p_BZ{n_;d+piB{Pt z0_h#}K+(948D9X0Km=L_zS+$M2wtYMXqNKI@JD5MH1#z0!IkfgeBesHCD% zr{$#j(^{Y6LCTABi#GL7=v;KGB!XzVUrrx4x|)@zRhHhX_?EV|mAztV3{f=Pq35qy zeYbOl>_#F3b=7ZBqSimC|7<7bjTrPEW?a8Xrn%bv@gaV{8E5S>O|Dmb#;@5*Z|ZjH zw^?M%C$+TSDFtuQsoDIbtHouF_EJRktCVE^43n13!{GX0-7f?^L?H~W4z~K1H>>0Y z%N`G=%+=iSKH6FKQKg07m|uUt^lhKEb`1m!uAmt}<^%)nILYbnE z{dTxCqt$357Ne&7>VU{?1L%S}pysv)QY1t<)hMy#l`C>s8RS5{W)5bM0~MS(m_ZJj-}eq?kb_m- zqoen%t<)yABCQ<&{#>mVJ!a@!%NrH1cPL&#b{H|9Hek=(Q@T1-a}FdcwJoOGKVaCA z<*w?4H4A%MPG1yO^Lz45P`2B!%P+N`q>U;Q)&!mN{QL5~LGOBbo*EZyvT3l;=c!8Y zM}_B|geM+5Q~N2ki#dCxSBublDop*h$2i+EtI9!pf!QQwyLGy>8KFAzaWND(R{3nd zq`AdqM2r8y*e_KH%o+W?QmQicE2`CB>%U;m=*x1c)}N8zV>eWr&b@unO0^?J$#rom zD(h{+0skbgg|D=s%M{AO>S4^lb1ry7!j^ZiTkStF0SvQkp7PYr>DRM zs`j+21+KZ#iQ|_#UP;J2^~9?G=ynQ={f0}mOXV`cRos=|Y^X#qL6M2nc#fDvs=gLR+86s4{R~9UA5VXnl*t^Sv$#9c}`Z8^tIp7KhEBZrW}4nE|>c> zPCj1l2Xs^?jOfIT{!Q(P2M4Wyvc)&jYn>MJ`g00YWgt0CWmUT=dsL7}g zoyEy_#CO@}o3LhQ71Hh1(iT3`L|>fM_F8!^M%90ntX1~0ER^x#V8+tC{hbvY|F&Rz z$~bX7T@ktBmEsy}O;x)Fteo&si&2}a;BBKGMsvqhYh}|OIA8q~!)9qeBbc#eu#K;C z{F>{P3eVWj3w8Vc)Zd{y1c=-LK6ax7<&HTjD=I6Wc^Vx!* zr=qC4k$}k6f!M7CD(*BuevTUIjX1-qI~}aKQ-Bl#`8nPE#M0s??fAR#^LO6QCCX|p zMKN^e09yA2w89Id{3Ny+#)c(XDvjn|!>i!>LxJle)HJsTXl@VC+#aC0JwS7NK#HK4 zXBsn>jG485KW}(7+|L)duR>9G5&?RT1JHXMK*hZm(6bysilDgHF>WlLd-~|{D*HA@ zpt!zA{C=-}_lV!Zt4-Mh#Z9KFI=ecOS)%C~KC7et32o7fvwE}7HtGA9dy^rPIAmhn zzv+yEdtY@*HMvps%*6QQmqLz4s++j+P*#U7P@Os{W|NbzhsJKBJ{_K1$xfpT=t$Rz zFTeaURg$F%VSevg!u-}(3-ibIx&F&xe&1Tce8H=Q`MUppI=_D{VZP|q!kql~!+gzJ z!u7Kh`rpu(bK{LHy8qK4Vi$t1qJ%x~~9{dkBc#SAmLq7?2-d18eR}K#GF=Sl|4> z(&opF_z`T;^y9lIhVFZS?)3$9uP;z>j{x%HQLyH|1EeU(j}6QZENy<=gdb7CkH=Be zJ->ja6amfB0h*-)oSqqm44lNfHHL->{H{CL$yP3+HPe*R|V2mhs<_Qh}(M0-Uv%{|+W zA2{vxXwGUUA617(yKzR(+bCF>+%8MgSJU{2Q$b)n;g7@8RVdi3f{pCa?myd?~oaincSczc$ zBpEP4QT!{XFoPWaojaI84*$s=%)pql` zXOiQ!_UnbrAO|hndIvKoA23E56e>@UA7&{Qy7))cQLLlx@qm42WL_tkTT~`9nK|?0 zx&6bPm!CK@zfo_JR~}3bwTy#$&_NiquIs%tL-!2av@Yx2%peCXs(J@AWZ~Lfcwc0G zZqyR4g<*n2|LURLHrMTEmBn+I19ooYA8s8Z7D{PDw;z=uX(4B6?c34_*L zy_aT~I5aqK%P`qWKMy8Ps$(;+djKh|qIxMa$U#e>-oXrV(E6o!FvG;5nT`GbS$gdx z&Ssh_yf_T5p3Py^72Y;&^|Cy|@H6 zv3i+qEvWQoR~H=PW%^rW239X4wY2o*!)gXOXbr$Sm_ZJjMe`13m^jp}Q~${_`7+eC zdeAsDFYhJHAQerjdj~VfK~sL-!3-0Jrp#L!Cda}tIr+Rk-O!ZfDw5_h^`(e#X)4fb zm_ZJjz3~oakb|aHyn`7g4)wx$Dx8x%XRmSMl5uKc#A}#A6q?)c4rY*prX;+B872;m zki*_0hUq?sNklUXUc?M?&>VqxFoPU4CEy**FmY%yb0$%+t1{26{(D~_#u=+;Ea(Xn zZ=7y7cj0wR$GL!7yv}I{uz8W+c}2ZbK6qc>|H5p4H0+SBxKdPlIYL0^@aqYZm-zni=6j zn&Y!@XCC{onaAFkdCbvVohieuz-w0T@$l?d{8d$)uNkZ!)i(!H z$MB=-n}vBDLp7Q4sD|O!X;#C`&Oe^a)6=GdywT?P_<4hU#F>swBqk4N7r_1Q?=V{d22R7q`L^Dp?dlkiL>E;SGKPpbU zQ=ej19l8&3#XL>%UQ1jReho}~_{|^(jUv2*8RVcYzjrVL?MK6T^L+3*r*}Z!}pYCkRKc74rY);k~^3|71k{xoW9!Qj4X3nWwTK( zX$Gmz%N@)hhvD483=@ZDQ=e>{JDNcb^K%C?D1P+Wmp0S>V=eJim4}0GM7u6OacH*H z#A>dl`d@}7ME#2SHR^gdvX*bFH*Kcf+9*`$CubBhTU%lalfUmJYnNU@Uky3G_?w>^ zzAKIk@;I8IdpZg6y4=kSa?rHD|2SqK%u%p)Gt6IVL|c7_>3QEld5#~NZ6Y>n6Z7Kv zKjLXNP4K8`D#l{dJb-4HI5d@LY?eEkK@OYe4ra*GZhhenzMu4M5jV?{k_-oxrM+}5 z5&a&8Hw+5jil3XGdukqWeJg&^r>4u%2?BD<3nSz3YVdEJ{yZBmfhBrn)wn!#2W)W;`4Q(H=3PglOmSG8V?>VBvOR#Q(i z7d^De@?BzuCe)vnn1g}rZ+KeQ;Nb%cqORdc_kWBZp3*ga#rWX~s&hN_mw#OH2p2K# z;L{drwXq7hDmyIwD!GKJfA#WNq;ICD&$KX47Bk3U%iO^Xa@Z<&FhloXJ_mle{JYJk z-LEVvL$CMU-of$1XNHM)Q>;}ck5fB@y?-^WVo%rX^Q7C1?*_7Mmi-NH5hlNt=ur3S z`5h)VthCBp29^!JUL&f8U2S4pQdmBxuf2m$3;gwIF(VIz*H>B?e`|V-*IapU%9<`o>)xu4UU;7`4-2_lYNt8=HAu*vW=?U`<7ML%`#AEe-Lk$ z8MQw+sLU*({lTpEXA{~V%*xD`O))DoH?nD=tyOFm=dm$^9Ja|F%piwta|bi1|MhPX zuH(xUWt8*ES)0!<&G2pHMOBx4kL1y3# zpndqUh(GG{V8=SI(r1tK<16*q7x@LJ1cGL_9h-IAd+mlD`esKf7eh3#JiEZ5zprC> zQ1^ZGcIZwo{m`px%~oHl%~u1LW82CADUq;{FN42ZYIZ{YEi|uz&UD zD)_hzWG(}%Um9oWKA_$z8neCR;OhDMF6d0lzl+9t1GZmIt-dEKhBX_e?3jNFGw9pw zlslL~4m;-#W{|^@+`$YyLV+P4ZTq&lFpln5n3{R1F^-OdZIm8a`-@Ct9NlOOXJ*wf zzxGeB(+5iKQpG%dd9mW#B@d1n6uzaogBj$oYwlnMIqa4@m_ZJ^=MH92xF`?oQ_RZ4 z%$7LJ(PRrjT0M=jfN||*!FZx#Jds^XJUvOX%|}daerr7U$irxc?saIa_sreQAcwtj z2Q&D19HVgT;Pc&vB5r<*eZm9>mFtg6Wb?(|I*?g6_Ev?;eqF~~r>&mN;Du%r-RY}` zPPAIUS99gQ2_lX7u9G+Qs@M1-?|pik%1-gC?wv=(49dX^rO`|wY)T>0V4qyl406~v zcQAt-_RAg2Acy^P2Q%pIy(l?@%(bmpxz}l2FiCNIpXLR_WE;70yzwM;z47jVT-OY8 zI52lG!x5033E57N>2Aa&Mk>CXSNB|scgKu(Kgq&-P)=h8IUJljn8EbJV5V?_|CYOn zzy~jRT6=?R-;G^R$+$u@?fh@C%fD4KvjMp z`9&-BdhJKE()B%M)f{7eM=iyxPl2pq6{7hRX6X`~>~DX`$*GK2i-RA+FM>=)~A9DvJ#`j1cT?vSuhY}plj-zJXRl1>Lj|3K znmVU@or%2@b)`2+KUF$=c%9+VJYWYl6~?^6q~1xH!YnBqlqu|(E9}}-IKeAS?wy<| zsQDN=BvWXsEAj@XnDK)(Q~I>~yw`6_x6-m^ud0=3<}#-APT6>huXA>86sO_gTp;Z0 z>+RdPuR6yR`lj|y9a!$OWHr&8qIU7I!M9ld9Hx?Ttp27b$+G%qS1N^hhlGh4g7BOj zLN+Cst7@e~^IFLa^fmU9?w!6)N)DrTXswd8^SV?enM+HRWG>64>;3WfbuzyHl+{Pc z*E<`uN(R*|I(nq3PaQFO-Pkgz&8gNurJAK~p_Jv*Sgb0UlT}oSCPw{$6Mfu1oyF~#_PAZu7B_QgiJQ3`LEOxzVBQm9g0+6DA~pKgg`wZQUDr_u zb^NHiv)^yi@5xr+M;etE{mjg zuj(YQ{HJRmY|C@meW~=%(4Pikrt_@ibQO&qk9$GTnQ-#5-`-S>jCijtt^nVx0TYE*TnCRf8*Hec`ch6k#lS1J=8>Si-^`0^{81J+r?PnD#Wi{>i_ctqN@IeR?iDg>7Oxn>m%) zexu4D4-hSX7PhSAr?&u`_JuVPE{mx-mDxT}U|Z5;JIgSp*vzTScBj}R{;xv9_#UcvDvQ4r z@o@A##a`j&#a(+y9;#LcQ&Uo z-KXheW?7{@N7H{IF5}zT%&E+Fe1WY!N7LDYZ9+SnIhEN4#MVAq%|qKBclFgrXGN&@tx^1yu+qiik z=pFF=-n-T5=^JF+tkvt`zCn$fwE~v+Tbb|siaIin=r12PGe&)fs?xh(qi?ig;n5vK z>L98723zZM%vY7QL^+U|qrH~z0`+=weuMBy{Z#zhSYrF@x8DkL_xokOn&9Y%IJr&7v~9O}jOAWq{$W#Z;k7EiqR)OK-mDvQ5JEUV|}V0D?@oXXF7tE?0ETnFYEm^yXBi+X=e15?DQF zoq~QAdUGo4zebhK+zG*%RiMj)V@_qdSFf_^j>0z7&Sp+!wpXvR>9xW(yPeIP%54AB zDm(9ht=rCTPG$aAud?ZYQDv{!&Sp*}wpXjN>3u<^Iq*i7%RY)Zm8t&Es_Y3t?}S2? z-P5SDHPg`Bqq)Oko&9=MdMD|xSZC{~Tkx6JsI!+ZJVcfA!gX0;_^7fjRq2w&@6RgL zy%ujky*Nii9YY5#oT|lz1#d>=pvBa?BNOb0WsC1pp2vCl;_u2d@>db5Muzp+#Rp}q z$1UDDV?BBCcaZw7Nu3Vs=z`g(pT77qSU+PwoVDO++}^U_+!0+sXGPR*8qw;K9%7lj z!$=TlEt<+jODE@S*i8B^KhO+@wKjjwf`Ys0WOFvb$Wf41&)J|Uph}?OLpI1=?1kpM zs*oCoW)0F_|1rv(BcHVIwv;;xlT#z#SIi|ew;x(04=Rh=17R~*i^SZT*7*ivKw#z(Q`$~z;vl6d)1umcKi}8A~kT&i8CWL+MsO>c^56UX!*V)8JwuRnopPvp8;EA$|nvg~Dl)e6j<{-Fie z)o+utwvSzt{oXa;P0R8-jhGu`{q$b*qd&3u_~jDK)9L+AmACt>UOPp>YOa@5`|B3Y zeDZjAo6S^qpMAdA>K3bf_M$&INxE5)7!dJv0t(}rSMBN%s=D6GOPbuljgJXK2Ms1bI za;2T6M9*MdDb0EnrQ!W^jYFhC#h@m&5c}$YkIGuV;BbD$k*%YCh9OS(n%RLC495q( z<9#cdxoY5}9lFDPT9NPVo|m_wOcbg=7N|KWmc7^KMa>M7VNb!SLe0eX28{=&bS!{U za-hE6fZre2u=o2ta<**9@6-G~xrTjEcI^Xc*wNR%zJ?wB#-0*CXMTTH&PU1pt?L0% zTRAtEmU3<`7QVU&RH_-@G1_0^P!m~Ux}37V0Yf+Wxn;9-dl=#e=F+I^F7^j)sq&DiU0U>Rm%_KR z1xI-|q3j)+~=0m1-K~e3p zV&s?@>g zLm2MsQp~@T@N<>0U+6FIhg_8Hoe08O@)oKM;VQ%a zY`55lUrRz)_HBp8ymm>weq7{gNPe}Avyw^1Stv5!8ye~!9hTSGW{|_-xq}&~!z;m) zisR?39vxa-=)+8H-2xYkFoq1GM(<^@@4e{R?h)G_)6scNw&p&zU{cd!M`PGaG%X0_ znl;C#sH*hA4uUc@Juv0GxItP|b=+u!ujRI8nZGD`s zc43`2)*Y)s@OkSiovswthRw4Cb^C&{oQ=g;WnnK{wCwwSZ&tovE$@pNhu(^G5^DYy z2k#R97mR;b#ZGIi@T))QSCTiVj$WmF?Oi8K3GG6f(IvlAPe)T^-T7&Af-zt^N;2u} zuk7yw_ewfdAKbopN^BbvJ(E8(-d9n}UQvc7>?`?x`WLS6arYhE5y}pFK=4Sw?)Gv= zVI13CN7miZ=6a|C;EusK)g22Yd+A59B$p|u48T6ClB4S`5g(}U!H>CRPb{`~Qu`Bw z2T7Z76@FT>5hmsw)$VGaQ5GmY>)o51m+$aWq{P#Ha&@V-4yn7LECBc7VUySN!&OAW zcy~h5qLi2<R??qb>nB$AFxzSmdiRcX*0bTy~0c{ z#d#xJ8QDsTp-JfEgctDE(>smpz;C!hO&n0pfdxvDCC{PnB7y1LWV-Kpv&=_&#p z9$o1`0)$Rj(n;7vMcl9#Sww;+K_6CuTTwCN0;quEf)d$8aTJ#s9Y;sU1($Kqam58( z2&gEEin!t${@-`by>F?m4w2FS{2Eg4zH{$A_uO;OJ@?#mmj|44m2>B33yn`8*pnN* z;uSI#DOCm=2Lu1x<+WUj<&VS+VfVYnjm<{D!vM!HjKmQ7pJZJuC`?=BDU<4F`NP$G z54tE{rDr<)5m@6^LQy+kO4&#SA62VH5sXC9E!w7^Ce@$7Pv!Ai@gERy7XjyVZq3E0&qNFV zUp8tK)kqYv)?@LeY^T23UcW^fG3S4dZBzXX>yH_~Q++jllm%g1W``k>9UC+4{WtPs zK15m8G$v^!7Y0-SyxWj;h2u<5H_k$8Ool}r%4D+#SLS{m(LQ#&K(iE6kBIVrB%z|1 z%y?hKYc1t{2@f13j!-iKT_F0YXz3}=8i7ptF9ID#)5;AR)OR%2*JIz2=wH{r7)biT`Zk0x~M!02wX#DIybm7-QzfQvSvoNB1he)`xx%wX9X-weF!`U2U!N;jzje)gs4MDpFRPs*XQ)yN^gN3`p zt#d&i#^tSi)Gy*leIA3}S5bQFSqzq1&lbqn2-(JSD1gae&)HV4Vme+Nrs%a1Uav@pmznJ>n!Mf1YM6e?_0<%JbrHg zxV2L5@TzyMMC>Q+ehsZ*yC&? zxeP@Dp`D^1vN}7Vr$ZZzZ6~J zuLJ;~5DP#8C&D%7y%VBfTW;p*mX*MOW-;_;2$5t` zo-M{cQ4)4XEGSN+fmjiQrE^3IinFHcKGA=0a}<3nOIUwHf2k8Yj)<~juzRr3pK!hJ zgEw*&=?@Tyy#6r$dT;#oM|kx(;Nbu>g5p1W4#e^GR8X`NVA;P3VHwMDI;tBWffw*e zVb}X-MsZxl{K$K&&4V}$U*2`$yX(E1DLH5soc=_)?A-@MV03NR5$nO0bwij(Wht9h zqg#&rg+FS@{DdT99C#a%bEyb3Iho4vO6H$R3Ht7OS0RZi@=VSQ?i>bmaL=d#o7D#_ z!WV%fn2?JJCF6?g-~$M%ca#48z+CB(4u^V1dW()hdM?fAXmS+_8frh`NsoGjG(Qun zO__1~fMZ_FJ|Li@ebAx|^Y2mE2QQ1*2d7qs+l+(Puzh5#Jccad@cDj%eh#v|Uyybv zpoqPY5Wj?w(s%&Tt>=MeIMv~zXw@b7OF|nGe2~ElCHN}_FJiEM4GoLuOYmj}U%=pC z>xGiedIN3)5wMtuy|UK-HFBFb5cnUKX8$(=H$H=j=Yo9iBZ%~W8>aVv$MD3Hz`6*L zW~3N6EaUtczPQioI7ZEt$8`*|{MUFo-nuj18F&=3BRZ4rPh|Yx1L4qo#(zkj9w)jA zEYA+j!*7x*mF&BHN{{SM4-F|`bk;sK0^hp#b^^`FECQI(0iEKlEbqlnGP0{(D4%Toh))V#U(h?4(D&>82HTK%$>ZoG*GM^ zCrBRLWRXxzfYs3{Mlrc;QFKM1gL}7906KVVCqI<+yI4^D_R#ny@faDN4fb*`e8Z!q25}H@#vUDkkS}BNh;jwI%u?s11t+Hc7?ud)rc8ag-ZL zsR>BnOl6=g<$Y0{%Vu{->7}+rKZ_keS` zB2&p%@+zWfHf_ew@KNj;7=S|)9(rr5Vy%+?JSsA=0aw!ZM_nfRTkTn6e-av|p^{se zhR`q#wco-tgobIT79(kl%};2UhWc`08bT!vb=ra05cyv*`;JRLsi|JTF>Ym9do!zD z3Z<2IFJ_g!EY>)?O*n^e!G!Y&?=ayhhQa<9A3s0Slc|i&ReQ0jF_Rsd$GvsgW#)At zl|!0ar|0l{>6V!R9K57QlIDo@MK(z>qR%$nH;bz=nyhIt>*qk=KyQDqmuDas#z?PC z_vgHBL=4T(R`N4D(nIr=LQG(a8KbU|QERpyR1YlaU$VFKOn4~egB`9VpsECDq0oo> zpT#SHigbTo$?WUzi;*=vH#8sD6u>Rk@zDH^AfRd%H-IE}l>8px!<`^*lhOs=80|Qs z`n8ga>e)!LT^q$uv&^_(D}|w`qpp(IZ0e02suU`FBhkZTUlcF`z_OWWmQg?=82w(Q zvY6buL$x`mPerMx-0uhVCRsc6y^*rU%k9+n#)utGLn+4~BRHXJh7zstD3e4`2IQwA zxR#F=Jg@2Pt$)W4cNqCX+*Rl_jyRGJ&fpqDGV6r4_eR zX_>|BR02BKscGj%h^+iQ3OkjyAlTlwsWe=@1V|d=P#DHFQ-27N#>pj{hvbHkHdFS) z)-3b_Q}%NKNIgN;l;t`lPbl+`zP8&ow_c1oF^ElKO%nw4;t<+maJ03Pk5cO;d{kEf zM{5^@<<>v(QO_)eMf*|)E9bUe#^+$`m zxjwGY$CdiPAvl=ZOV9&bua#gQgI7tAUfb5|G~Mg<@dkaoQ6E?H5jff0F$X5LU2tpU zv23WMHj2b4G&TAed=>MF_ieoFi<@n{q)T%xDJLE^WTK?(c$D$jwS=B}cB88;F7{hX zs%?Qr&|AU;?_RVcfi*0X{o_#~ov;UvNzRo{nl};l9 zG(MSFSxbB3FMz-?;!z7+SV>EV;Rp3XSVz$k3+rfXKkAY&t!S1-(^9*HX+_sW)4I;d zT4U6?NqrKlY?F${KxFwZ*55?^m<~ucQj4i4L{3C&Ma#)J(?L0jq}!zat2$7X{s6Se zBfX0!$h(g{e&Q4~PC1!EFW$A$yI(+%!@mdqp9c6#3-G6$8$dtY0-Os_4JQ0S5Du@; zN+*Toced>TiR3bv`^>^G@=imS?vHdYCOUY^g|0&_T?VXlDU^;WY=Y8JD|w^$pvWa@TMgP&C-Tyq zUl1;wOC_(wmC;~a0at%rxy^fkF`-CE|JaGVpJ%-ix_hL%e(zu13mR2?(dNaJDb%vN z{y+dqT)7RH9x)IC( zC@rMKV8Tfm+=7}x8?F6sOA-~9>wO0-^L{6sCP1xy@Am>&M*u$h_opD*r2j(zFzNpo zNnbMQK`-?a`Ts?&Gi|5FGSn=OIdBham`?gdeagtvjTy06FqwTBFByM8@<3S(OCaSh zHAtwA{j$9HBhoo-w-f$1K+Bg%3pP|XNsT{>L}grXxCN{vAmc9s#4i9vLbm9S$0J6G z+a_Jk5_qi}**n{v(H&_$xycW(*Gs>&y-ep4hoJm>6Vf)L56$~$S@c0Zpu1` z;#BLGNw?kKgtksiEdw;U$nGY;0(7!A?o|;IT9$B?fN=krv;mFR!)$LVWGXLQo5|8q z$!$=&2KLcj^gA6NN6duUZPH%n5)tk7*hZkTjmv6ebRW|YCi2WU+aYe)#x2C@A3(0S zO^)Be_5_|zTuZuSRBwu{EF(6Y&9ZTbYd&Tjgx0m$q-#v@!Yt<{dUl{frRIkE^SbKa9dg~slf@t088oZ1uG z5sLBKr1|=&5C%7`M*0Bs7M8j;c-Yce8puz*mJ`Av99FW`a_5x6%|uT8e|0SPJFXkg$qG{1zWzq7xoS)Dd5q! z2|~wsB*p8Eo4f|vIo;pweIC;_HzEhcUbo2^mo~gqBV<{$8e}2-^M(-H>Sg$63-*Q1 z+JKlCP)QQUt9KxYP4_S9NDAkLmXy*O@QIc@zop3C-3Op>&epVQk%EI_*${C1V|`Ki zzt`o4AFKjwnA`jC!-|cI0qaLoV3iqrak0VrH7?!_$yg31({^n{Bkn?R<=Gwc1A}gH z(0iC|va~c%nxa|i6icNwy+y3dYAR}j(m=UbUUe+niic~8Wo9wq2kbb?$|>~3cPaLp{wKBEgab+C4v0v=2<0ZxHycDHTREbzHLEyGnI3d zAXydy!7Q~{+8vXQk%hW})D)M_4B%P>tvUL`XmNDIFNDKHqW7x8_Qa-?fn~*I>%YW0 zSW1ITW5uymkGGt%vGIBsj&+U# z9H0xR>d2-bS)5A;FXR$tH2q$Xd_S?;y37u)B;K+PyuwH_Z1 zTeYy>wRxw1($@8Vg?w@$a&VwDuzD&-2{*&;>d3f#Xz|eXUodQ<8CW!t{TP9j6bw4? ze7!*wy7$5;GkzTgt<_#4a{|1`cos)RqhMf7|C-pq5~Z+&1jWOm;~mbtFH#fBTnupW zQb>`F#DKRj($r?{J`??Y>$KKwh65*CAzJIOT{;kJiR=(%Mx)|t=(g3x)rwRm0q84- z7Z2ZX_g^`r%C!23;t}h2QdvP@WQKnbP3Lj^3>-PN84>+QdMo+1&MB_*^I##z<)ey6 z!8AV*(ZzK#S&t1IQ^l$EY2q|Ab{v-1o1E}-d<-7kfeodBqo*z-A;k^FqhCXq%H)pX z(L0Lk=VrWvX?_Hepe74yCeep!_SC>TnrRU*?H+>ZiM2gl6~U}2yLj}QWA>Zpu?VMl zG#Gbu@#ug;un6v_os`~;Qo)u{f!H` zzp1!s{cXbi=oq)zB)xK5akCB{#}|)Z{}JK0BC!pzr8IED)XODeOYwwALljS#*QP<&F9 z;*%m2YsBA$;*$cRW{R6(!m*gR2Nl;BV63ZaJGrJ7*Fw=@#^h2Bdu&K zmH+_PSbzio*lht40N^baAOQfbwEzhKaGeE60D$W)Kmq{VU;z>U;6@9O003{b00{ta zlLbgX+KbIsJTGC0_JpCmRL9_=!0laax}27S?k4c>%Q3%rW$Lt-6d z&F3b_vDT=`dMIbyM6_nc8y~LanRPK%HpC%SZ?eMX)J-DFf(1CtIu+{|u02U@O@Bml zlVuY^pfImVmc-{r(c48;_@XZ|V7R6o@-9J7&SIN&uw$+#ef-bv=_I`qKgvQ4FyY4$oO!la%;XcYDWEw=55&S88Rid zBR2IMnvYb|kUTs;6QQ}i!flBBH4zfp3vI7vTcHxYUxl_I(n9f#U@#%@q+)?!{X^6P z;DCs!91JqeIXF8!H#+aH1+fFE{*;Fgb%8O`(u1=jh{7Nyd+JO5sQ}I_JG>)U!T!{^ zUMeTyb&}4UlNg#eg&@+w{!}AP0ycRBY*KB*li+RY>hX?37#n-1 zh%#Os>0xt5VTXBozb7@Qo%X3dw5RmvPV9r#zR<0 z*>Qi*@W}8;V+sQAt;Y{eY;B1Qr0+nXa;&#)AoZXRJB^x1&h>ry8VSO#Ckp*vP$wwe zf91o&rQ!M3`xWv5J`S`MYyDf~b#}V-!N@E2`uuz3^(oV>4@F*&m~MTTuY;}s;G@*~ zNF)+jKdR7A@KMRPKFQ}`>sCH=g!mML<<_V9D78ML@t@@**s^mnhXAb0voflbr9N(x zbx}<()zNWAa5woI3@G|y29yop0$RkJ@>H^$BtFlA3}b zEH*N@-l3>RcSbG(;{;fD*TTh(t;I)!tA&hz3?4lh|5!Y{ zNn*F=Dr2)9<2Co<@g~2z-VD8ufNardOUojp?pH+&A;O3cZl2Yhu5Oe4b|70C=$+y{ zxlaF*%3d_na-)!WVz{_O6*8i}oZGq_zSqj2MB@u%5F32Zq0ranjy%fu@w( zivNdaOpW%9!727)s)|kXKqQMUSY_F;6m!+KlDD#GEfhB?0B69X{#@mIxgkjH@a)#g z$>y*vCxF8<%7%USW%(EgHwUm2^J5@5i-zw4A%8KajHOQB0`3j)Zs?bgqwD!r>MunZ zC{1CHhJ_65&y^x1>9I8&4FZC|Lg2~|?weDnX%3!RFD}FeD(}8E)V6lR=k+`g%++1Mj^u#%y^=a z%AX@x2528jQQd)o7@>XZei2Wp_~7PZGUy*N21@PM4Y*BxBNOc1D_jd(bpjO<2N!%0 zld=Pa#N3Wy3<^De{*h3a{C2{E37AY$ z{F7J!>X)Z4G%RFj-qyoZONob-&m9+ME~xK**X5DucqzFV)Jsd9<>G|%A3FG!)Zd$Za4{q$9`VlKzDSDgX2?0x+G>vtb z(mgkKlNU{zk$w-Z({ut%I1C)6#FbWA6{mwt%Rtz86=otcfK>+4Ud+r6zy^dv$P70G z;)A)x9MkgPGScQu+8oXfMuC38$+Q+>1#$JOe*x;vY9LAhxT`w?i{ud@3IWV%l#p2bgio z$P6ISlKD;O4~hARI6DaNP~*q8`5G6IOdJwAD+=+r&N|Tcb;^d@l*v$&GbGXGu)1-p zo4lI_dvGJZunMIhFmcOrf1S>${?|BJdWchK32|zD&7EMJD@c9m^Mm)zd2bi#mw_U2 zWG{9AMn@!6W21x3oy;X|1`Rn$vSrF~F=f?zJp{La8O~wQhmF&5E+?y>FMS$VFlvT;@eajEc^Ocj1F7k`qH!HvAS>sU5F=I1<)^ebgW%~2kw5h9qrZt zPjL19lH7h6x-&nn567*?i-#@T20V3 z1ntI8c+{SA-?IYJdEHX$zfec`3qGfh|JDcQt`YCRX}}g9=y99OqD}$Hr2vYep1E!j z3HNBG9bQHJjo2I*13tW`Zv$Mtqvk#keX&P4y;D(QUSartvCd1K=)BZGN3l_K6k{s2 zy<0o2-_2|tndQHs%-qN*_ zWIf@`8$MF5g^5k(jA=kYAJeV-$2{v+5MRX;P|i0+Pev}al2t1X8?<;G!)+{3x)TwiwG}Dq~3kC zExL3?waal^p9hf;;4kRofB2|)tuOLfYJG{1a_h?)`4v6_r`MSx)_Oioa@(~M^>PWO zCVvAjm%gZ%D^fansk+tZD3%)P9ibtrcVcNtT9{S{jiz;-V^H5|S#PZV78*cW9-GxG zr%4^1+KPl67nHrugdbzz==O#W-1D9gz8N{9(5Q3>wxi+V5?S${MwVaydK6MQS6&P0OjgeO=qEm5i>4jicjnv?)kU&SgPSk+rHT5xyczH$ z-|rfYlbJ<;4zkQ_CNqQoMV(|yYp~yzlE^a@+~vuMO%b>aa_@04=CZ0)RMB{k7l_=E z(Vv3Xjo0y*LT2&G>v&92e7%>it`}UxvoGbSaZt#(2}!QjFeQr5rj#kEzeefZ`HLf| zw8|@Y{v3h5>27@Ixp68;8{fqk4~(k~a59e0mm$he(@B+^DnitG`w_rcDd1F&*Xk^F zs?SFI7*=eX-!YJPYKNKkVs5wpbr`>q`9?8){=AxayPgk6p!hRs=8=<3{!Jv8k!GM^ z7+EY7d29>)A-~l>4Rpfx?Sa*t#l~V-A9;L>N_O#^G<;0Y8z(|hF9taRyY!!mMg`Gq zDf(D@v5mW!pTW1Pr`FJB=9^{(Yz$s2R{e<0YjJ3Lg|q9rEqh(=>*qz($;uKFo!PQZ zqMc`K(S5btku1>>_Gjq7DrJhjGo}?ZjsR{chBV9VC@4QmSL%(^7~JS_b4e3sBGLq# z0puQK&TcGQG{RIgQXubzVlOWC;wCNGLaLD=kG}>U8)p<TaJ5yfUq zuT*B8sb?oxX+VzvL+O+IzpF66@b-_d@C&4sQQ=EjVR#GIABoNsZQ)DdcVF0}7i(d* zJ8p{sLMvARqmS4U#q+-s2KwFpA-p-_Gf^6`crT+-$Ld_VB_cN%i~pZzn(Vp%NA#da z$uuP;vlVKhBZH}LDMz6$jcQ25;>;d>AXf83en*NU8@}_$haXnd>O^#Er|#E)sCnwI zhN&1)OWiqhXKd=aM!Z0cgglL+KAy@*RW^pJXQ=vwXJjxns(lTD#gz; zz6M3^_j$&*F!3uf>b%&+amCOa#p%W)%qW&?d=>h2948(9+YxZaleste-;fY2A}CY; zTYR~x{m|pBkvV|ta1WE%ma^xJW^7=mS5XiFI{LX{u$n2y3!rSln_w3j?dP=f|J&U4 z-$FybN<&S4+UBlL0tedWu5$!k1JW1FU6T&KTE;)O@g$5%t*@fqW;OV042q^}-EM+6 zPPe{pg1a`hzQLgPWM=y&gXPw@_>c=f!XLe6_727jw(gWH_U5?ffv#{C++=~_4RTWa z-t=>Ab?h=U;bu|T&JoQ04kXRYB_nqRa!;bM@x}Kd6^P1gZ0^7sgmVX}Pjv2}Y0cb~ zl@8Mi3l>ew`b*lCoZRvaj;J>J$T`9LJ#3F+jH@OcYaC0 zT>bAh*?t-SDQFXZHGtE6oQ9SwZcLIomKhdHP9r>?T+ihyTK}oQ3M~XXeDboieD@i4MN?5PW}P)pZ)v)1TbC^c7H7{Ym>FE$?YWf_L*dEpLYJS^(~roaI~F zcOoX=X7mEgUgP(r{sUU)y6c@3zWo7TZ_2p`kncq2Il9Q7fHyD`K}vVVqSpAVr~1RX?=`b4HfSmrZ+9V*HmeG;~L`hV2nN zC%+YVze^rsKKyjhYA0v7V#~fpHcGgIiTUV=kUVC*PpRIc| z$q)Dl+&M2Lzk_Rs+$IZEFQt^L0IFBxr4%yUCQH?1Qn31dr0^zx1K*Fni0_B~o{Ym! zH+?VK$7uh+w|O7n+RHloHeUcb_vzcLOd2-;F4Y>Fos)a1unI;$CzqE}Q?Eb?f4i%b z^=)%?k}<~B3C8q&npfmr4Dw_y&zV=><^kM#z#I0Uk7VLe8SFqDwlt;g7-^U>@=BX0b^2pG+c z|2X&kM|en_{%qyTQhsI0EcVANS(pu8C5lgJHxEiORNk#7rdGWTtu;B>`f74&6@oSK zgu{CX?t&b+&F>>o9^1DP-tTZP_JxBOOK{U6q1lYL29A_`I&=8l+SfbhduTuMVKiOD zAB@ir87G^48dn=5j7!fvV?MZ;oxpA*<2uLisE=DZag!nw_iUrw1n4Tw~ zgPu=2UqPAj7t! z3P4A5tmZz>3km9A+Jh$vu~}F*3=Ka-{dv#by?mBhKhnpK`6#!3p^pa@_$z(E)lZnZT=>}}B|p|VCnWQZxKhP7FXNj&*6Olgu^#Nn%UQll6!Xf0AFx5-wO4e(oSF_m*eQU`Ll znsqfii=jhtAnW?yhRTao+fdX?Ic>vi>uqr(0Wk z(-DwAFzpny!~uBjz*C$GWF-DzUpp@V>{a+jKk-VKd-&MQIY2V85)*CdUN|x3@n)Eb zPjK$7UsI7Li|I|XJ3>X!PMoa1F>^Kwq39dz(@3aDN|SU#q_S%eSv+Qqp6wmzttrqw zO?{RKJ_(YLo(9HCPZROb7-Ooj(0>Oe2G znBf~Yx<9|qwBepB7KcmGjQ{=g{ zimZy=he)?cwWa%}N?6?zW^3!|bxb^*83JcHUvry8j(IjWxxv2T8^7|zWKb~p-oxR6 zlo2Ky(}GOgXk{~@gG#2%4AwNWEiFd~viql$Vlldd{Zq7$IfzsDw(Xx%41w^`#NF^` z9F-2{(VLc$C7ek+4zJXii1hJ=V>U;c*qBW~$1(d>BIVzHj@i$I>agEn`kT(SBuc>{ z(aNgotthc=kbXJ4(gtYua29t-0Md(W(cxY}P=`Sp4)}*qM>z*70RaAB0TKY0=oXB7LANVk=`k_X(+P@@_wl_BmJHD!Hp>G-;4u(&9X@lb#rn+c3Z#VBhh-0kEN{# z__&x+n5?bE97kWgpCJd!R9rtKt|bv%e_%GZ^(Q_Otv~XywDk}l7c&aD4i{W}32-H; z)Xeue6UnmoG4QT*jS&^$;ZDTgOWl{cf-Og<P?3mPTyKvhMffGAGrG({(WR)?tJfE=s$BgS>}AJIvi7&m_zqXUY!nn zh_q)p&i;tBj9u|7h*aKuE_C`e({tOf0!<1s{;NOxfQH;E@3@Gj8dlIqB-IGq zFMPF#M%~JI^nKZavb^u0MDLsJ5}8YTN1(ZSY8%|Ne*i8J!;yn!T~5vWE|PbAQqHHf2 z0#q8jTR<^(MF>&-@J1~M>He8$5_RJGUqF0MF6$iv2VL-~TF{yhd+;YhYohFZioAI` zHk+$Nj-oC<2H8Jld~(#grh=}N=x)paaRDnt7o$;w3Rae8GU?nKaEDOP9AO<z~`xb%7?TRK4|3EAm0$#x3X%18IDan!a=OMZeV<`iL{J z60dB}YeC`tZS7epB@(!=N~)Xm?gZm*3acAab`UK#XwQDM=Q6*6-ekLR&M~_00HXj* z3u~(SLHP1VV~16a=eX5Bfc(TvS@gzuDfw3K)1Ybs5q$?Q5^>wwMI!E5-6?{+_y~CM zGv&odAlvNELlo|?KXauaBJQ~7zjAuCf1@+E$%Of;LrH`J2(fa3Fk4ipPkto$rOsvS#NZpKLYO4!%Rg?oGZWRNmQ({iT6zHav z(f4I|FGu2+<9#UdK8E+<$a^KHEQ`?BiDg!a9HmNR=YBJ-@iT}^PcGDT$~*tZ06PFL zi?P)Ii2*NIW9Z(>V&SjPAy2&bR5U^5w0RDBSHNC@t!X+yBA3`6ixJfCW@D|%*0cgv1f{;#B}_a#zV0|Tj%{B5(9P`VFv^B zVNo?BFYsIi&4{D!8$|!~mZY}k4Z{`tGu>eiw6#mM3a%wWneWsvvbNQe_MV25Bv9h7 zC7U~qoU!4mKWe<#@v2vV+hM+}&1b7;-_ONk`|0fi9Gj}&gLR41!?r2pb$gGKl`Z=7 z+Xs@l$}!vLa4gMxl8|K9LRrW2LEJCf>R1soV&9Sn&Ha81hCQ{z9=U3LB6c3OZ6Lkj z?Ui8TgIeyeRWTK@Xsk|ve)&F#i*#uy%Icfrpib{^{Wn1eH!(f4pIFY^}7yH zgBtZvhp3W9{jo#TkVgHvL)3^y{Z*p8V}w&?0H933pml!LCKJobm4QHCN4Orba+X!Q z(Zn5-b*Ez%4w`3z)>eAzQWO;)h(`zIn5J>H=XPkfLRN(wtKrlV66Zg?rRMiRltD{`JC1`0KX% zW6sv8`eD7eJcxQ7OJ?S$zDThP4M60^ps0gg$h^puj@xT{GB!6mM?5#i&-UDfY`{}F zSeCW9Pg{^1{i;28PcF#KEwVj1o4dbrhr!|@u7GJX{^9(|E(E6C+(KX`am7U(PUH;y z>(J_Gi(+r%gAl=+7}^ah*XpmaVlP${Ih*j`LlHIcsSfe)i^OB5r8AF6{(p_c2l_D* z{{hBF4zJ5SYuNd_;S7!rS?@S$P6$VSVuM?qg<#-RKBod|E2W$(QIp@OtR%c|Bcg5o zq*fYkK!GxgwGsTHx1kb-@xohl@yRdBY@Gf;J2AU*TS04Qn=p&+E%l1ligmgd{dT((?vvy%>w;m(sAV| z?VpNkBfO7ek!2v$pOJl8xPW9Ka9QOr|7J`BVT6qMKZN7Q1F`w+$WY{Eng0VDkt;>IrkTEVF-Q|C^)Tv>K)dboUTdbE74jxP!SGT5K#Wk!l*%t@-lXDkX!DGZjiikl?F z=NQB_ROyRBZQ8*YG;PujDKssIS;ar`c{JlgN@p+Z+8HHQ>BIZiltk-)`oALo%5Cuq zfK;5KL2GvRrqdO}Ky`|tK9u>B@a%TMf7WVjPOAlH-;m?NeRqxbar6P}R#PV(6YfnG zvXgi5GaS9i-c(xpu=S00IsL#XZCYPC3>8f8D>ie~92}KHnJI^p)Gc&DHnNaRe9kv7 z#g2a!pEOQ-xC}X8s^tA8c*4gejfgD)%3%n+z_B^71W#mkcM1PcYXRyGKcwA@rQ6AS z(tZ&rtb{y2P(p5^K79h+d}E*8Q0k-~imM z*`XPH(RNndTnBNa$-?k2s9z{!oSC;-6$7vN66-aW004a!AOQey(n($M5&)pz0we$c zj@D=j2>>u?0TKXUsRc*?fRY7B0D!UuNC1E#3y=T+!xkU`07fi80sxF!fCKid0jC47R465Af^JOE z1!pGlc9!nQjs&4ficp%cP$_u?TNa0(Sh{z**il&}SYd(+B?uj|rU)9jehROi^C!}X zPsDFS=6nr1)wUzh?YJ3l2Lc=#E5JB;-=6L?E;rF-zwaTxo<+zx%U5!FOZ5gPF!%F5 z+d*tSTUcw-Crh*ZI1U*htVL2*qm)Js2-F%lwL_7JIiiUy{|KLDhOo-9`WX#MzxA6y z)1O(#1U|DvMO%L@$e3_{m$N{Wc}jxfMLi*YSNx~8u&qkmO0PAg?LOHgO)9cL-BA8S6h2asCMNLH{Ql3{o;XK_bcA^qA-ghdFk38{~* zeG?F_eJ>aCL{G|BRD>CgDxfWr=W0+Y)u<3UAy5g{B=}rV+M1N$mAJyVwTeM=Go)0} ze$DfOP8--HMdjkksj|t@_ehSb*?vFmUf>@R0;&gL5>OeFb#lKJ!k7EFPnx+%<-QAJ z3KVu=tT4&ei_ehS!U!n)K3hPMb}E^Pmf4cYl(K)2lEIg{*$nX7j&)`Ve1ZA#F)}3E zL7PG{B-L{(l~{!d9E}!RKN<3&Qsy?P-5XzB(l)SpM zRrNEZTE2!a9WW7qK~K$imzw*5O^6M)Gd`ob2$g5kv;LS+A{Xt4F*GA4ztFK@;I(Izj>88gSl$C}{T48* zbtvj;?$O1pF6l09t>I&^wN@X;NW2{@5MG)%FS* zBIG+fPvJI?MH+QJjl=n5(s_NP!Fvfr!rz4-9^d;XJaq^0Y(5_IQiD)$z`GKk9?;(7jo`I%t{gwZM)BmiptSTa<3kb%k#{)}{NH^_ml=@rRpbS$_P+In=@uMRv& z`xWmU7S}nxV1rsWQ7l$VE(4x$<2B43?(Wv@};7E;YA(p8yzhW3d_vo~SWLK$SODR9+CPB;iB0 zl9KDraDWuu6I2qWLv<5=-r4cG_v+(0V84wmFoC+nO$Q>55BX$_f!O*^cdBp6yPU%4 zj*O0s>Lu}4$a`QX#EWgW6WU^popAr+c0zq`Sba25g$;BiO7vbM#R9a&dlPu#8Xr{miGZ%c8wR7K|1t{7 z>rfN82XNxcdp&~Y^pm$4iQuTfhs;g7BLM*B8qU~yZwL}%3pjnOJeA{WnTH`AmHWM5 zlk3?x-pRCAclYb(0he^i*+*D-NRRv3lkz&ty#%C>7DO#I^Z?kfP zE^jH~O5X{Ni_|ur7es|`@w_BSw7fUTszurBI8*OHT^$gq<6J-_UuU^I7h+`@vMZ*v zc4ZMCQjS(ROvTbdO1W}%A{M6uLRnX4wuJu;q{2!&i51YX*L9u&!V`(X+(atpGQO+P_2QF3!&UJWGL<>wMQ(9E2(MOZc6^KnL z{p*R(Z9bNAe>KW9=S(sPf)s*r0uGyxkj$TFzi^vR=$w{dw=x}1ds^qT1iO`LG_BS( z>0AifQbL=OO``nYqwPSYa7F+R0f2khxRe53V5DcO@)`z;N@lKFM{k)=r$zYS&9m%c z3d%v+q$p)FHVM}n}DrXNmcqU_9 zuy&D1{jhz`0c+F`OIwS!c!suCqeSf3DeAwO7}E8mhq>)F8Xjc0On#^RAw0_RQG2M0 zv_Fhj?-*_3Hpj1)mvN>~vgM_mOTdW?>obUpBD~!|e<7xM`1q7C75iPt%0dRW;X@Y< zVk;I|HB#EWXa&FM+syR z$YfO&tRd;zhvgeI+7H>K{UaPXcoA3~-otQ}b-!N;C?FrsKg_ z8OI62c>|tV?ej*5tVWloY2FRV-hwRJiOhLU z?=6rN1JT2Ypq*nM%p+iGxd;`HsFiLwJO_1w zbD@pRF+XNw6VTDdem^>4j{WMZ7%5$GjW@Q_d5u>@4H9_YwV%yMSbh<|;Et>j;= zWHYAZzbSlyiFh&^R7^yFcMQIc@aqBczlC08=tBCngl{0+%ovCi@WTVRnK2mn5doeX zV)%~=;CICEpF;QzAl|=GYrtj?n8TM!Km3jSESYuA6Ij21s@M2uCDnPA^I~jKJcbi| z2{=J%ig{TD@K(|wM{?aJ0Wr5L0inlLLNT|iWC+gR#oVrps+4sSbj*2O0SSYCBEInW9pzUWPsu zYZ}QJov}*7K6Fq{C+)fqfx$9}Wcd%0Xy)Vul>D1ips6qdf#!?22ijzs@cJhrj3J=1 zxw1J{DuK&v@8(M&)6_&kA$+NR2O~gRA%xez6)A*($_g}Gv}yz{w}tQ}D1`bn;4ok8 zjJfj?3sY43qKM(py~17T&L?2om|-uSxII(w_2(OIzxix``*2&oCH?3|z(gnU_0 zbDP?lCPI0tFKsJtXTr7hG*l^cZJh?10$)Si=gfpLdzgTZ_V9sONG1P_qj{D^sP#G* z2Is@z(!BTR5+7(6Qso*f3C5eCl*gU@8JNtD*mB~BBzhAXKHG#y_m)hcI3 zF?lAu9vwglsGbdxYg4O=&GahCm7NH+Dytuq#TS%?o3i3%5nhk#Zvv{A|FoAy_^|Cd zlIyvVvdG_{EWT8yP*ODmJh7@VsvcF*lJ;dt+g3Hg0}DoSeKArT+b}4OFQ^($GsMdx zygpP5hXVqtKUr87;ejb4xmGflF-6#--lvkGUx5YUxG=9zL-e}WyZ(*hKF@gwRKoEg3!(Vb^%d%5Fy`3ON1qAUW zu$%Z2m^ADyK~wNWE`7C28U&zic%U*y9pUvCM%spe>J=2bxGhC^usuj}T@q;<_RpYj zzEp2TU3f?np5(kGf)OC%!|g;6UXPklg5d|m5I0{44=gFkHMuGj5Nd{i2)=YALL$xv z2@C09RQ+khXzUhAn?~9;ItUN9%Sg7Z5kjb!0z&xGkq}0J8@IJ{gYfzrBUA_m9`9(Q zLJ$N7lw^BbgbJ#}fC|2Jq(UNu9SaCyRQ)RvLL}|Fh3p_aG;So@T@ga4kOM;a(vc8G zfF0j%X9wZ+rITT!2!=l{q(Tq`wvA+ibJ?no6^^s78{=-rRNgFtRzC;nua4oTgH1uS zaqEE9jYHTHaR?%&Z{8ca8JWo=kpe^gom9G zaE7mXp|f)@ZbOl8b^H~9z3D-ItK;p69pA;6?wt?E%dxhKE$c%`@hM|}dgi9_k?c*LeuYf@i7xMrak_=BgxqtObh~Rk33oO*mzsBH zZWl)){fNtvu1J5N8>YiuV6({`bEzFjsUAn}wN5xaklq4tHcGr3#&Iv2!iFX+FO+s) z^xq(<)wK>c!eq+3Zzh4Q1l}@3yX8xQh0O5o3)dlaPdYQQ`@*9TYGFG?GM)9Fh&tkC z33<-9k_6_`O``JO0cNyZgq+3@N~EVd-Adyfhpt*FJZsZfj%X4h8H(WYFuBMZ{e1Z# zpP2xz3y1>AWG62C=xXKhZrM4I zB0txIiy$>gj&2}Fvq-|awehrD!ARL8QYqB`XYw|O*T!-d$)ohiRxeX#O06C|r?}q| z=j@vVMl$lthpR>x!ruuv_Mmh1lWU6J!mP#2-t?H|qBajMAad@)!9*w4PMIbNz=7Tj zKU5&ppgh8Cv8)o>2^WZMnB~FF1q7C2pa^X|n0o+4Az%fiW?36qSf|2wP_y0}*(f|J zAnOs(tT zi?bQ@LT@_)Es3hJnZM~3Q9R|E-9jVD|cCS;8F zGD#@wHarJ1&GnW9$d-Ngw*aB{SC9>DoN{p73}2~C7-IaFGiTXUgnIBX$S>y?T<;9T zAx{#~Q&@oskSRO7Cx8Q3PE9d8POwQ+#?YcDhsV%FXZ{d!(ntPCI;@gbP=|VMoqK^? z$OAyN9dJN9U}YTO9gKJBWCK_m8jnXh^_3Kwccb#%^}inJUXYPrDXdUG4slsIXViEP zQsB_|d+~76x%%@FPVu+Ss>xJ{VME7T6j3hR2D zT*AKZKbGH% z*f+g*=>=J=LpP6R8$J(cxR;ve2q@&dI zWBKi5JcpiM1+$!|w<>ti)1}dC~)~Lf#>k)?p=ygBW|guegP^sJiPP2 zQ0d|7E>ui{UY(+Y4y13NL#*r-Dme95ksBCu^DizYtGlK%nxWK>EF>I@4_V|UfmRJ6oIMYK zH-dBpD&pr>`rJz8tY>aNtF#>$cuNL{Q$xl%D8Vhy=rOC;qB2^e02>6`X{}-r{atRW zh=3`)+&Vb=;>k;ulGR#*Fj#Wgtr=v>c$>%!H|uSVFy$h{6kaGAsqd$Q`dR|B%~4?U zp37E%d>6a1XDsV{Z9m$xy5?_e&l8d1Z*0#9Bex@W2S)y%HtzMEY5IS-aUpG-qj`9i z*kAR`dFHCTn{jbI^{Q+6o4(e`49#G7hdFY-XJU2TS(~_E7fqmvC)qQ$=H%>!1j4eq zh)-^(lmLyICqc5rsCgm+d(&&EQ`M+pjI~upVQak;^pr`D>szLO6T89^|_WF*2XQ zDdn9A>%Q?5v2Q%*Z|;*^&K_)@($eIVt@AzXtLy>;UFRgHe5N&dk93YY-|<#rm~x#X zoo8IFXH>|AC&#(4Hsk_hjA@4|k`FiFIkX5LE)hN~tanN725WqTtZ_04*WZPTXvIGY z7{=897ODRUsDE}J^~bm_^`COaPPg?RcQ&4D>p$*nyHe{9v3R}}3kd-5 z0t=9U+Jvi6w_(;>K4p}5hszBI{zlZtdo^m4j}x!E148X=y+eB<+I zdLVH9FCfs4!TT!4_WDbI)pdc$n*VHQX1QSl4T!_yF7_7}mMY%0IHV4{$GZZASR3|4 zl!K$emR?&Hm><|gxUQx{8SQkK@4IT5J&t!|SeN5b#xj@Q!Agl%V*RJNbhZKkfTZ0snI1cjf%bb~&>?gm%-5>htLEVk>q} zU4xWvb$as>2Z?0gq`PB<vKP-9AkY@1DqkrABcDSojPqlDnD)_ zws8aVX-J{Hy&KXl6)jA?3+a*Qi>ORIH+DE4Y$CWHy6%yHFCm$tC0;6l1EU0kR3^mG6JlVpF9UU_WW8ZB+_1aWmG0u9bJu7uCY>8mf%`b;a|dPLXLo&e zsdGVL>Q#W(@%7~k8XtyabgJ z??3qTo~5~qFqi3)_Q_)IHU?zQ_cH!hfxWb5Fs)x+E6@68Kwnf=sW*pL4fO?4W&hWR zTj|tR1vJ227-4455}b5w<08hmcE${3V18kitbKKrv-!EsQdX7sb({%%tV-S_(5{@l zPdx#U1g@C@U+}gGZ|-SVZo?J$=$~s5#(gaAX(hrCn$_zU5_q=|Ko#grC6QTj12%)p z?;-3hCwT=a=B;z7+BnQv+>L)4|DlXorkfFwc{>vYw_qh%lyMe*5tnM#Rxl&($tAp) znMo8g(Oj@JXpbWjdEg9)%#X4^4v`2Z&zOK9oxc8HL&^$TeKT zU{BI5)W#GH_YT0goX12#L z-Dybo?Z_;;0vR&1%3a)NjqhLc*3f9$v`LHcQ*fi5Cf}%I33-H@o}7b(uEe~XIAc|! z3@_)5TvSM+Ca_UmwFGF!d@aK?Dg4yB64%qina<#;7aJj=TpaX8dwB-&bA0U;AN;B` zwk^Pi%1_-TfqD(@AR5DM&xx6Lb1iCaQ%0Z(>g2$cpo)vXk8=H#hp;8LYe;1lOSRSTd!;`Fbw zV|ZsHvG;W_{lY3{~O2yb%#1Hg)J+u{x<>hP7oPM zg}#V{vkCdqqVqMO=38d-B}Ef8zJ=WW9r!`}6K51Go=j(g7iY+k>rt3qD<^OqCE?wS z>YIx+D33nMDzL0E^IGacw>-Uw2gHb?@tlV zmDuI3{{zI1PbOCm)>5LjZ}KM4qxAM4_9gP^=e&mor!s+_y(uB|!jI_+PJI=}o;2AC z9Ax=tT5b5WP04#FL%>1#dJxZ*k$%-J18L6`cPKVaBKFdDT$iKj?_z4dtFT2Mm(8dL zVI*B&4GW-{zWi4hJY=-d!Lc@$t{)S|Brg9QiX^Mu02U?X1bmNQQ(@(5gW`?6R1HtGc0~53o5z+O4-e$)vJ20t>TI|3R#dD`t zs#u3$2xaeksQ1Cb54y1`hs~Z)285pdL-21B|JLB&k@$y;)8%Wvl)4k}52L5tuzUU@ zPgGk@uFT+h2L7Fcf6u}{_|z)Tn1whq=s1VrAJNl*heO?=@mo6yef^|zp|)kHP}?|M zs2x30s2w$0s2#qnP&;≈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 z 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 z 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�t_R;43dl>A7nF3z7lF}l8fZn)<{dz5g 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%0D-;*RR!xW-&#K4Yn9 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�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 literal 0 HcmV?d00001 diff --git a/JY.Inspection/Lib/MetroFramework.Design.dll b/JY.Inspection/Lib/MetroFramework.Design.dll new file mode 100644 index 0000000000000000000000000000000000000000..fe69d7d18d78370c3e803910beb22e7566caa120 GIT binary patch literal 16896 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 azJGq+V-Iv$zY88&^d9T+&*|S25Bwj#Qcr3C literal 0 HcmV?d00001 diff --git a/JY.Inspection/Lib/MetroFramework.Fonts.dll b/JY.Inspection/Lib/MetroFramework.Fonts.dll new file mode 100644 index 0000000000000000000000000000000000000000..324ee0f346295ec73c7de25cff2554ace68e8115 GIT binary patch literal 672256 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

cBm$fCo!TBcI-8gH||=Rj4DI3iu5c^ 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

G5w#f$$!k%)rsRV-ndK8oOc970kxW7mBf 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�bc@HQx!b5dn(kRV!%aX$>?P&Q_vj6jLwtzV5 zPC^Lw(h?ZS$cnbTE!UhVfP;ewI2&T*@NiQH(zrx+NZck(Qaz)T00q4ewl_CC=u-50Dk%D2if~umjG#i!$?lFOj#%!6TDFs!e|GZ7Inp5EYSxU3 zBEG!M8qEl3;exHY??P$krQUD#+~A#6Z@X;m`nM&~#W$~ybSC$kQ+98@(UT{g^FU`$fjM`Pxkg3EFStuzASQBusE?+C3v>dJHjsE*MX1GNZ|+0$*1JSLRc*+h zd)|4~IwCCpzn$Ow`vZ4|U;c~Cwg2=`^U}|339r;WYcyV)R*kBHCD*;vAIdM(`u^X` zRm5x8S0wM$u1+6b?_2+N(vNvk-B~A#>X;xt!hGw^fp#HUctte*#%Kw{Lf>5(|+j8f6QdQ+ZEP*{=Rkp?v78cx@q$ZFAQw`tFQbb7 z;c5m>2aX4qoTq(G-toS-pPSY!Sg6-MYxUu4ym;|@)~;Wi#M!m$iu5)$YA#${b|DupSkf?y$II{CTCt) zunDhJ1|PWY3T`A5AUY?y<8uOeE6pY%nF+Uvi(2-hsV zh27E32i<4SZPk%=S8Aogf=$O?n6J-#_od@!x-X1tK6qwD?#$Q2t$!Ac=|krYfAiDZ zH_Y!elU-u+-3#v44n~?;_REX&FI^ZdcvmhEX?o9p*=6ti@cPRt&b@H$`g8vm3jbyP zyI$*(&aVF_Rp3E!rM_CMQiIQobG{_vUJyPmo|pP8Qj)?%&k`1Py5 zI&WsR-TBO(C(e9mp<9vGfi0-hm!#(^#?Jctn+vX1DbEcqzpmn~6H}wi zhu23H(z$>6FjNia?7E}y-I=@I_*L|y`CVtesVU^H*&pk!_vx-R+%-qb{FLgxSW)Ds z>A$<~eYx!WG>aT8$VN%^Men(JeXMO_yzST8^_M1@^KM?RuUX$}r;efj^-Ozx#Nh={ zmA^fJR3GEMqcVJJp50A2S+IEizR!N}Bb)y7f4|_u{J||Fua}SZ|7_ctOCQ<(=;N(V zeC)Qz!+(0?xl14UJq69Ob$9&T(bvQCpEz?OT>8>8k3M_TS8llf#ZBht-FncBo_qFG zHJ{F?iebaFP)&#t%Lw7E*v92d)e zm1k$I)&AZQMprKM`=U!O@oT~Sl~HC*{}=!ArcZsoZ((C`+pQ1(@txXZ@zxodr*QW1Y^sYtq zcb++w(aMS2GOx|QmZ_Vs3!mwo|B3jh)EBAxl34v?ZE-K{{nKzYz52^_*5nK4+@SP3 z&ZY+*OJ{;MU7y$clneD%T?!Ik_IuG)SH0&wi!O_TgHv{N6J@{Qo?C405~J(H(v}-}E~|8oWS9Mj9jpl^PyLHXu=V>%{_8Ogl_4M!L zqnWeJTCatB^NO3#jGevWyf@2Q{*A6!cV7OtSG1gYb40h`t=inKKF&8Bk-kT8Zg}gp zW)-$ytU@+%hA(*Bg5~`3$DqmbR?HwSB~#KHx8H~`u)E9o8HKr>))Q`{Qr%O|6hLdyZJt$vM%tL+2!zvIQq-8wLJeVc3#q4 zcEB~}St?R!4eu1h_2kZqO;>w4)@)7Ju!N;=CLz6cVfnMv#)^V{R#-?%QB6WD)?eG>bp*gxm` zUt+%w{%2DD8T@a?=xx3}im@-iz7U)Ei7H8X2PwY?=D>H6{%-I+u4!~R_It6fzrL<|Z!{x*f$RYK)@Bfm>6ouNV#st*CKeMU4ZOJPxd=ap3aDffY3ltf+Bd zMU4Y1YOEEdMk{I@SW)A^iW&!2)HtxB#(@rLPJT67QRBdh8V6R?IIyC|ffY3l zc7ayZIIyC|ffY3l9IJ8QwiX9g)HtxB#(@qgU`34s zD{35AQRBdh8V6R?Sm!(X4p!7Su%gC+TX7s%QRBdh8V6R?IIyC|ffY3l+^*xmiW&!2 z)HtxB#(@qgU`35lRQ2_+t*CKmMU7F^IJBb1p%pa_t*CKmMU6u%Y8+ZoWH4d$) zacD)2Ln~?=T2bTBiW-Mj)HuY;C~6#9QR5I_pr~v7*K(YMim6#u+PWoUx+D87pd>v7*KqD{7pvqQ)63 zYMl9RMiezhQRB#p8b?;tII^O~C~6#8QRB#p8b?;tII^O~krg$Ltf(=H8b?;tII^O~ zkrg$Ltf+BhMU5jXY8+Wn%=I1E0?9kzoz zz@1=;`yAn#ac}~h1b+(t9Q-Btx-q;6tN<&)OTk4hZJ2;p`TpS&uohej)`Jb8J#}$t zPhA{Rukc3hvq^ruINS`jaknj8vz7loh`kN$;yydLro?}r!+r_-ufT7U@?GxsN_m6s zY<<2s{9FF}3+{8aUbEP5fM<-E0Q3{;;>_K?K69^g%zPUAi@satOW0rGns%_0ly2~= z;Mc&1z;8PD%r5Nz9sCdA0n!g*`?+&*=0AepA^p3ge~%nrCY`!uMzFsRz6$;)uJLo^ z;><@u!!JENbz+1s}U=h3n zTo1N_9|vJCg1zVu%whD0;3vWR!9M~wgAY)iHgGHWh{{tD~L$}Rr=(d>+-8QqK+h&%wnWb%JX`9*5Z8J;T)VmPw>9&~--8QqK+h#U& z+suY;o7vE9GaI^XW<$5lZ0NR`4c#`g@|08DHnXAQIZNBj(l)c9+h$h2^ObI!+0bn> z8#;Qkw9RbBZ8J;T%+fZqw9RbBZ8J;T%x2s+vl+L|Y{qRfn{nIBX52Qj8Mn=B#%(jJ z2vK=xo7s%pW;WxtnN_qn-EA|Qaofz&HnSPG&1}YPGn;YS%x2s+vl;3_+stO%HnSPG z&1}YPGn;YS%+fZq8Mn=B#%(j3aofyhs2y!HOWVxSHnX(NENwGO+sx87vyt0oHgem{ zMsAzg$Zazlxou`6x6N$iwwaCGHnWl2W;Sx$%tmgT*~o1(OWVxSHnX(NY~;3?jodb~ zk=tfAa@)*CZkyT2Z8ICWZD!R{+BBDb4j6-pu3V&6W7G_!(9yL>ZO7=gvq-IGpRfS> ziMB|s#{caD`@sQl5F7%BLAQ=YY8}3Q9Gn0rLHBtUsdX6L=UJrIAyn%yR)Ce@rJ!4f z&Wr;aT^=HT5s|-0k?&v4lKuvG#z+J%%ADt4W!zs{q&U=-@`!OQcr$nlcq_OLEP{7{ z>%ms={bKQXSg0>`g#~aW=}p+HK=+~-YdmG_ z1l>XxYdmFik9x5*$9EXP9tFpYQV-o<{1_X3jrcK=SGW?JT*B4Z&HU;q>{;*)@QhKs z8P9k5GZ%s%^Y!XO8ZQU00IviWgVkUScr|zpSO;DUE(5j3UiWDOwbD=aBPzLe7S(?f zVp419upNyFQI`;PiL}}&j=DrzZFJNn(rTmQEg{|#sj+RxTOu_!I^GiEEg{|#;w>TG zlF;#%NR5q-D6KLx5-kbQlBoSU#nFWrhJny9EI zDylV_aEha%TH^?#qoP`42cx5+TH^(yqoP`41f!#(TB@a7h>B{pCfkmRR6X!7s3-3J zPmS0!dVjSVIIMx68u+P!pBnh7fu9=qsezdqn5lu88fsdjy6A4Ii_vwdp)NJlrG~oH zP?s9&QbS#8s7noXsi7`4)TM^H)KHgNBDt1Gt|gLd(bZZaxt2(-C6a52V5eR+rb^+PO!v%+}`V8sScLvV5tt4>R_o3mg-=s z4wmX*sScLvV5v?mMfXulF<#~StM_HB1($;LU<265mCIcQwI-t#qfV{H_y%~!s8*x@ z>KP=)^b9gu4eHbv(*5yB9UiH}BXxMB4v*B~kvcq5hezu0NF5%j!y|QPJ)*vW@Ae1a zAA+9*?+5<~+zdY8@~D*=w}OwTJoTuPwtbP>*VD4p4L}S z>#L{r)zkXwX?^vyzIxQDo;Fxd8?2`d)}v1Ks8c=aRF68 zdeo^Nb*e|5>QSe9)TthIs;5QQ)1vEX(eb^{MS9<1r=aRV){FqZzJLBcx72uWNVz3&l0j~zH0qekP!DYe*yx)NL z8}NPu-fzJB4S2tSdNttv25Q%U_Z#qj1Kw}I`we)%0q-~9{RX_>fcG2legocb!21n& zzX9(z;Qa;|Xn=tR7-+!z4S2r+?>FH62E5;Z_Z#qj1Kw}I`we)%0q-~9{RX_>fcG2l zegocb!21n&zX9(z;Qa=?-+=cU@O}f{Z@~L`@z$l;_6oI{yx6ntXH#Arwh65#d9*Q) zHs;aBywZHl2c-si&Bpu68^JZ;P2fl5mwezcLSD1+zQ!Ykyk_HVd%Td>Y`k-HB;*74 zI`aAk(CEHLKG*<$oU(bYJ}*xhJ3-IY=jAD*=j!ulavn|2qse(RIgcji(d0auoY#E5 zuYa2IKLb7sJ_kMzz5sf>me+i~aW}XJ+zajpJ$B1$KHvB)@FnmN=y7OX^ZCZ_fF8}| zgYQv0&+6wjt8XSpvA>T!hW#qGpAmV@?fXiPMDm*9x9$F6Ui196-Al}Cw%_(^;7>rm zzsqa3-{@J~yk`52Cqefr^P2N_iu;y%&HUT;h$gT3f7`EP{~CMNB@fR9&j;TQdeoB- zFZMM&oAO~6+da~JcnP-qrTOqO?1lWQ3VgR?KyL?(emjuo?Lb~{2b`DNdp>k~&xdaB z`Oxh>ueSq6Kcn+ulOrVjeegQa?+EgGM<7=9j=<=rTV8JpobFlKd^ktSyfKsUuQCz1 z0CdkPPtPi^nRex+_Nd=#rd@aA37FS>yHhs$ziOwlH9M{Us}l_1RetaiX6WUeh2(6I6|2ZbB*U;Z#D)tes`~mhj_7AZquz!R-iTz{j*TA2E$G~auICug)3I3E{{S5p$_zUot;IF{f z!C!+Ohpv!j8qWvc4qgO0hF3^4{a;7&3iax3UxIxp_GQ=$v8zBw<_c-1(XqEeI%#z5 zt&mO{i9PA0?PfD0J@oyFE9s%ri7V-$Y{kE#RPk@TgOrc?S5iFvN{Z)e?!n$@TdhO? zmE!5YY9qGai+u(5`>?OXUJSY~u|ho-UzuXpV0#8{g<6o)mtbFmU5j0Z?b+iM>d*KZ z&#SCZuf}!*w#PCn^ghn$G1>~fk278eegLHI8m+kGH<7Xy`@`5bW4B=6f=&C9;`u(b zFDagF+Lsj1HY`c;Y_I26?!Bzg=*GFY_p(A`9NTwc!=V(<>1R3o1pnOxYW=U$KLvgo z{9|DO^(deo1^Q+M)T4lU6x28KHCB%T>QO*F3aCdxy|QVg+sg&-^eD7?6i|>#;>XjL-9tG5+fO-_9sQZ*+^(d&{Wwd$})bH|@R*!=ET}G=%LH#bH)uW(( zm(l7`P`}G)^(bf^h0*F!&^ijE)uW(w6h^B@LH#bH)uW(w6h^B@LF*`tR*wSeQ9wNk zT1Vj&t4BfoE~C|>pmh{Rt4BdSE?;ByD4-q%)T5wv6i&B#6x8FgJ&tYlD5%HfbgM@} zJucf;kAiw!Myp3b>nn^_kAiw!Myp3bJuaiwqo5v_(dto9kIQKFD5%F}w0ab@?!svG zD4-q%)T0nuJqnr!Fj_qds7C?yD4-q%)T0nuJqqe^`5LQ7A+&lFLaRps^(deo1=OQ} zdK6HP0_ssfJqoBt0re=L9tG5+fO-^Aj{@pZKs^emM?ud}af^BsP>%xYQBZ$LxuYHh z)T4lU6i|%xYQ9wNks7C?yD4-q%^_P4Ht49I#D4-q%)T5yOlGCjo1=OPu zSv?Ao)uW(Q0Yk`c#B#u_V`p<2nPVI|{*m5dZtGDD?vWu1$n(Re9nEm}#>c_p((E9rBt zq_??}S)-NoGgpc+T}j_^CB4d(^e0z}8K=7sxsu*vleDo*E5kf)Z9*HHq>Z*+>n3X5 zM6H{sb(6GlSm`%_UJ1}7Z8Z9c&?IdHb zYE4o|qgSalNg<71rPjnMwI+=~eV^Y4-Ro$QW{N{;rteI=F#>IpW;*32-&vZeYowXR zJA5~3rft7JZK9<#Ni%JGU1gIrQ~#A_Dn*)U`@Ps6J2y!)oqi?uVlW}48au_V!M+On zYV0N0*I?IT*I_Tkz82eS5}Kr$&ZPmn5nK)yz$WlI@B<)qr=>SZGku4(W=5K6`)2GG z>|3yJ1!;FEKvP7!LkF6qnf{f>m`&15+wPY(Ni%I*8JeV-wrQ2pOxqq~Hc2yWpXJbN zQ=6ojMz5r5l4csclB!9Xc{o@l^*AMT&uW#_!`J}2pRR`IM^#j|D=PnlIbUsmyCS;aGD6;G2@JV#dX1o?f|gMCnMKu&2-tJs)154=El zJ?YnzemygC*E1t`Ju`CGGb4AsbkA3M{_6TL4>mbP@o&5ioFjeS$o;R+aDT?{H|Xn! zn&1YlDivnV11}J+A@?=pzJ}b_koy{PUqkL|$bAjDuOas}YJI1IHRQgA+}AL-vnF)z zYsh^KxvwGj4=MLA=!>-2sN9Vg2-lMPT5?~@uh#Ob7W&dHfuCP3dR`dab8ex}+(MtW zh5l*_{nZxwt1a|bTj;O0&|ht#zuH27wT1p_3;op=`l~JUHd{2a=R3QH*+Sp4g}!AA zeaja5mM!!xTj*Q1(6?-%Z`mTP)32m*Mvos`q-;jYOz*3O-cAd>ofdjKE%bI;=NX?QERnIr+Wm{Lhq%8eoG5ImKORdE%Z`80-qm&&yT?8N8s~T z(r+dGR?=@J{Wj9|J(Rq88{WSS@85>^Z^Qey;r-k2{%v^wHoSiu-oFj+--h>Z!~3^! z|J%;qAMdXtmv!W_j$GD}%Q|vdM=tBgWgWS!BbRmLvW{HVk;^)ASw}AG$YmY5tRt7A zV(hk{s2DT4_gEx~ih-l3NE8(rkrj!hBC%8?mWqszij0qnjE{io{!ycq>V37zc z5`je`ut)?JiNGS`nj#~bB4e2%qnIL*StK%xL}ro5EHb7jGNvdJrA4(zF{butw89sO z+ae={B4dOiqk|$Nf?|~V8b$#{`u|0G{zdxyMSA;1J+pj``}sv8zewa4iTomwUnKI2 zM1GOTFB17hBELxF7m55LkzXY8i$s2r$S)H4MI!$W^z9Dx?GE(q4%Mh8SWi@}Cn~gy zy7~a?)ps>|R&YIaU$0()Qea@c`Ud-gJNea}{OV4Abtk{NlV9D*ukPemck-({`Bf|N z)=Ip!5^t?US}T#(N~E5;LvD zOe-2hb%(N0St;9?#vC&Fwv=SSw#6~Oe(2Dn4@m(vvYsGi1_^uV- zwc@*0eAkNaTJc>gzH7yIt@y4L-?ieqR(#ir?^^L)E56$R+ddOniUZqPF()rV1D-nq^V|W?9q`-%&mHjG0nZ)q+yT!W@Z15<9q`-% z&mHjG0nZ)q+yT!W@Z15<9q`-%&mHjG0nZ)q+yT!W@T^VmU2=HtfaeZ)?tteGc=MH%8faeZ)?tteGc=MH%8faeZ)?x5$~0nZ)q+yT!W@Z15<9q`-{ zndc68?u6$~c1+zrp&@Z1g0-SFHE&)x9c4bR>1 z+zrp&@Z1g0-SFHE&)x9c4bR>1+zrp&@Z1g0-SFHE&)x9c4bR>1+zrp&@Z1g0-SFHE z&)x9c4bR>1+zrp&@Z1g0-SFHE&)x9c4bR>1+zrp&@Z1g0-SFHE&)x9c1J6D1+yl=& z@Z1B>J@DKE&pq(m1J6D1+yl=&@Z1B>J@DKE&pq(m1J6D1+yl=&@Z1B>J@DKE&pq(m z1J6D1+yl=&@Z1B>J@DKE&pq(m1J6D1+yl=&@Z1B>J@DKE&pq(m1J6D1+yl=&@Z1B> zJ@DKE&pq(m1J6D1+yl=&@Z1B>J@DKE&pq(m1J6D1+yl=&@cdO)miEGMFAVp>Z7gVRLmIN+kcEcy}@YWA+{qWWgZ~gGr4{!bO)(>y}@YWA+ z{qWWgZ~gGr4{!bO)(>y}@YWA+{qWWgZ~gGr4{!bO)(>y}@YWA+{qWWgZ~gGr4{!bO z)(>y}@YWA+{qWWgZ~gGr4{!bO)(>y}@YWA+{qWWgZ~gGr4{!bO)(>y}@YWA+1MoHg zZv*f)0B-~EHUMt}@HPN%1MoHgZv*f)0B-~EHUMt}@HPN%1MoHgZv*f)0B-~EHUMt} z@HPN%1MoHgZv*f)0B-~EHUMt}@HPN%1MoHgZv*f)0B-~EHUMt}@HPN%1MoHgZv*f) z0B-~EHUMt}@HPN%1MoHgZv*f)0B?ivHVAKn@HPlt4a3_oybZ(KFuV=J+c3Nh!`m>t4a3_oybZ(KFuV=J z+c3Nh!`m>t4a3_oybZ(KFuV=J+c3Nh!`m>t4a3_oybZ(KFuV=J+c3Nh!`m>t4a3_o zybZ(Klj3bUcv8F>7m1T6#fh;4>;${OZmS%XhxU<=igc8C}lp z@|w}*+%B&PDd%>|xt(%ur<~g<=XT1uT|Dbb%DJ6#ZWqr^aXGh(XQRuxopNrcoZBhq z4$8TMa_*p=MKubgL3YmoI5Dz4$8TMa_*p< zJ1FN4%DIDb?x37IDCZ8!xr1`=T6GGlXC8)oI5G!PRhBHa_*#@J1OT*%DIzr z?xdVMDd$egxs!74q?|h`=T6GGlXC8)oI5G!PRhBHa_*#@J1OT*%DIzr?xdVMDQ8LL z)R8i^8XBuatTNR%|6 z>~yb@C}~#Nw%16MSR+wljYLUrQk;v|NR-5k(Q711V#eq-5+yNX?B&Wnupb-%2f-n5 z81x#6Qs6ZbCA}pvdW}R$Z%K?^BT>>@5~J5hlr+C>^csm0Ya~jV-?r^F5+%)V8@)!N z#2SebYa~jnktnf7qQn}B5^E$%tdS_mk1n&A4l22`WjYNr2RY^1Cw!KE8 zq?vxzTGRN`co%lvpECVsuv0 zI~S+?68shTI_NbLC3f#Ag)<~3CBT)*yMxqpYjYKK*8i^8XBucE2DCrHF%A+@E zMz4`5u|}fA8i^9)#}aEKO01D6sa@zAwF{%yNR-q%YdyPa%ZOyjVNR-s#Y!ss;;rO0a}N{p0Ck=IC+ z7%!JtBT-`1T#CF#qQuy_#MrqM(e4;Qmm=C7=SY8^^yf)`p7iHQ-$nW^(s%K0dKd4e zckym|7w@Kb@ost-@1}S0Zh9B*rg!mfdKd4eckym|7w@KbasORs@6WsG-Q=>HTy~So zZgSa8F1yKPH@WO4m)+#Dn_PC2%WiVnO)k61WjDF(CYRmhvWHyukjox&*+VXS$Yl?? z>>-yu;^7T=tU7UUJz>E_=ykFS+a`m%Ze&mt6Le z%U*KXOD=oKWiPqxC6~SAvX@-;lFN(a@*=ssNG>mu%ZudlBDuUsE-#YHi{$bmxx7d& zFOtiP?fD~=S0dhG&E(gfv0J$6>mjmQ-fLsoc%K>sZKrRQ!kuq93+>6ygXD6MTn>`UL2`LXxlC(! ztJtXj8ZQtYBKJe&eu&%;k^3QXKSb__$o&wxA0qcddwBZiG4K z5$2pnm~$Rs&Uu76=MmHz*^?rXnLhopVe$fa$q7iyHBlK-X=+%rc^E^V2WrV)U z2)&dM`X?hAOR78?OB((DdL;Dw>k*A5jW;?MjTxQp_tzsDGYU0k)PKdEekJyd?oo{J zL>}Q;Ji=3Wgy-)F&)*TAydykwM|j$f@SGjt2|L2Gb%dwtNaXj|Baz=l;eQnVN8x`I{zu_|6#hrye-!>l;eQnVN8x`I{zu_| z6#hrye-!>l;eQnVN8x`I{zu_|6#hrye-!>l;eQnVN8x`I{zu_|6#hrye-!>l;eQnV zN8x`I{zu_|6#hrye-!>l;eQnVN8x`I{zu_|6#hrye-!>l;eQnVN8x`I{zu_|6#hry ze-!>l;s5*a|9$xXKKy?l{>R{d4F1R9e+>S|;C~GM$KZbq{>R{d4F1R9e+>S|;C~GM z$KZbq{>R{d4F1R9e+>S|;C~GM$KZbq{>R{d4F1R9e+>S|;C~GM$KZbq{>R{d4F1R9 ze+>S|;C~GM$KZbq{>R{d4F1R9e+>S|;C~GM$KZbq{>R{d4F1R9e+>S|;C~GM$KZbq z{>R{d4F1R9e+>R#h5uLK|5f;Z750hdIVOF!0HiLJp!vo z;PVK49)Zsz@OcD2kHF^<_&friN8s}ad>(<%Bk*|y#*Ve>T)NY*GjZ?dEYBx^p#;M&nwHv2) z>O;EcDYBxdcCaB#6wVR-J6Vz^k+D%Zq32HY%?Ix(*1ht!> zb`#WYg4#_`y9sJHLG31}-2}Cppmr0~Zi3oPP`e3gH$m+tsNDp$o1k_R)NX>>O;EcD zYBx#kCaK*dwVR}NlhkgK+D%fsNoqGq?Ix++B(6_8-1dmGPYKOe_@F;V? zM>ShwdlVcqO0RT(>6Ov%QjbcnjO4{g@F*j}qoLoW9@R+Dzw*1(qs;vtW$yQA=y!rg zrDI0-wT{x0Ihygi)T0_F8vQQysK$xLD?z_YJsSC);8BhDjeaM1RAYRj-=!YaxZdb@ zf=8uey1#VH=y$0{nfrZ>Ue;^$vR>0^9ghUBsekp1@H*`4^|ioj!CJ5dyal|6|NaL1 z@3r#$HTq+((G#1(7gP9R3SUg&iz$3Dg)gS?#T34n!WUEcVhUeO;fpDJF@-Ot@Wm9q zn8FuR_+m=4Rnx%~zL>%nQ}|*EUrgbPDSR=7FQ)Lt6uy|k7gP9R3SUg&iz$3Dg)gS? z#T34n!WUEcVhUeO;fpEF!>A1SVhUeO;fpDJF@-Ot@Wm9qn8FuR_+koQOyP_F#HxT} zJXwzMWI0Cf`WU_IWAv_%(YroI@A??M>tpn;kI}n6M(_Fm+%dB(Ia?b&|YJlGjP{I!Rt9$?G@d@*8sb4gdWO|2>VW zpGMVBqw1$o_0y>OX;l3*s(u<(KaHxNM%7QF>Zeil)2RAsRQ)unei~IjjjEqU)lZ}9 zr&0COsQPJC{WPk68dX1ys-H&HPowImQT5ZP`e{`CG^&0YRX>fYpGMVBqw1$o_0y>O zjOOsCgPFi%pP66{=r1^CSOGr63h)_LfX}c3e1;X^GpqogVFmaME5K)10Y1YD@EKNs z&#(e~h85s5tN@>31^5grz-L$iKEn#|8CHPLumXIB72q?h0G|m?P?D3z&~MOYLcc+q z2`>Tt-O3Crz-L$iKEn#|8CHPLL31^A3+Q=Q`PR%TcMJ`=TIQ|suX z*#2&1h85s5k-xW{iTs`Z3@gBASOGo@Z?o_=3vaWmoS%iaS$La;w^?|bg|}IFn}xSo zc$h=44Z)mRnK99C=V)1Tw5&N=)|{SYPWQ8ZPER!3_U4?PWru}+2Q){!o1@*$(eCDG zcXPD6IojPEyXwuctKOXUH1^$gg5Fhcj#fEGtDK`%&e1C8Xq9uc$~ju)9IbMWRyjwj zoTF9F(JJTkWK?Jtd8A zfM<+)O6tGTB5@@xGJ57=j$QTUP=GlUU=9VCLjmScfH@Rk4h5J)0p?JEITTZ}AAy^}2V5RKRgGK0M^v79d^(R$=ke)0KAp#>^Z0ZgpU&gc zd3-vLPv`OJJU*Srr}Ox99-q$R(|LS4k5A|E={!E2$EWl7bYA_I!zzhqistd@JU*Sr zr}Ox99-q$R(|LS4k5A|E={!E2$EWl7bRM71h;O z8i@!s5)o=7BGgDksF8^9?`?Y|BGmVHI*e6uB9xvBrGY|y%_OV`6(_P4Cqn7DPReclxr2!6&)Hc2Ih*bm_TJZC|LiFVs79q28Vg_1;{l z_uxY95+KyOZ{h1k$B9sTPzWo*OF`+mQmBjLMD`L;dM;aSUno5nO3#JTbD{KHC_NWS z&xO)+q4Zp+wjYL$6QT56C_NWS&xKOpFm#*<*Mj=;UG^>Dt>8Ma2;Ko|G@)zs##X3z zwLY}?$ZbE2@M+|>FWWwi-1dd`Y2>yqv`-^^8sXCjpGNpJ za@*H`?b8UKM))+srx8Al@M(lkBYb+ke0oa9ENUDYp0Cmx^|m^^D9}48q25Ue&C*5k z>|vp1b%dH}5o%UPs97DMW_5&`)e&k|N7xB!R!4R>*aK>%w^B5#BOC?CjPixt0SBR-vBkM6J8|#jhfXF>fM=8vpV5Lo=FgDR!68= z9ie7*gqleZR)d<=k*!%Bp=Nc2b)aT-WNTJOs97DMW_5&`)e%0Tl2^c61-$9}UR~)k zL7Z;hD&VaG-YVd&0^Ta%tpeUE;H|3tpeUE;LYcl91bhttrFfU;jI$hD&egX-YVg(65cA| ztrFfU;jI$hD&egX-YVg(65cA|trFfU;jI$hD&egX-YVg(65cA|trFfU;jI$hD&egX z-YVg(65cA|trFfU;jI$hD&egX-YVg(65cA|trFfU;jI$hD&egX-YVg(65cA|trFfU z;jI$hF7-@ExR59KLZ09Yy<>n_kAmL-p9Y@+p9P--p9fz6 zzX|RFcY}Mtz2JWE0C*7m7Wfi)2s{jaAAA-30r*4kN8pda*TA2E$G~auIH<9|%C9l3 z@MqNM7vQhJUmL@V{ogPPUIJbQ!i;we(0}2C9?L>{EDOD3K)BE&-*BOK3=qB-d>@#A zDd?We!e|Lt3u>1zrMPdiP%F5Me)=!;*jZQrHRm8(tJj1d04Yy&6ZVHe%{l15_$b0h z9y=?=+O;sc6V#l8?7KjhwhHf8;r%MSUxoLp0(-v-?^ogdD!gBX_p3Y?q5s9ngwot2dgj&-gblh^zk6UAFdM z7itf7q4r=G?gDp%+Jjvw+JjxFJ=lfXgI%aS*oEH$wFkRw?ZGb89_+$zgW7{#w)S8b zevgu94|dtwgIzd^{eA2)Z0*6W^dnrUJ=kTBWB(9)0$Y2qD}56C$Jp9~T`AgwU8p_S zh0~z+V3(~u*oE4IUFb3FBDDqEKgZS{?6QA}tv%RfzmEND>{*vQJQqA4d^>oNuTk64 z^^B4hsRh}tBwc&3%f1v_d$7x1$giqEt(sPf)<_Gr2fI*bUJJE)R;bmpLam+^YW1v8 zt7nDp2lL!hd$21-d$0?&2fI*vunUP#wOMhW}HSYU#QgW3feQ?@rn1|EixRTWw$eRd3C<_Fxxk4|bvUU>9l+cHv@B zd$7x{#?~I}vb6`hP_Y9qF4P|ELhZpW z)E?|Y?ZGb89_&Kx!7kJu?7|O%A9CHLAx>F~tv%Rf-;Aw2*k#{>eJe;SW^}no3giD4 zN!K3ivhTo#CB~bJq&ZHfElYW9f1GQy2fJ*~DlC!;**?qRCtz|DcpvyF@YCQQgP-A7 z+Jik@tS6UIJGq66rN&0>bfoC9rX^@vf~F;CT7sr=PL}@br*ML%C1_fLrX^@vf~F;U z0=DTI$4r8zC1_fLrX_kBI^CL<=$UBSnwA9Cv;<8{(6j_iOVG3gO-st!W9GmY`{gp2$wIrX^@vf~F;C zTB0Yie`QTe(6j_iOVG3gO-s6bmZE7XnwFwzDVmm|X(^hPqG>6bmZE7XnwFwzDVmm|X(^hPqG>6bmZE7XnwFwz zDVmm|X(_X~DVmlti<_cpDYLjKnwFwzDVmm|X(^hPqG>6bmZE7XnwFwzDVmm|X(^hP zqG>6bmZE7XnwFwzDVmm|X(^hPqG>6bmZE7XnwFwzDVmm|X(^hPqG>6bmZE7XnwFwz zDVmm|X(^hPqG>6bmZE7XnwFwzDVmm|X(^hPqG>6bmeNm4(X^C)T8gHn^wUx_Ek)B( zG%ZEbQZy}P9y>+TQu=8rnwFwzDVmm|X(^hPqG>6bmZE7XnwFwzDVmm|X(^hPqG>6b zmZE7XnwFwzDVmm|X(^hPqG>6bmZE7X{j?NKOVP9xO-s?V6irLfv=mKC(X8GV=T8gHnXj+P< zrIGt-DVmm|X(^hP(oaj#v=mKC(Xu=dzpuYZ=-2>|DZ`u0#Td1$U z!>bf6LU~;Gk;jc6bBcUwyd1m&yb@dtR)hNbTi09->g#XW`bu4>uhfP5N6(|%2`V}Ybj?f z<*cQgwUo1#a@JDLTFO~VIcq6rE#<7GoVAp*mU7lo&RWV@OF3&PXD#JiN;#KO&ZU%d zDdk*BIhRt-rId3iOhzH) z^eKwdp-)jXIzD}hqS5i`QxuK%yH8Ox+V4I^(dhW}DT+q>-KQuT9iKjDa9Zeg7L8Hs*GX#w;r_T^Hx|}{e(CBjdG(aKc^m%`}8|CzQe@dsEKJU-A%jxs}j4r3o z`!l+nKJU-ya{9bKqs!T-a%xWvmDA|iq(+r?pD^LSe)rv|UW(Cgx*OF$nHG9xwK4FV zb7Qau^c#mp^-qkqf}YuK4AxeLve41hW{M)nXm40@Kkk$KKW<~bXg=WJx2vypkuM&>yindfX|p0km8&PL`r8=2>9 zWS+B;dCo@WIUAYhY-FCZk$KKW^+25ax54j#-vxDQjM6;^-Y7rX_Dp!AylLC>;f?Bh z__v-FZ&csIw&%th)%URN8S+N;J#7CN`!&$>)@|Jze{aY-@|x5_;&Cj&@tSozK8$oNN!Z$!?tJI8`bx)?fLdb z^*wA?fsV{Z^*xM^y+-vnjE=p=(6QI3{)X}WV6&NF&bE;`+eY;({9ocq{R-KNf5oTb z-*^WpIyFYN`}vLPIrtjSkT(m(8o_T0g3$ncgTc^gzuEnmy_8WmlwJE22-nCIJ%XR~{-widY=U^;=eml^p zo`dlNAZoC-VO}F3?XDhpHIYvU z-6!-a0?q~v^US*EPrHBWN~1MrxirVNy|A2-(Q;{yZF9I>nxh?m zq&dbL!8M?{S}x5wEYwaTLhX1U)J`Kp?RX&6P9s8{#v;^dEJDv~`2;}csGUZH+G#|n zokoP(X+)@PvsGUaiU+pv^)J`Kp z&rUCw@)&;(YNrv|o}FHpj+Z{jd6@_k3Qj1 zTuF*|v5X5qhR{xwOc(b{YwNI;8$9EmDfK z$hLMG5qcJVxwOc(b{Y|Crx9U7igp^2onmXJ5!qK^Yo`&}OR%-mh-~dNBCNyKP9w6l z(}++zjR>{Vh)_F?2({CQP&(wq0wVo#z~_MLs*vXf5*Dc}8oI&(8CeeW2%-eRiJFbIU$E&*-^jpPlEttVKRM z&uA_3*?C55k^!5j z$Ylo=a;j^4WQ|twlaN&$hM5XXn|r7WwQvqqWFq=NYX< zK0D87E%MoUMr)DJ&NEtze0HAETI93yjMgHbooBQb`RqKSwa91Z8LdS=J5TpSi+pyT zZEKOw&a-VT^4WQ|twlaN&uA_3*?C55kwzbHo>Djgx`7}MJtiz_=p+!DT z&*|18pQdNqTIAF8Y+H*8Xpv9Tvu!Q%X?nKd5G^XGUt}h&MLtc>Xf5(-dPZxJPt!Xk zybAQ_X{FS|=&_7X(=&Q3EBEuYsa})Lf4LS zuY|50=Uxe2JI=idIrl2$+$*7L$GKNR*N$_qgsvUuUI|@0&b<=4cAR@9bnRB-yVcZg zwUpl}uH9;Cw;JEArgp3G-D+yL8sDv^cB}E-YHGI{->s&0tMT1xYPTBSt)_OX@!e`_ zw;JEArgp3G-D-Td8sDv^cB}E-YHGI{->s&0tMT1xYPTBSt)_OX@!e`_*Q_}Q&`bpHxlc2>)XnQlN-i%5&qtDGKb2FOUjOsR{x6NWhzZDxsuX1S)6Hq(1$kxs+ zLhallv^F+tt)|npbBjhE>Pi|Cy zV>-N1Y#$bSS$fZxD0&2_ZO?it)N#9-%j-2PW0X$Zqk*vhnvARaejNaMf~3$ZYAYG zmF@O$n^W-q?Rfw8%tw{d3jeL}-x}Vo>sv!dMQgYb^vJh0ydV2B*lo(aRrh!LXGwn$ zdmH#wBW$$7Myql;75Y@5E}_S{884-H$y04uMaQK8*dO zk)DRnFj8qVp4<6&*rqan98Nwio|Qta?~;$E!@J}op_n&bAiNvj-Hq?=#&>s9>$`QI zw(xFzcQ?MfJGAfa#&>t)ySwq--T3Yve0LANy9eLhgYWLaclY46d+^acc;p^DaxcEP zmv^%F;*opx+YRBp`mJ#z=x6%9x`R_TV{a7?_sSzq{}Yw-UU|eRUjV z?^jgQdqex>-msnYPSEq2_l7;#z2Mil@*#d@@7x<&H|`A|1s@~jaqK>>>?dUa90H%< zzr)y18Z%xQb#KNiqweL6+r4=0Uc7d%yrxoR+%MXQFE-+fjrd|CzSxK_HsXto_+lfz z*oZGS;){*=Vk5rzgnoM}{DgjMbo6e*JDc#%CcLu=?`*<5n?kp&P55Y2=$5rfIqFwL z(I&jMNjW;*5w$6F%i4q=H{r)k#Mph5`98{gANk%FeqC4I7yhO2erk6=wY#4y@8`<< zsonk5?tW@_KefA`+TBm>?x%M5Q@hR7WixfzOkFlpm(A2=Gj-WaT{csf&D3Qxb=gc^ zHdB|))MYbu*-TwFQY>-9~J;5!-FVb{nzX7CN@ui0!t}vE3Fr zw%ds9He$O?n&Ue-w%ds9w$QQN7CN@uLdSMn=-6%}w%ds9w$QQN7CN@uLdSMn=-6%x z9ouc8W4kSMY`2Au?Y7Xd-9~J;5!-FVb{nzXMr^kc+ik@57TDMV4_m}TSGYwy7_GWn zh=(oW!M0U*3-PlB)!l;XZb5aopt@Vc!(m-x)!iZpm6+VBm^`d>Ke@INlUo&&`($q+{j-Xtt%^opEX;fs zWH`YbK$LAZSoZXZ-Zck;&a6R zHtxBNdv3#D+wj*m{I!kpY{OsMDAhJfwGDr5!(ZF**EamM4S#LJU)%84HvF{>e{I8G z+wj*m{Iv~#ZNp#N@Ygo{wGDr5!(ZF**EamM4S#LJU)%84HvF{>e{G|_+o99*B5vmNv3xz&2YoE|{>838-)TNuc_*AKVVGkwjp@co+d|D|kRgc&kHIwkxPXchV@3iDOn!RfBuS9KrTkAkkPu@8k_Q|Ky!mMq0>w~vG#k103uMhV6V6PAM z`e3h5-qbbnrf~u2c`cuVb2uDS8K#Bqp$#fuqkCviP_`#1+Y|o}N$(yV$9-RUc2)DB zIJKRZ6DOWTyJse6C-2GA$z*b}dvbDeCYd}Zu@cjc^H}Y!cSdm}iv;q}N+1Q1AP6y& zoSoRB01}i!bmJj41U`U969qsvAONN)iMDA&Bq&fIK#-PUgFv&vCR{4*y&wN`&+q)Y zy1MH7yWji0zh6~Xacs|VY|n9Q&v9%gw9Qa(LfZ&~6N=}Fpak}74<`cOIe#LUp#3@8 zUi~`}T%+f0&}(rgf>m(asQqhi+Q0D;@Cko6JV4t@dm?-m><0V50q;2+WDg^3KT6xH zlqbS5+Ev=;X-}~IB<(5sU!l!$hMqB<2rtwB725Z}26!Lb0lx*N;CpPJxt+J~I+6bl z_vF7*aXyi^R-ed!H|-zrujfCcE&WD-Lqh+L!|w%9J2>h7pjX@X1pfa*PcTH==hYMV zTzZ0WFp-}01e5-5aFI{FQrZ)|!G3)IZBKBCEx!nUiBG=_`s{jwudwA;X?q2=CwPl* zU7>vy^gX&g8a4mQ+u#yC*V*SgY_kmB09U|Ow!BGu4ZOwnw`qS(ap(!&Wk2ime1rBk zIi4-BMt>dLW^eas-#3cYIvzYg4<5j8Ls0a@YU9J+TliOO`6>Ty==$ChK1R=8KJ^T} zCv2hTZ^6F@?csYuD`!u*pDmqbJ)!5?J)!5?J)!US?g>5D?g@RrcTZ?1))O9~ZO_va zJ_B0WdcuF8->#-7w3F!xd%)-U^j|8_L&8_s!{@;n(ChF$q3`bQ3B3;A6VB6qjc>uF@D2LkBvxK^?+M{g z_!Zi4CiK1BJs~^^{r{An@EvfC{oDrM^@xXzb@)xbyFvdQw%nw>MY~4(E^TWJ3u7o#=jWcVsL2U>YfhK|z7(D6ALIx;79?n0fT(OP{{ z3S)GQIGOiZJWtQ_^!WMnLxG<^FGQt#QR&{mD&31p_oC9hfz_`!uuAu$(!I)eZ{xG; zMWuTKk4P^n-HS^1qSC#gRk|0I?hUQdy{L3=XqD~_tkX~ay`fdQH?&IkhK_J=XqE0IR=pv|NyK_l>0YtX+gPQ0#TKJgx;L~+_l8#KUNOgL zmF^{my{L3AD&31p_oC9hsB~}MD&31p`&s=%fuGecB!)#|SR{r;Vpt@GMPgVahDBmn zB!)#|SR{r;V(4f7Yj4D`NDPa_ut*Gx#IQ&Vi^Q-<42#6DNDPa_ut*Gx#IQ)ED-y#Z zF)R|pA~7ry!y+*(62l@fEE2;aF)R|pA~7ry!y+*(62l@fEE2;aF)R|pA~7ry!y+*( z62l@fED}S%*I+2{dkuudutW??#IQsROT@553`@kYL<~#ButW??#IQsROT^IcN6FoS1D^j1%&S+iglP+}$ zT_gH*rtWdZ^`TCEs8b*6)Ti@uzcs24jp{?A`cR}k6sZr5>dXIYdEkEhPe0D5UuUNt zoKHW_ryu9jA6P5;b=LmW_uBRAtfz%vp#6qMzdv|Wzt}H7bVf=dT zlfrM%{w90a;#+s!kBjKXMfA%>XnVy|zZlvx^oRSrrK0Md{d{_m_95Esv=7tvoVs6r zzo|SvtQNIZCA{GRZK-dBdBvx zt#tnng07PN`3Ll=-$?S9(DipvncgL|s~J>|yT^JyNRAIG$K8L89*@x=+3oj_XiMd_ z@e%iv*MsEsAbCBgymo&#*ar@HZ{+o$^4i~ZeHm0<9}-r<3AW)F$mK!UK1ePP6750Q zJ_y?f$?HMbJ{WR@;R^e79T|k@gUVn1it<;#2+s$VzizuC4=R7PCHd>Os4N72i;7ST zUl%&d{3aBmtNDv!n)=D#7sAFji{#*o8f$O42)+$E`(9E`4GFzI@DlUc zm&9kc4``d06g^`FtQvLX`j(D)At;lNW#%Jgva*ckl*!66Sy?74%VcF4Eh?i$<-qfi zvc`8v==n%Fu!k%&A1NzCA5+`&k#g`w(DRXUU_V(7JRd15e-8;gA1Md+mSyH6<-qfi za^U$$Ik3+xi!=Te&qvCE=Og97^O17k`AAtxX!Lxf9C$ub7O%Xe=Og97^O16Ji|suh zDF>d9l%)^ek3DKx`rx+bBjv#Jk#gYqNI9s3o{yA+d$c_tDKj4_Gao54A1R|GWt61M ze5A~Lq>Mh7nU9p2kCf4tvb06N!hED0{w@3Te54#c3AXxZnU9pir)YaVQbya$%ty*7 ze3|)38J#aPA1R~uW#%JgG{4Mzq#SxaQf592o{yB7kCc^t{+8z>WmQt6=OblRQnx)HDJ$cQ)`2p4SC-0o z53V(3shr!MkCa2W#C)VI#dEAYA1N~*DJw(WhBIhj84WC>fo0|+<XKWU?_Z7c{hae452y0H3R$~nvk4l{PcXw)#uIZSMaiRv)%9L6UMqo2e0gkgNbFlRCR z?Xw^P!}x^LXxeEs?KGNp8cjQmrkzI9PNQk3rSt2-X*BILns$z8oFf|Nh{idhagJ!5 zBO2$3#yO&Kj%b`C8s~_{IihinXq+P&=ZMBRqH&IBoFf|Nh{idhagJ!5BO2$3#yO&K zj%b`C8s~_{IihinXq+P&=ZMBRqH&IBoFf|Nh{hPv7$X{Es<7+9nDlu;SfcHj-I%o6 zI0O!Zb{b>SZTI^=y)pduSYX#TMl{A$k-g0v==*TSq{+rDBat5?@?%mheM_q4{>MRk z&M`)0j1d_NPtx-OpALW{{#{0DjFB1(y_Pj5kL~?%B*btmyg>gO;G2AE=Q*bAHrm~d zDZ7m~!CP!o2R#!U!+Ve6y2ps{Sl;z_EbnSN21CYR$e6OvJs8m-C#_C#h4kW>WBsh=+2a@1G5*$c^14(co2@WK|fh0JP z1P7AfKoT5CqNsYGb|483Bnj+55*$bp*nuQCkR-4JNpK)ZU14(co2@WK|fh0JP1P7AfKoT5C!dNFbkOT*k;6M@_NP+`Na3D!& z2a@1G61b7zK$6f7Bwt>i33S+APEj6!GR<= zkOT*k;6M`cCBcCtWKDttNywc92a@1G5*$c^14(co2@WK|fh0JP1P7AfKoVt~jsypi zDDT|%ifE$j)6pvXjGo^mIFJMfl6*TKaUcl}B*B3sIFJMfGC{UZkf#&M)AeA2Je?p< zC&<$Y@^nIZ>Q6m?pHPNQ3q60IP;L$hJ%682_POo(`-HO0xCDCUHKFV~P!j z_X%Z(zvcP+1e~9M^ApV9C&YGb1H&i8aBV3jyJx@mAojX_h_>hN6JoFXJ%67Nd)@Z@ zeL}o7dj3Aa{Cy(y{Cz?Ubie2C6Jns-p1)6^jT30&1ll+uUg@k+$O-1}6L4vQ`TGQ# zIRSGfV9o^0nPC1tA#Qljci6M%?-SyNf5r3n330>i%*a?zFn^z5tS6YiPcXg{8ec^~ zBdc#Qf1hCfKEaqyFn^!KT}|((EG9L+?yXQN%jB>rJi5q6LL!zBJ;GW2|KGOUC5*w20NTSltwB-M5j z=P-$Ln8Z0u;v6RB9JB|V!=xg)9!ycWrl?R;V*Y}9yz(%G*P5d8PNBwAIL|3Gb_zwE zLQAJm(JAzE3gw(a@utwaDg4qDOq;?rO~JP*bZiO*o5Fcc!LBJ3W(sYYLRF^lMN=?m zin=^SU7n&YPf?er(19tO=PS%OUSY=Z3fsKGHq-P^(?3oBH2r=%;ZWeW6AHzpLqcC8 zo(b$xXIS-}5l`Iqs{V|4;!nLIG^5&TbnefndKx|dnqk#u5nhEV3W>g)#w+d}veV7q{-0!OoGvbeqM3usAUwxP%&NGU$ z+g=x)QEc7z%G(U9zB8=)&fq*}SoNL3f6lP#JELfOd*|s4tG+Yhl6n-eX`!zX&nRwg z`|86Ct44mq;85T<3<`u`nl`6Mx@|Vjp=ony+8mlTCr$IG*0eb^ZH_q4p=onu@tmUVZ9HR|Q!O)k z#x#er&7o{_DBB#$Hixp!F=Lt|>*vt7IrMD~eVYqCW13U6jn=n0Mc8f6ZReON%qg~R zd&V(G?$4ohb7BD+(LHZz6UK@Q!*~Q>%S{Hgr2ZjI*a z8WFV>w`rlP;p>W?+i%hKO7iP+T*i07Z-86ghWm(K=RTs>xsT{|MO%AQw2cpYOGVpT z?x%eSJPaNIeP8bDa!ST?;G1mk|M|8@!Ib_vgR2_3tHTf2l$yM!yd zge&_ZBY2r(zRWRS=9n*Y%$GUl%N+A%j`=dje3@gu%rRf)m@jk8mpSIk9P?$4`7+0R znPa}pF<<7GFQdknIp)h8^JR|tGRJ(GW4_EWU*?!EbIg}H=C_FaTSWdX=Gt$m60HYs zsS+8lD;jU<$lYEAw~dU^Ta3|L%mLq0m2v+l=yl__R7c$N3ix@@E5mQ;Xx;DC-M3Ub z-1fgz-cr3VW=3X1Z!sHsOO?Vs-wl39c$H(m$}wN%n6GloS2^aZ9P?F<`6|bJRW(%K z;+U^;%vU+)s~q!Hj`?cnW4_8UU*(vuD$f3vkNGOce3fIq$}wN%n6GloS2^aZ9P?F< z`6|bJm1DlDinbnHBd@QK*VoAFYvlDc^7ucoo zHS+ozd3}w%zD8bOBd@QK*Vn`=eOJ6PISPnlw#YlGoSB>ub`q>ELZD$lFwqw{>0%!P`0`qh~#Dqw{a0^Ka|e+~fJ<+uED) z0pSv3y2O|+F{Vq5=@MhQ#F#EIrb~?J5@Wi=m@YAI+=c*OutU1UnkSA zlj+yV^y_5$bu#@rnf?wDeuoIZL)_jWZY%V!(7!_e3jM3N*H_dMuKT-B(# z{}u0FaWGn?SBb+aBe<$)xZg^$s`VLTgFX0P;j0=)W9Drb$5qC0RpY2VYaERq60UKk zYn2a?jWb>2OxHNmHO_R6GhGv7y&s?H8fUu3nXYlBYnt@gLbGTx^d@IFnUuQ}c#%Wjcnw>XPi zWZ5m9g}z0W-Qvh^k!80y@>^utEwbzuS$2yoyTviz;+SudWw*$(TV&a7_<0+C-sYHZ zbIi9n=Gz?eZI1ai$9$V(z73Oa!{pl>^KFj#HphIMW4_HX-{zQabIi9n=Gz?eZI1ai z$9$V(zRfY;=9q7D%(pq_+Z^+4j`=pn{4U4*F30>XNAfO5@^$*ZPXE{G|N6K4wTFe^ z>)OLYuui2|r&6p_Db}eJ>r{$$DuwEy;=E3!SPxt&)~OWhREl*f#X6N@ol3DzrC6s@ ztWzo0sTAu}ighZ*I+bFbO0iC*Sf^5~Qz_P|6zf!qbt=U=m13Pru}-B}r&6p_Db}eJ z>r{$$D#bdLVvAhcBGn z7NfjHu5FQPTjbgnxwgfKZ;@+Tn7P+=Xu5FQP zTX0|t4s4NYTjbgnxmM#$Yn*9~Gp%u^HO{ognbtVd8fRMLOlzEJjWexrrZvvA#+lYQ z(;8=5<4kLuX^k_jai%rSw8oj%IMW(uTH{P>oN0|St#PI`&a}pv);QA|XIkS-Yn*9~ zGp%u^HO{ognbtVdyRiB$tiB7Y@51W4u=*~nu2U=P;_X6Er&iX*TerPlRHs(fsg-qV zWu01Cr&iXfm33-momyF^R@SMNb)BR3pmQ|3M$|dSy3WpR-%nMiR@SMNb!uf@=cRsX zWu01Cr&iXfmD~84ZT!qOer6j#vyGqG#?NfyXSVS(+xVGn{LD6frlCC?3L0D&YiK`e zv%1(|y}hB?^keGrb+Ja^)vX4rjty2F8(bG_a9ymyb+HE5#Tq&i@5guMG+tc<- z*TouK7i$Dw<7((=y`}HWX#~E;(NN_5tt+&BXHG+-;2z(Z(-0?(zB8u*GaG^L%xP$J zjJ__`2z+NwLtOQizB8x6b+Ja^mDmQ?#TtR{%xP#ey&qo}YiLZ}_MJHmMbGFva~fP1 zYl!pSo3D#CxGvV$qjVhyf~H56@qOVKty?7eYatieibgB)paU97=XgN8=LTef(g zTo-F_U97=%u?B0l4YAAnu`_9qS&i@@ZU0lC!CG!ZtaH1Ae*aUT5q8pk2K1fb4YASv zzB8x6b+HE5#TsO2gX?0A(0ArExGvUE&gy)*F4hPc{m^&jG*~5Wh}GVk?=x?R+iv@x z0uAN3zvVk~8p?5_okK%8?zZpDX^8(u-~q^I!wsp8kKcFZG^930-$qjVhxn1f$}uCR?<+;Y7bm1X()5u zwxesHNDZ!=G?a-tFRqI_dYfE zJ~j8gGH5-xPtCorOmW+@v-@JW(X+Gr)ZF{j-22qr`_$a~)ZF{j-22qr`_$a~)ZF{j z-22qr`(l*#M$NrX&Am^}y-&@(PtCng&Am^}y-&@(PtCng&Am^}y-&@(PtD!o>~=V> z9iEi6qbFAk1v@-1WheI&`o*2x&x0QZe?z0gJFCE8`sSN(W@x6oG>cz?IhtKz)BTj;BwJGlh(`t43`67+mz zCpXQOGqhi&?I(rq|uo!~-OF5U?)^!+ou z6I|#kEIT=KZzp#h^qhSsXUD#yC$Sj)q|lw5-TRK7k!AGi%1+P(`u~hO!FPaOSK$rg zLa(myo^jy^Xn(JNi>KM}&T+MUr_E0AufhKr{I}pwg8v@;8Sv-8UjTm*^piq&cv9$2 z@SoW8Z_*F10(eEH?2sutJSlWXPbSf~cv9#N&(h(I=jwUL-{nc6J3J|LC+{bP?&yhF zI%b{}x|9E5+I~{#4o?c*$^QsFKT6M!(e{%_FKGWI?Qh5M|DxxU;C}@l z27MKNhbM*Vo$t9n3iQr*(Dy2T3t#jtltk}0cR!9uZ#k#!yO&cmCq;8owoK8S6wOJ| zoD|JT^~|DmZSVM`IddaLbJCo-k?QGu{?wY2<{XnW=a{59$0W@;CTY$wNpsemG-u68 zbJm;`%}LRmG-u68bJm;`%}IGGREp-LIcrYJQ=w8l4ase5PRdiE(wsFXMRQU#C(T)N z(wsFX%~^BOoHZxabNP(coRp^%r)W-^v*x5ZYfhRQ0j)V{t^!(f(wwhjrf5!z=A=1m zPKxHFIcrXe=A=1mPMWjkq&aI&isqy_YfhT8=A=1mPMWjkq-ai>v*x5ZYfj43iBmKu z)pPmWZ_P<_3!pV8&H0*pisqzfPKxHFIcrXe=A>v&isqzfPKxHFXikdeq&%HCMRU@? znv({;cRfXO(%^e&TXWLDnvlw?Rf{(r=KD9L+h&U^5w`qi@H60N z!Dqo^U>Eo={MIQ@YZv-%5!Al|)$RlPLH&bIJ-Ut~)KiFsFM(z79H`YT_3J8+Q1@;L z$H4R8IA@W7y8lq0>RwZ!oN1@uQ z;7w3hVZxl0$Ec^Z2=x?Vp;q;Ux}!s=wSA%P=n#H@_V?2MKH49ot)~#{Q$2-PsHYGM z^%P>Eo1O6QN3*aw;s{Z=)e+T6O)Yemoh44*U^Y+prZ7(fyTTdYlbJ8Mx>ZcG3^%P>^zoD(C5Uc&ewDlBXwe=KY;g8Ux zrx2_CW3+#qww^+)9zBIv_*1m?6k@f1n)c7o{#n{TNBie#{{rm~)BYv!m%(2Fe-->S z@Yg}k-Omfvo`0L3-=Y1xw11EG@6-MR+J6X=chVw%i@cK-x&0?>`BB^ub`entR6juSg5BEhk><7s5zHV{zoYPBecQ< z)*_*vA|=$EOK2?$bN|5@Xl+OMBj97;39tkvpk@%-=9-Q<)QYZ9_fx4y>yvJe(AEq^ z?FrhGZtGqqZKE|bxBpS?JinOd7xVmLKJYK*br+e@znIs(VMhOAo?p!Ki+O%A&oAcr z#k|%z7s5QhnAh5-+WcakU(EB1yZFUj{NgTtaTmY1i(lNuFYe+Ockzq6_{ClP;x2x1 z7r(fRU);qn?&24B@r%3o#a;a3E`G5|dj440v_YaE-<^CtAXNgmSMSkIf}A>Fo~H_1a9t>;bhkp8Ww!GoYyq}9_7YDHS@ll<<# zu!mFpdM{W69rGrsw6P!5b3D`@1YZPS0?XhzQ2&S0Hlv{af35ZycpkJ$H_0Cwt>0`t*z7mqA^vP|pH*1zZH*2Cwsr%is!l z6SV3!p}I||ZWF58B)!$%q_oEG1wRN{U7JwXCaJ62dakBWZ$lR9&7ndoZ4*k{gwi(2 zG|OSS(3d9U_o|nNjsnaiD@Use))5RS+GO zYKQhi?Pv-groER>_kmBozphXB({IPp6xypaX(inF58xRPmg<^?`*rY01Al~`AEo_cw11rTPtg8J z+CN46-_!nS+CM}4XKCxrt=ikq)BXk8AEy0F9Mvy_daAaz(G$OgzXtv~_#5DFgTD*@ zK8P-<(s_G5byH{$&?Jv-`~>*tAfrhYYs$NdHBrTy{49O7UB#NHVog-Bru?I3MgB2x zAE>vls(M*bBNR14QKOs{HOg60BNR14Q6m&J$~l`N&B~{RcE}Nmswzmo6*WRpBNR14 zQ6m&JLQx|WHIg^>?^;nK6g84JcH4>?X~ykev7$zraT~3uk!IXRD{6$IMw)SZ%R$hJ z8p-z>t*DV^+(zeGgrY|By>44kBh9#tR@4YZjZoAGMU7C@2t|!@R@6wo*S~8;jZoA` zb8YXziW+HtZFCk#C~72s>$Vj&LQy06TeqFpk^HUEiW+G)ZM33Bnn4?_s1b@9p{Nmx z8lk8WiW;G)k!H%;PhdrjP}B%TjZoAGMU7C@2t|!h)Cfh5P}B%TjZoAGMUC`kA&mlx z8lk8WiW;G)5sDh2s1b@9p{P+{MUC{7QKJ<#(lbRDgjUoDMUDI%QMIk8QD8-lP}C@} zqDFd-sL_fV1y zd{kD{NNXKND{6$IMq2A|+lm@#W?{6VMq1f0qDv@hgrY_$YJ{RjC~BnHfw#1xMks28 zqDClcgrY_$YJ{RjC~AbFMks2Ox1vUV_iMO2=XuudoM%Jw& z-vMuct47U>jk*I<_yO?yK-Y!ca`nca@csj>jSGJo)HOJ@y_T{&@LI}ly$wNU5qOMt z`&|-3uc+(}KB*Dht!EA!^^AJqUOwH&r!BPq4m`wuPO!~MJ}uGq8pUqijbqevkc7I| zLioA&KOwX-@7B!1pDweXZ=cr=?G((6VGeX{-L2WQwh#Xg|Dx_)ar+7HEo`NIfNk2q zgY>k69bhMT6ddrcYZl`@oCeQ=dWMpEywb8;|A_G~>KRJH3Hm4LpW+u^p`UXJKTrEr za1Ol8Hm)GMbuWkawh7k2_xO~v(|=yHjqkn?+I8>tJs3i-X6)8XO2?y_l-vIq{2lQ3 zz&`;05c~-E$KXdnuRrY8`kwL6K%$o?dinp;G0gwp;Qs^uH}J2(zXl)Wcpd}yf&ZxE ziSZsW-Xq3)#CVSw?-AoYV!TI;_lWTxG2SD_d&GDT&CIpWnAu#6_lWTxG2SD_d&GE; z81E6|Jz~5^jQ5D~9x>h{#(Ttgj~MR}<2_=$M~wG~@g6bWBgT8gT66O;*n7lyj~MR} z<2_=$M~wG~@g6bWBgT8gc#jzG5#v2#yhn`pi18jV-Xq3)#CVSw?-AoYV!TI;_lWTx zG2SD_d&GE;81E6|Jz~5^jQ5D~9x>h{#(Ttgj~MR}<2_=$M~wG~@g6bWBgT8gc#jzG z5#v2#yhn`pi18jV-Xq3)#CVSw?-AoYV!TI;_lWTxG2TP((lJl)9x>h{#(Ttgj~MR} z<2_=$M~wG~@g6bWBgT8gc#jzG5#v2#yhn`pi18jV-Xq3)#CVSw?-AoYV!TI;_lWTx zG2SD_d&GE;81E6|Jz~5^jQ5D~9x>h{#(Ttgj~MR}<2_=$M~wG~@g6bWBgT8gc#jzG z5#v2#yhn`pi18jV-Xq3)#CVSw?-AoYV!TI;_lWTxG2SD_d&GE;81E6|Jz~5^jQ5D~ z9x>h{#(Ttgj~MR}<2_=$M~wG~@g6bWBgT8gc#jzG5#v2#yhn`pi18jV-Xq3)#CVSw z?-AoYV!TI;_lWTxG2SD_d&GE;81E6|Jz~5^jQ5D~9x>h{#(Ttgj~MR}<2_=$M~wG~ z@g6bWBgT8gc#jzG5#v2#yhn`pi18jV-Xq3)#CVSw?-AoYV!TI;_lWTxG2SD_d&GE; z81E6|Jz~5^jQ5D~9x>h{#(Ttgj~MR}<2_=$M*;6qze6!0DeT?y?93%U|&wD&0JN~qD^qmZ-rDCF!t3ORd^LeAc!khAwF=qiA>vG*uw z<=<%UQNVi?w0iHhy+k zM*;6qzg!Uc zNBg(pfY9&J2tSh3TLXl8UqJYg(ASSXqV@dg@Imz-5_%=-LDe1OUw{vRpVZzSRP}Mc zfA>LgOy3IrM*DnF^{7kuxLoUle!qtB3GhkKp7TL!(}Su_-bU|35w?SRABx&~ABxc9 z{-A1;@gKo|0{=fg{U5YHLtF1d(Kg4x=jiXE-EGu)={R*>M%_0U?$N&n9uw+rUZJm+ z?vaKV^*%eHef}OPiP5u|J<^aN;je(6zwF_f<{oK?xA8U2J$|2^(APBgNJEUirnv{L z*uxdWJ<41(3 z9oT~o?BOcgoT%_i%k}57(#mh@aZC_-XXjs6FDR(bu8& za0P0Q`02Kr)_u(X&ImuII1BabM*ZJB{J7XPB=mKq zkBeOkLht9}ay3TXr6V-AKOTIV_G22ykHg-N2hH@i&~GMxJm@fLl(jdFveDfB%iMp~ z^{KzieH8py?vrYN9Q;%86X29F_;=nW_)+jb(DNK;6-&ZN36-85xC7F$$jw_j-FdH1|IaK0(g`+HK%TdS0Nd zr&wsq5&y2At02@7FdtF>JjG)}P%zokfe`}d5hcU{8o0)N0;a*gs) z9rK~^Q600;{|OR$UEC z@EP!V(CZA3QrRC3$N27fFyT{I_DB6MGokKK70%M{dov#O|4oGYm#%P)_Pbz%J$SYG z(J%$AkdNk@{AqqS=v9SBsp*eW$3N}=PlcbBJ2IM$pO!B&E*s@)jIH27upR6GJHeyi zY49xg3ix^ORd5b8b3QExV%!94U}n@T!}vdet`VQsaT-4;+^Z3JOz66{S1jrhmO!r~ z?d6#Fic9XF0nMeooW)*^k=hy^ZK=^QK0?nE-cmkoNa%XKH*}5L8+LmS9s$kseVUmX&GUVl zpSpbx^h(-3ao#=WL9>0IBIaNJJZQG>^ZyNnU!mt6+IK)J&pypejpqEm(45}~=l99S zs;#-IKGiJM_?^nfed3bw`|0uO**?ux7s6(u*G%-9;Z-xdYG#hm46mBuRWrP5=FW#^ zc-0KAnu%C55o?B5&C;u`uo+%8!>eX^)eNti^%N=nt`yAMm{-m4su^B2!>eX^)eNti z;Z-xdYKB+M@TwVJHN&fBc-0KAn&DM5ylRG5&C)vmmU-0-ubQQMkEv~5HN&fBa;+I& zHN&eGBGW=-THsX+ylR10E$CqjylR10E%2%ZUbVoh7I@WyHntF@7NXPwuUg<$3%qK9 zS1s_W1zxqls}^|GqP32Num$~Wfmbc?ss&!Pz^fLtv;|(Zz^fL;txMlBuUg<$3o6D;`Gkss&!Pz^fK`)dH_t;8hE}YJpcR@Tvt~wV`#gz>q2|rC#jN8iWP3Z4Z2D`DOR{=72Gz82}Zl+C&TBx zjYiY$QP36eNsXO*UI9N3y6QctQFFhm-jf<5xAi|PVG3qO>fMvnyC*e9?$Q6SgdY;N z68~1>->Q695ALy5S?_kg_S}klY*kd<9tQ0mTNPpV*gdx59$WoXF10@g+C8@Vsa!(4 z$5xGk(eAO8v2JCoTXB!AxW`u9W2+QH`+)Zl zsf0h}NN|s>xW`u9V=L~l75CVxQT9Gv7h1IjXtaB5#XYu$c8{&0-D9ht$|d|3X!qEP zdu+u$w!+C)IN6GOY{fmc;vQRZkF8>eo`3*D_QR0S&ko_=ZzqCT% zf+721$bJ~IABOCQA^Sr!WIqhq4@34VyZtRQWIqhq4@36Dko_=ZKMdKgEY_AVWIqhq z4@36Dko_>kZrQT4OAmydw2y+W)Cc@DSD~KfDm2>dk?Vwd;kSLAnxh6#6A6%T%x{(4j({)4~U2U^Z|YP z6j}ciS^pFY`4kHI6bktix%m{i`4rmt6sq_XiuV*+*9I%vU_~3OXoD4Pu%ZoCv`HVj z!Zvy7b)i|&1}oZNMVo$iNIhmn8?0!96>YGh4OXYGh4OXYGh4OX&R>v4=zKLDzoW&mQDnH6n-D!y)!?h&{Bkhj#YRPDN{{qP0`e+No&mRJ3-n zbRle~qP6=ulWM!7wNugBsc7v~w00_5yBx2#aYbv_u^C;_+I4I~j;)j>TN z^^kTdT00f3or=~@MQf*`wNugBLsztRDq1@gt(}V2PDN{{qP0`e+No&mVv&wk5%B&m z({@E`r=qn}(b}nK?NqdODq1@gt(}V2PDN{%AJ(_1Xzf(Ab}Cvs6|J3$)~*QaSEy+1 zRJ3+QThH;Kq8+B99j2lkrlK9Dq8+B99j2lkrlK9Dq8+B99j2lkrlK9Dq8+B99j2lk zrlK9Dq8+B99j2lkR=((Wsc46(Xosn2hpA|Xsc46(Xosn2hpA|Xsc46(XdN)51BP_K zkPaBq0Yf@qNCyn*fFT_)qyvU@z>p3Y(g8y{U`PiH>3|^}Fr)*9bij}f7}5blI$%f# z4C#O&9WbN=hIGJ?4j9q_Lpoqc2Mpp3Y(g8y{U`PiH>3|^}Fr)*9bij}f7}5blI$%f#3^@Wr zj=+#3FysgfIRZnDz>p&_p&_4YJjFr*WPbi$BM7}5ztI$=mB z4C#a+oiL;mhIGP^P8iY&LpotdCk*L?A)PR!6NYrckWLu#4EgvB`S=W)|BPa?5I%$E zKSS0$L)JWl=0AhxKZE8!gXSM))$S;(c1MG8efKCU6-V(8M_IKy%BtN_)qQ=cif{C) z-BDF}qgU;Ys-_#gYIl@6ev~?XlsbNt3Vu}V@~0c1SM83f78|{uaFkWMqpaE;6|da$ z-QWj>pYapX!_WAM=;3Gh^fP?=S#spF`c2$I@o+&{0=-uJtQcjS zq30UtmAz-R2lZ;!nL+{H!?RPrX+Btk~k7NziM> z&x$ifuN6P5u@-84yM$gVepX|u?Ug$Va!6h)KBi+9lJCcq?_Fwpt@s%EeoW&sq_)?J zkFg$dOvkM4b4czu@^f__cpMC}0GWs1r!UDLLo_(ONu0BV0KS%yP zN47qvY}MYxe}DH1=zkPGr#v-!_WB$-_#8R-9IF=3v1;+0a!}t@)@Vy*pW6?p-39l$ z;9eKw)rCHHq0e26R~P!MCt2#Ky3pq?SlR_kyBL=)^tlUt?qV#u(C04nxeI;nBK}>9 zzxG4?yU^z@^tlUt?n0lth|^U&z1w=OZ0f%uR9zDt>oRBoq5mJ z^KQ+~+}5+sgw~4gaDw(LoY&{U8NTbee7AJNd-GhrTk7Gq)uUTaHgnsv*KRVgTTeD~ z4}1`}9VIxR40YUmXMVRb)c6kHvhs9?w?W2H&ouKMTvNI=*YloTS-LgXbKCW$TXQ|P zw`pho6+OXB-_jGzj7{z*U%Hj`{?t{YTeDgriEVrJT5gedj5V~n&!4wb&dyKPdhH28?CO#nX?}kKedgj zxv>B~>`%oj_js-5IP>x2%*2l~2S3id`#7`gttapjC!~RD zOa0U@^)tG{o}j{>pu(O|g?0ZRTY64+f(m;=71rOaf)n(+!k&;T^B!KI?K*n`*KvYs zdqRxzHmRwp!?+B5#@gvQkE9{^p2dpO4)&asE1?cr#9;6M)?;LY{nNjwSf zuUFgN$?vb97W%CH7W*Ng&zg7H3;*BT|0aA=8qRy|h0b^0YcF(;^Im(QJ=IC#z}xNB zb|#)A8Yfj9+;*k*o9>OT`gf_FQeHjJ<&FdX0PP>c{~-JyB>scMe~@z-g#UxYe-Qo;68}Ns zKS=xs;r}4KW-t#W>e2VwH3q7Cmd)|$nPx%e+M$f0pf#*|x zx4XaV`IO)A?jFyl{Dyb8J)iO$-re?m%I|r1+w-Y%;Q5r_@UFcvpYj{t-S&LSZ+JI) zKIJ#OdrQx!{BC!*J)iQs-Mx+HQ+~I*KlOad?{+t~(&PCQ?{gP=KE?aog`Q9GK6jz# zQ@qbzXvgI@xx2^nsWS5^zt7!m&!>2wyU_C~zt7!0_Pu51Q{~X}DZka-Jwu@9Q@qt( z==l_Hbr*U*#arElo==sTPw@_SwLPEmJKX(U&!_wjceg#C@;lt!_I%3kaCh7DDZj(r z-|~FQ?{GK51m;s^=2L!$yQAm%l;7d*Z+Sk&JKTkgBl9WV-mV_cr+9n2(DNzY-Y)cf zinq55J)iQs+VzXfr+8Pp+Pl4H=2L!GyS8UO<#)BaZ7=6{wHrO3^1Ir-AJ3rJDogrpbLwKGcv3)%p65EaTu0!Ig(X%Q& zFGt6qC*OePq5ehc{lmi{9MKT-tRZ}nuA%w6Vv*6lXh@tf+7}IJWR0F@4JpEI+Y1fh zg@zP2wQ)g1xS%2CSwlKg_uI`5G0%EgYV(QkWvPuYIHBWtnR(XBf$vm&S@W#l5`IqO z__F3%?zyJOyo{p09IU!6jna3eQN|~{rTp+?LO;RgWzDnnEjdzeIpV#^i@IH*zY0!( zlk`uq2hX!!R@Ly{?3!K{Kc|J(-j~Hsw_O2WRt51kc2F;?Ubt<)^s>CSeoLdT-;x7& z`@3oTF2tARSBJu3o%>@#-=8_G^Xd}%4u@f#m)bfn_3ONhf9?LztDVEFb`G=JIjr;Y zmR{!^4z01n+{ZN>dWCbC+BeMc4|C+h9P=j<@f9h=cBmZvoe3&IlUdG2Xe zk54npIL$2MH0#5s6;FN2jN>#jj?=6OpJv{1nt8`*R(;P*t5PE1V;$$VR>2LFnurQC)U>4Rl=|QC)VA-tQoMm;J2M^9|bH+%RWIHKz89^XeaBDM6EE%f{? z`1jzGpsVwUwA5QVb4SSB5!f;!b#;F`{fB9H&^|)DllC*9>-C7V*V})VJ^SB?BdXNK z=lRr?dPJ4lJyy;U6mLW|+HFQ(Yo2a<&2vN=?!9@XWkgEuw%0sI(8dudiDPmebe4@M z%iQBt&=IlMXf+M3v5M-&HlDdUq%srJ9dY%}1%`qg3-zs`)6@e3WWFN;Mxspg|p^HHk#DAjzFYCcLeAEla)Qq4!H=A%^eQL6bU)qIp{K1wwo zrJ9dY%}1%`qg3-zs`)6@e3WWlL5nJ=Pz4pLFfXVuBd9PVs7Qr|!V0=tL4_*J1uDS> z`aKt@Fc+vOGF@uh?^UEc?zi8o1or6x;QT8Z zkwakxJ*j9!v^_q*f}T|H`4xPA1)pER=U4Fg6?}e0K3_*dm8obPy$7$ORy3M!TRkco zQ@5=i6^*RhR*wqRr=n4Ik9~dxpI^b}SMd22ynO|4U%}f~aP<`_hPSt?ub>ze@x=SF zVpPNyx4kM`ks287;VaSsx934S_6m-@f@81X*ef{pigMpude&CKu~+nud-vG4S3-Nd z3huoUdhS*cC;f|d2o?SB-aUG|gwQpjf}gM8=PT6EirDMztqB!z*llYf*s zm7J=QQ&n=RN={YDsVX^DC8w(7RF#~nl2cW3s!C2($*C$iRVAmY$*C$iRVAmYf*sm7J=QQ&n=RN={YDsVX^DC8w(7RF#~nl2cW3s!C2(aj;c#s!C2($*C$iRVAmY zA1CtT#C)7+j}yspA~{an#^pK|!UQjo z;35)SM1qS*bVlp?)GGst@=l0PNN@;=`0pOi_Y-m6==pvkmKr_ZPsC57=UIu4&FHy* zf?G&%3khx^(GjX2&ye655{@?EXcL@6f^(Q)6ed`QoM4*?wwYwkILVxGl9}KnGr=jg zpJMwdwx44ASJ?g)wtt1~Ut#-c^-qV>>K8J%oeoNh(zMnV4helNb($Hj-X~1I|A{kA ztn}7adbZu8eQFQdr_tAQbr(PFHqduWO*7(hsopbVt@@^lAoT@($J8{VKdsei@4@k$ z);fdRj_S156Wn%er}E9oT2R~PHKSR!Q0JvjbzVj@c7`LL2|Z7o(Ja7d#?I(?j5}az)UOW-J@=g9 z7hhFW7s6LrD|nT)f>#v{_xS%=uPP2g9l7zlgtLs=ETcBdsLe8JbL?l1{mikSIrcNh ze&*QE9Q&DLKlAKop8d?TpLzCkflR+Zj$a_hFDS8RfY@X^#$_! z0(pIbyuLtQUm&k9kkJ>&=nGtBxS(^AybUQ>1(eU;}mWw+5+ zd0ta?8xMp2Kg(;%ZlkZVy{7Co`Yc`(4~^EM*HEF?IP%w&>F&7$`YO+B%5kri&uhx=h43QTcaiM7sLcIjc#)C4$S7PS`!0%^)9Ux}UlcRdCf6>KYZo=|URRGZ z?xOghZNjJMX`}r#?PtJ2zH7c+6oUEMB5)BkzDOJ{lA9Na#zivmBIkaQ^{$H=FYS|6uZtQrw?8C&o%4E~UwNJVzs??B z=euv9W^bToZ!qF-Fye2*=QrW=oACKf`1~cd{}S7OiS56{_FrcEFSGrZ+5XFH|5djC zD%*dR?Z3+Q3v9o@_Il>1VzR*YSJeMlct!m}sb!bY>j_shYVL9FT+yhx$14C=P?am3 z;}ulpiuR^0wKwA<-d|MMI)$RBtBO( zf^J(&uSiR^CCYY{h+QROSBcnFBDP4x7Kzv*5nCi;i$rXZh%FMaMIyFH#1@IzA`x38 zVv9sQTH}oR^hF%OEu|-z47m3&+5nCi;i$rXZh%FMaMIyFH#1@Iz zA`x38Vv9sP2*dh^IBw~w1Y>|j960t=hwn)SliP$0$yGF#W5wUAT z>>3eUqJN40CHj}>=e_VD?}ZO}FTBwIcwNTtE#vo=6=C&g2DBjb|4)~Le%h{F%bE=t zhe7{aXF0GMENd*Lg|5HL+-JLt{x54pyv-cw+1Ya7%Daq{T*gT*<0O|gr_gutlgr#` zzf8SYra~=Kp_aK9cR75)d(h|@y+XcB&03~rEr-5)YFXprPp4?RYAlBrz&Ak80hg&7 z%X0Gm)H=T`_ipqZyvy8azs#NX%iL+d%$@ej+-bk8@zOTj<-5#XzRPITGU~J}*X>U| z$6VHU8Gnc#&o^%{IyV@d8?61_5M$LZ=V0`j?G3TlZLihekc$v9jyD*u8>~s*5HsEH zwfY;OUBM0U&~1C38{(eP>x4JNH@DYlH)!vGDQLHIgSGk_tj^sK>)hkD`Ws@}dbk2Z zR$#~q3|WC8D==gQhOB75yb!LykQErR5||+?Fk}UWtiX^J7_tIGR$#~q3|V2Wu>wO@ zV8{v#S%D!dFk}UWtiX^J7_tIGR$#~q3|WC8D==gQhOEGl6&SJtLsnqO3Jh7nSFFI0 z70v#17R+c?V8{v#S%D!dFk}UWtiX^J7_tIGR$#~q3|WC8D==gQhOEGl6&SJtLsnqO z3Jh6+AuG(DR$<603|WOCt1x60hOEMnRT#1gLsntPDhyeLA*(QC6^5+BkX0D63PV<5 z$SMq3g(0gjWEF<2;)+*s#jCjDRq4`txC%p7VaO^BS%o31Fytma@FqU+CO+^c%6yYi zzKI&�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 literal 0 HcmV?d00001 diff --git a/JY.Inspection/Lib/MetroFramework.dll b/JY.Inspection/Lib/MetroFramework.dll new file mode 100644 index 0000000000000000000000000000000000000000..ebffc7ed9cedc722979c8c16fb493e9d4e48275c GIT binary patch literal 353280 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 C%0ejs literal 0 HcmV?d00001 diff --git a/JY.Inspection/Lib/WinformControlLibraryExtension.dll b/JY.Inspection/Lib/WinformControlLibraryExtension.dll new file mode 100644 index 0000000000000000000000000000000000000000..cb7fe0e59a1c6f315b8ddc7368b5a5deb88000aa GIT binary patch literal 1177088 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
_%!3Z0PGLfkS6ujHcgD4i(F z&QRM#y@~P=m>#v3L~W`gY^EpXH zV2-|Pg%k4iSw&>1)@K!AE{H3|gekgI#BVW%54}x|xr%e~uOQGeDl2gFL>l5vw#>XnrG#7+KyC|~oT_748Ap@eby2yxz`CyU;i*B6GrOOe0f={%I8lRv< z(}yo4+C?cPx-KqzTzGpmEfuZ+V%c~I>n^wG1`oZ-o4k%lB3?;}xVj`Z{qfug(?xBi zPeR;q<{^Q!>ohgca?-&|@xya3hhI%Yi^N}LGTLT)YoS77J((ox$_1~C3=78?m4#zq zS>Y;8O>{F1@iS^AeqEoHl4HpD;DCXwAd|NdAIH}cut%vM+s~lZzr8=f0gprNzGOWt z?Yo&4K0c>=&@HXErhHRkO5bisv+ze8)y# z_A?bCJ>tWmkYtZg3lriaB6%?jsWWrA_Tak zv0(zInjQhLWA;Ulz;?Pvn>u?&uFft%m{(_~;tR^bzJSJN{5;lmrM5x-~7gWI9&e#a4@@)(h6-OOy8>Q3X6xfip2+0e$osc>U20W}%V-{eZ zu!>ARRkE6SDw13E5JdlTQ4Y^jrmVz+8=|>#V7h<0YG9}}^I{Ky^s3UKUju0RB0=#| zq9|7|?afgfI(#`2tj%TD&+g=k@z?1qrTiD`LK**K(>RVtBjRQqQ`SsQ7q4&;jt`;{&Zp3b!1pA@p*1`|I+4jckn!PSaBo> z&tWw(Jin4#>y+nWNGRiZj>Re)6fqcwCcm#@J=XEJp=UOUF~efp+Xo?KEWX62Mm$1+ zf-Ekx&X}Mw>x>Cf>kNs7{b_QT#MWk>?bS^{(6gj&u9v#;m=cfygC?C&wk^1ai`wT` zm5Do5xOtWJUFgG0m8g*!*|2(dNJ(h1bIcGafwgScR%w~1(;lh}k+Ibd@F}m4a#EtU zBr+a*RVRy$(N7b({+s=edlN zKA%F@#!Vj^VFZK)u9Rr07MQ{lgBbwhk*>e0={)*@3S zlK9JPEn{jByg;TNontDEL1gOl!Hs}n0rCo_25~&5zQ8hdE0_w~md{j|MwklokYVaY zkUKw~%p)q9${nWb3X3uNk!98>9@LZ-eT&(r{U z1yh4K9#davnR*PE3V)dbvsfl!D!f{hsZr;TnW)MD;vtBW(;(cAI{9V9v+S3MS0ZA1 z06%V4l!31k4H4?7JR1j)rK!b`j& za8K(ZdZVcGi(D;BQH#75a7htZ%dopmzFD-tj99nZJq_Q+WN_v253%FKHHIYu-eDvC zi$vOG#*S8mHO^5cg~Zu`ODkns{avPzNk1~@NyfCxEvC$7uU$QQ9Ejd8HiucBD;3<4 zg!`3vz?6YuNZq@4A3P;^6jcDjE)t&l6u_3&m-h_xPYq7t4yB&nzGc13`jR`c586RmOp$=+{681zZj*g^c8Y-X)~#Yw`UNm(e0Vy&9ZwkN z&N3Asw*icrCatkrF4BZn0L&=3hf?^Qi=lTmVV@sdN0uYXLs95jPx?g3!_f6a(1mqF zp2x?T0Elva%B0EE-xu-Pl5@gwr`*cqXE5j)7nG4BB{4ABJo* zBKYMILEc;l8qQVT7#gs!Arll#NU$XjoBPaN2e_aChji(^2h?;ASJYqu%f~MdwebDv zz;b^!O^GZ&~#1V;qAmJs5I=mpOV?*#x!OE0iADc|wZ#ol(TH9tOW# zi{$qsln7Jl{K`mJxGYXBL>677N?EiqYO{|F$l{krme92gsu>3-Q5MZK8g;b;Y@`n9 zNv~z!a}<7-SfRUv66Rz>9Y!T-?ocSm$9Y}QNTXY5F73w{y%(H*24-J;S96eJu1vod z6sk6RrSi?m6u-f_S!rFc!}dg{gKsz?!tzaJ{Go=NRP?e4`caO;r&(6oDDfNAy>2+HLxwBME7MU~hZ3W)cJGyMCCP+GyvM;T_)_R9v!Z!q&I z%1jVWenM|YsrE4{dC#=$8XAdI-Kpdm!3=`)1ofmr@YkprwTfr=DKSt%B!yofH zc0h;jD>oTEhjjcv%BSNlz3~dl6%B_WH@F}mQcr|MT!!}To)V|ckNiKIpu76{Md9gimVP!W9GUW;e`Y@O(+TugE#va z(-H6s*}p`ympc7{t<&V^r~!-=ShKb^Jq55*TY?MEdNKvAOtmH0^irQCA}8U^^lQQ- z^Px3oKEC0HXnmNFZ}}n0W&h|}Tl0_AA{*)9mseydGY+4PuBIHDGFz>RBnfy{!2!z@ zqY+e}%BD;^GO#f`wpozZE&$3i&w_-7Mt?wKyiBHm3!=wS-4(Tqm9HHT;59%g8m&lN z;oF{Zd>z!`S*0jU0@cN_LY^t&-`%bBc_?<~(V`qP~0qbOs z%lasoL7{H2>L9hQztU5gfuwnYhRyGVFNW2<0OfFwWIvInPQP+6` z=e16v*}q*Da^(BWR;AkGu6gAE-^<3leicw$>GO*m+dGpkFSY=#UmmK=%P;v4NrH;~ zVn{G?zfNk3#Jt@#M>ZA+>f{Z8ES4Uh%pZ|VZ54+}rb+fqASw_H%C62e7k+2WMRYgj zn6~eKoW?fYGrth`6+q1sXgFT+;vNX%@(Xca<>J<&C!-x6&~_;M>&=FGcS;Qh-b?z2 z>SqCa#9g;MeCCSWU*|Ib7!J#+xy>|YKi$!TM?`C&g`-v4nQ6);lxEu0-ux&x{ld5z zC%XvqeMC|FYNLFBMjD4h#Bsq|J1jU?5wQhP;$5U5w+$MJik_lco?m3{`hp1!muW$W z;2mO%=v@QW7#JBSOn6Jfy`C^1p6|O#!@XffK0M#6m4=%!COi3jc)out4fh5s`S5)2 zRT}OMY4YLuUZ*r%yC9V)8NW1)gUZNYp#s7|+hAeb5f0i0bqw&|J!pdf>+Mwbo<<$G ziQT0ZUBni|e=7Vz2?BEMgizW@(~SPjhsWb)Dh!i54X*;)8Mg65FM$OMSD>*`4-YKq zmqyLr3ws8l75HQ0-i*Iv@Yg;mI`BQ5us+n@9v%3(yljjP+$k@sqXR4Y88l*F2JH*F zL|%kPJ;W`t*NASBJGu`49=z{@9Ng%}wn$eL?;bqw60`b9T?PdHC1z9t<(HUcvE|0H zADL#Zv9n9e?#dlz1MrlowYM(d4l{dE8H!2YH`u45$7g(7f*aJd@WBmg3ep?Yjwsxq zhTfsp=9M!C(cneK>e2gGMbQ&P4xRu@T?5gmN zdt(Me#{j!(16R%S#Qh**qpvp0y*5BCCLV+;{MpA zT+052Wzp_=d!c8t1WU94+dVSoM-neV2|P?^38v|Icv`U? z<6-04h!-`-4ovWekj#r9R1GVh%ZX=w6y17y0;j+FEJha;B=|w?2Xy!DOB;59LA=7m z6OdI!dKlwY#5hu72I=idNRo(dfQF|bl086D8Xz@q{XfGr%vec}JQlcoR$YI8++&f} z%fiw=K<%a=mqI-et@!Pam!UM#?!8m-^8M5MeCouT@sB8r$SO(PAG7F;yid-axP^Ha zk}%g+0qPKu3CMM7L3!<7KwhKs=C#-oUfVra!}Ebsp7$??=L_P&eEepP3*a~E_wM02 z^II^_7gWM7{HDjLU%#$FQjFrIQ>9^t*PNJDRdW)@*Ftj=XkM_5u;H{Vs}`(=e{*<}m)co0Tj+yVTKWz~q4Cmb{9hV;cshi+Rdo*xOAFnDK%EXDQLam# zhWzi|9V+cGde*MHbP_J#K!=2gOunJM3ZrCsbT^sE2!WQQCPtX zF5x`YTh**2??SWcMo};(2_t4an2+CuQCEn_^1Cpq4x?rH&Byb?s4GMi@_a!h%<+3w zW5pQGN9-SrSL~hMAFpUl?Y|U<3Jk=(@k#>VjSfJo**LcIY)k^|3{$oOa9ZhRwEN@c zRD5i_;6F)#FtJtP;TLX5+-p zbG>45;w-aeuUKPK@rm*1W&7j4{qYz{J;`JpM%HqzmdGeqeSf@~k?-M0<}DcUi8sV2 z?ThcR546>Tf}Mzh!KW~vKnez@xm^!L!AxLol_vQTZAxoK?ADT8a4Y!pwGGXw8l~TSP#Yx#^dDEQ8+npdjDSbNfGA28^FP#c!DA8 z;|V`xW3#cV^U+!+Av7`MS-D{<-W897l@O7m$eoi-dBVub%8e2ktVGwio{>-SBa3VQ zt{dW$_r<5|1GQ$hEHc7Oa5y+`qHwM#l7mUqOcRPy3A#gffJ5o}iqP6DFMy19-H>h+ zQS5vUR>yeP+Ua;5vct_4lP{ty#p?*0enjK6k{nu=w&%{V)BJTq>w$`u;=Ld{2A>=;~955jnDJx zIkSXktGdy1=G{#XY7`9-8>sV?NJGTk6}wjb7aC&n8msoX49vtZ!^B;%@^q5#rxgjAai?kSrex zF&|S?)Bnfbn}A7j6lcSw>T`OI-J0I%o;_!z)vk)|nU%CU=vfK0I+4XC#5KK(xP$;{ zgbQ{A$jr{N*qjC#Y-4P&00{&JWH5&;E*WIN++Z$a4k6hX+t{BEe1W-E-}^>nW@S}Z z&&*2r|NTGDFWBj-$jr#d$jHpd$cU`xdSk++CC>rWnwqjio<~|b^Ua)pgLo_qr zXHUwawwg`0tU+DKg0NHg=eXyfxh zKY5^sr_bTZ0CdrM76l?h>XpYrs&(C#MzZ9+Bh@f({A5S!$x5mMJW_r9bWiu+9c!ph zMR70M(TjFPJEENf%G0IZFHd}W2ZS}SMklR`grNmK67ka)pZQ}z^0XY1G|0h6az8d_ zXLLVK4H0gr@tRdjo`Rmmfgz7)s`33{9p5QuIF;aCO9q=Q}0kYPKAQ&Vrva)5wK-ahjYWEW&EuNV>qBscO$kRn_Nf z^TjAdMYW8CyW9m08LQvdsK3r! zl}qBd%7K*Fnl?wsq+eIaIH%xO$Uox?(WuV7ooc!=AHZ)w-*CYYo;Pkj$@4|>lJagy z`6SN+$xF&RALWz8?+9UbBvkx%M$~}=Y}yxq@ATpHT{h_Xh|}lIbWw51sgDLdI*?3& zT^^9@YgD_u24~!7ke+W^#-j%5`9>Hg8}X-uc>{cZp2)2cb8hA1n?ZtA`P~`F!L#8O z19u8;_cl$PlKce-t41J$LmceFBPhJ{3)W#v9lR7++{CBS5y>AhCPUPw_Ma;H285>@9M{ZH}Ixa2m%2l+?K!sk$pGY=;`K_XK6TADe_( znnAC;&zJtMb_nJybZWq}5|~TO^Ji>)Of7l1orab?UiJb@9#$OJdz9zqdar*35Ve}k zE+h;ls^(T0gLu=*3-M-&N^L;R*NG*}^>t<(_}Pp}tZ7VQrf2;eS$=0z#0(d7_ktu) z)Qi@EC|S_FJNQF|bH<83vIO^#2>oTz58W1=!@N9(Or zw4=yK1#WJ$Be9D)%8-v^MYMpotK23nkT&)3U7E3IlW71qMA8|X3#f=T4{pik``(hx zX-hV{mUweY_dPzx{oTV(WrKTvHA{H-uBEPLUWyh)b#)7t|eQ-V`VDx^YLvSke%TnX3Awn#!Dw zCLMfLnS_#Odkb!A%V2y&3v=HMq1M z1Tf1n&ep_5fuu_JY=BF~GWbTQSVk(H_ek;}5DCJ!U_EG*HYFe8tDi}{{f5wBiDa7l z61igVy$Se|52N5{YNozsJ2M2qf1h)-!lj2AH17y_H;*M)KnWy}Ux!!HeG*h z8gAa!SdC;YuI7Cd4;3gZpK~{}4>GOchHs74NY z9RpM)i^o7~uwd~TKPOmg9Rtn*YPB)I&ptT8k}=S-f;C_aY#dA~zSxkGy4EqUW>Wd# zNJpxSfsK|_Oe(1yi${uOIll$*6>luFi8_|I4sHi@w6q;-Ww}(l`YIyX)-vhx6BDkv z(lc9aa|bLV(}P>Y4>LL;T5Hb?Xc3F|@p~;TIw3kCZIN`~v~5wTs;U5VqH1tG_N6fR zK>so`)tl2A#k3&dBce&P8r=)LUF_Y+sCO&DzVgD5(}@a(vq)55Ck_gu&Z5CBs(stj z=fu;OoqDLvel&#Qi%-mdP~}S`a9~AB2MIK4O2;+tZMo)+LB~MFTd8VDE8QgMW8aQs z!=H}{0#Pd7J{VX3wEj3w>#Hy*LpL;=xfijuwrAckxH_Zi72q$X{FcF}`YC_Y0G96n zQ=mCYaBIroKOBtum>K-m!MOU!47#h)N%ii30iD(Me8Y}uCu6c*h3dEW4L`f*9vowc z-v1ShHe5PiI5x%pl#b1DER5EaO*3NpCe}Fh0XxpvvyCA;eM|GSM!V<;4&~+9nTc=G0nW8|XC(+;FkpO(jV&GDt&z?F$5&^6tG_NO=IhOA_xqU(`6`DA zun3P1&A#4HEld0EHC(CKsLnRq`Lh(5ZX+7F?YR*Ad|b0z1^*7 z*qTV@eDG2>uwcROt0%kSXOfGFz9sE}OzvW$aX*>WRx-IyGHX6<5dLhO$>fj6v=6*_ zBa{2y^}$DJR;pZ3rr<(Hz$I?4NRDlg2>TbSCGH1fpv-f*H6{U!C=Eq?o!Ik6o&cThl z%||&l?KU4lfb$pB1zeYeD_OxMgEMtNqHBp>@La~HSh{C<8cdq$0m#I;M{aQD)hps^ zSnl_VV%qtztM0j|ucAI2%oh#7LHx4Ck%I1v6e^sh5>czo~l- zIq8PChHT>27SpY5V8b5dr`Jan3#gF3wggz?rw7ezz1O?GxJKY^Lsv&=%+H6WZcz#X_6O>j~{YsL;}=ofF!LBB9NoDHd8{9LSwj zgmz+(&`zk(PNWh#KA}SEfvnIXMv<;7g+z$Z@+&$0LMv_agw{^`Z_G6aj52mWn}Z93 zUmJ6X0QSj%OQBdT$nsHGP~tWVQ__OkT;ETDdL5iga4+@2Urt@=xD3L@WK&G1zl#eKkPYNTxS*Lb(o zSgM8z6xzo0_e;1U`R}j*$IyY{gPPIrTn7y98jdr#NPZ4KJ@t1#;DYUCesMTBb~6Ll zrEm}e2g74h90sX@#}^^d5^You9s$?$HzO-EJW$5 zz>ZgPH0Mw`?+UgjC7^l?rTPeX7YJZDt(hTq(RNx3{<#taFZ69I??W~tY2uN?uphUH z7TxgHf*j4-crB(l<%>!JWu!2HL%cA7C6ZslALxA>d6>^l|K-}BjtD(78ybAVL_?ST z21G)#qoETZ68rX>BOco~`4&BiZD!csYA2Q052vR`T0x3hwv^8I$&XL_GvT1Lq3aYuM@c4P~3*5xedjK{Fe{l1>4a3g#G=kTLj*^zzr526q-1yz%+ zeX=bjuSH3-FfgjqdUK~T=TQ4pdz7B1u$&nyS1WRXYrs(R6|4gJ4h z0tTbgUWE=eILn&EVsP;_aV&0PZS}mRXWX*EYmr=PGyq#k;C{e($Fq6g?-QB`l;cK~zC^uGOJ{B8{Ic$l-O*xZVSrMjX* zi%Rtst?YJS;wxezQL6n$;Lw3$-HGES88GoCW*TE+!3V);>1tJ!@?iPaK?E zl2({)7I$DY_WMn_!!>0U4@%b*maun%rfQyaH`s;ubd_8i`;sYVBJKD(~;)mNQ1i2i*v|z$4@x#bX$=SmTcTD<{)HsP(lLrHW zZ5GyqQqWlg{&Mn|OhN9?o`iC^lAUXbtexC&BhqfH_@K zYw~Ea^V^cKYt1sgAIhtfh0fFQ`%>12WWjpJK7)!o za^P=}H$=jy1%2){sw17CE(nXjsZ*y;-^2GZ75r;f__I2m6MeLlL+e!KKj93~QBQ35nMj6Xs0BFHsdyf*_A zJ*hB63X6#|s8{UQwb=Jif2(>51AUK%poxAC48oW})rDV+hhyUlq+a=0e9(O}5OD6& zfyH9KeMKTVIh~=`ii;zhAAfB84WsTRHw#JjLsOlifVIP zAyaIHFVY9yACLI61;*dpn@UdpI9t#u;UiurrJ`P)`Z>}$-U|6Wpqn1cZesV!m@6#l zeA-P1zf^l_tLb3bsT3AGhA!qnWM93=>nmv*!(-9KFT_uf$hYbJF4pt?WA0)O$3n?i zxr;e0?|T=24tz@|W(?f94|@IS4?6ZIV_yrIyJ~+T;-R?YYW<0$hvI_A(4UA*xHm(V zM^uF!EdC`P=AS*q{!;@ z!bpa~ItK{VZ%Ro{FAP5@EGh9C95XWt(a;vN$r??e_;R+Ox zmwMBSbi|}iFE5el<$A68JF0g52gcpV??u zHgx#dUi3unz$<(6N* zFD$v5+~OwQ;)2H@x4e6o^X-~6_Ec_hC#h6@>~ecnbXKtdt}M4_M`sroTUl;-@$P+A z9J(V|sM0+jZ`b_^X59ikfojA#(K*M&nj3*hBA50>`-+=5fHPOiB5-bWZgHsrj5%F= za&h_YvGFCd4$+K-y=fRQuH@zZ-jv^0YoCeB0&0`Jjc4xb@?&U$xgV@N(dgW-WNa%l z<#wa9xn#dtSeg2Hqcc*nUndMVHoE_Ul6JPBz0|CFjK1Lx?ty|Hd++l=U;eBF0zDS=IZtdq36E_1X zCMx(TCTi`Ksh?R)RKUYcz=Umo3)}vd*a*Q}OqQ=8Z%gI*Mg>ug$B~y~<2R|cJbE*)v+>ef6?9e*pL{mhQ@}Q)$UI)-;Uwb8w?y8s{??Wg@UmP z9{vgsRpJ$v&M+6bIW$&7;>Ve5NVcp)V+{b_OF$V9_);0l;o(L+l*dM{1Ru!goyuMcWrqyG;wqZV#vl+JGvK)&!k?dlj%H@Ri$Fc&u= zN()#GH1vNO5+>ZtQsmR`<3YIbTX-MY5=+3t7~8d~RGQSYAf|ZP6Lex_3zev?z)qD& zvA0l+nvPQV_t3JSDL~ zE(tw&9&Lo@Xd|efHq*x22H+t)hlikkJciHj_wnpZc|~|hzP%lG$auc@ zH7?heAMkN`{35)7Uj+A|bn;=^`9UA2$1lQj?Iftbod(Z`2H+t)hlikncyPr|Dz6?r zgy--OG!PGNh$+NFcn%LiKAtexjef$noH2gB^aWf(8J`M~PTq(=vyJ#h{9ujKK~o9Z z!<|adk{gw%k5mGF{+s`WQw<$WQx{Ah!F&2AemYR-$Uq*E>Z$9d_VIt3B!W48BMSLY z5wn&G3d%|Erby)}ejqVRKNY43=M7HDDlDA7hvd0GibR+)HNN~OWDfe_$hpfOO&{;z z|}%bzeg_MN-@$@KA4xy+x{%%4khd?9`Oq9%ToKbx2Tf0W}+y-cl7!B}$B7j&?FDXBoH1ca>^3JGww;{Pze z|7CuEWPUHB#DtUaznS-cl=pCnVwLHis*==5Hb6EDT zr)~|etzk)&+#8^a@=&SLeJ3)M5;!vO!_gmrxMse_i`~fWc^EF7mkMu1g^TB);AnNo zd;->b?Jjul=Oc&zenIY?9!I{bmBD_S#oly!$Qh)+S%C+c)cD>AtCMC+p{Ifo6eMwU%e$#iQA@V@Bo+-f%P?HC6C%>9P1P;hsGG9ocZS#L%ai zdNiUlNi<3j_ty1j)Z`i?h`Z~0G-h(GBZzzIdbCb+!KW)+f~RX)<=M<*?}dOfD|g+v zPu_!uOMlADSAb8Li*(j|7jnnn#So!Iha2<#HYJ@gH%$kVL9qB=SRU-Qt-0AECIT~U zZVHz^h6->4uH1o#U!5^GX$ydusut~7+{W+3J2fz!#u3!88a^I93Ui?E}ama{7}s_H5`>4? z6`R1JEhzb$kLOErC6!5wszxo!DfyoIpG}6ZkX~&ZaMfoqPkO{014l2xPwh8$Pz2&Mgj;mzJ;IyG)2s{ln%c924 zgw(Qn8v1y*9N}%1iZ=A67os)TZFhG2MMwngfi}PCe=om3GZ#@|JWo=wG*r-fNNWql z)lq@!Pcksk5?DR0i#DUH-pR2nAVu}k)QcmMRN76wH1`r61wLPIW@OM9Y%^x+P3P*O zdTF|3y>1AZdO7P79pU+UU0$}AbFt0n*L&zIDB0J^oTjIMmb*Vw6Q^lR2<>IUz|l=6 znaIT&N`cZeq;Sy8SUt)}37x_?9X|ltG=-|Ud3>|@eTRp*L6k?_N*+d=;_qOhk{NY9 zwDNR_bLdpnK8lfg0|$2?zNL_|;FV?^Bfi3pW0~s~kXA~*gUr)Gus-0W+H-VM0F`FA zVrYK~?*LG1Hmk_Z5bde;PfXsz`OT!nKjbL>a2|4H@+T>1J2COU@!NxmkPun{~RiC+wW(&mB0- zu|ftz4(8nx(O2+lZnRHfRLjIjSeI(hQm+!!Q4Wrvj#shIOYw;)FkEX?r(X!z?y!T; zYnI|2l!I|RoQsF}$Djfqs0)H8cz~((S13$WbyU?uR$dIpu!JdGd!jsEAC#sV@d2X2 zU5R91!{YA*yPnL-a5XL)*>A56#lKtDvC<40OXCMr8H@!8=NLMNfaGF93p~HX2d;nB z;7YUwjyM>!rU$uwrS+M_QH$U_dqxZtUE$x+r(L~AwpL?sAtToDC_ zpM$)O4cOfB18n2Rp;|ad(fg!t1B}4GPe3L!n_}!jXs^n^5M;MR%T*f1u>UGvzDE;Q z1_m{ZMym`A0dBN}WMGI)qrEBvgZ4D$JJ`SKd;Btw!jy3^k~|YCNV}q=+TP#s+LyA)jc-S-_=-m>mOl4ng!Y!G3_F9+ z^<_bHh(FrqB^pB)=0gQ(8zq(GgqqqzQ%wf8TrqK}wI@buslmr;(%D(J9HFep(wM8T z|;7#d=<~hT~HH5P2<#512(P zQ*3{8B22S*1?8(~qWf5lR}E^Gh$dHQs%v?y+_LAX*8YnoJQ@qXmdP^^*fWEN=vkp? zgCv*h8~IgQklS8GkN4rcZ*d0KnDiy^ZrBV^hLNhI76IARgME;@pLmVg(ZW9BaHSE} zUaXhOl}tLB0#Y(C9eNoMN%48qtl-eM!nL&&ya)32Q1V424FqJ`rLxk8Oahx0OixJ% zT2^{pL=gGXyK-$vdk2a|hF{t+62#7`&YQ1p@NBCboDBNU)qa(enfNXYf0Lc8xXMF% zm4sBv(X+H2==8rZ#uXo^1w6Q8AO7q+ck#gh#19c@JASDAPQ$1kOjq$|@g`u7;pT%f z2j9WZTEQ*BJ|}NMBDMhWrG)KzOdLa9I6^x|jMMY#5t=H<`{ROP)c)I|WBe6hLe~jF zc!V#|>oon9@w`M>eg`Qp+M?u7E+^V9j_(tlUd|JG0E z3(`wLmsSA$xA+sNltT96Px(Xwry1Tf^%UXM5mIFI{NBDJtbY;uY2yfMTKpM{5NG=c z91Y5?BY%&-@hn;OeLn5s(?9SDeO*2Bk9<0nPydHcr|{{Y_=FSE>XCoOQ~Suj;O~|r zKayuC-Q~$6Pc-2@*n$!hdoI|D6cs z4|^zskWe7};Xs7UU=aS$A^Z;jJqGaAFy&k>M`$Gp=Y;L zWi(CW&dH>~*jdKLr957Vs~}P?jiG`y)H}@K)=TN1*(uK{pxsMqD3Wj^Cl_^b+twLN z@leTv;%N{uT)u`2jAS-R-pLl!aAbFjJfM1(z9#v&yw;Pqn_uqNl0V=}nLc{7*IkHR zUBG{*;op<+@0Iw6Z!QJhzrvqdjL6(-@;)hluw2Ky{yDHF`C|dZKPJBS^SKKvEOK|e z+#6QN{VvIkDjn_!|3}k~;b*s3+g1?1?-fBs%#3I6!w(nmH$s`c<$c5HV}d%TyY)WqLi#IaZ9DIm^sp zP9oy;SdD)`)O32-d`cKR8!dk=$HL+eDh5)H_@senm}X!RS&wP!75fR%=>R`RRFBts}ur>S&3P>*&daeqXFr)HT)*>6KnCF|Hd0pR0+&)$94y7AJ{ z)+R9AG+YPeAevi_<}KvS1A-k-4%U&VFgPigf4-%^7W8UCaD(*Sdr=|c(z`Qd(#|=o zrh}b!#8;em99&w~%TL?{MX)$R46_+Of{cE_JMhkc{J9@Mry#obu}yvswp1n}uR5B4 z+;rw=b_txz;+yymC+LLgC3ugTXWAG?y#()3JTeL?k?D_q5S+jYOOV9* zMb3XZ+j*J1$7~HPZ<_QnZP1Akav>s7!zGRN&Ov2kRF^K=k$jr0r-^nxQ6nok<5E9? zR7|%dN@nKyYvvQN+DbJhoBu5A*<`rmJ`XQBWMPBrEN11s&&6k1bq49l3=;nYwPI3! z8M?c#pS>m}A0oMF=Owr2-isv38l3mV8z6tl1pfGS>`0`L7?+pPP&84@*I7cGEN@Ch zSw87@Dn-;M>61B<$YE>?IeR|L&*+yC!Tagzg160bw)?>xr+jQq%4jb26F!zBjos^~ z7m=Rj-c`k-xg(LHJ`cr??<1GVNmdq+4q+UwNvahK9E$Dz2(A>bCM|SO3mn5i*WB;3 znTM&uH^*8yxf&Z^mzjF0EM313Q%rNcV2jqbk~TXSpD4u)-)Z6tyW^dy0QR=18jUBD zNYlw_Bc68Rb^(kE9877gkWQR7&3+jlHT`E1$h$^yR)#}+JF8RjgkV+A0$uWO5;X_Q zGQ@xzgPD<3v*WoB4wU91rXH4kj^ok1?0W<#d#9s3YNZ`(?z?QXZi^0cXTw7#{mO#0 zF=d<8s@{ZtWZW+8ETZvnf`#*SuoM5f_;(5Zb@mHghq<%TeT;>0hh-oaYaZ^j4CG9O zaK~jJCn|(HF9R7@NV-GnfP7LObS9N4-tI|vYaj?0%95Y`%@IjC9!x5o6@d?p`31Q`9psJS%{%{P*uo@QMm;CrVstOTv!@BAhp}fV z@0e}xJd7m zv)zH72hYI9?04^)s6YG3z$138Iu;W-u(`8pHfcd{*JQH->r%1>%{zEMe8V@!$2Bmt z?h1AtCpttNoN!4nLHdCvxOyR&#Hc=QGwcZu1LO@tt8O-B>nQ5qZuxwy*}(Z=eri|D z2Ekn|YIX&+0y*?L)^+CngO=762CoL>jZ&BN5EPawj*3)`(`h-ON(FvEyQ4}4USt%i zP!+1bhC&stpitGIVw&l~7#hr60X~V6RzUG_uo#8Gbg=z=t7|oa$2?JWEwnxwc;BDaZP2}?`L_gjUo$kDKDyJbhyz8k$vVr2=G zm?TZRU%N`X%~+cX7Jl8fZ7BHd8?P4?h&yLf2)GtA1t zE_wX9JUU!&78+nN^J%zHX&@9d!0^{kL%y8QFsPhV91J-cj*~~R(T<>9H?!ZvC0L=- z_>DQhF$r6^jhl%PH^Y25spik}Nqml)|Hmnr?REnQ)i=P2Z ze0RYi76+zQ(gMR$isOV72jRIG6M`HX*H(iEcBn!;gy--O)Q`us2?|+?2Y!Z@XN21} z)zBusi_Mw*Hf3Q{DlAL5UzYE#tk}E5C0LizvM{?_oP?KlkCluXd*Z${){JB@S#9&A z!^Eq>3X39*jvj*p1`Ug&8o;AKV|hxgJxyE#c{~zD&6SBl!+65Z zV?Ym!W#tA(6_6rbzE4Ml`ldF_c%`I`AJ_up6OgC~ORC&{AF4*Ok*Ud56h9r`+`R{k z3!=HVt@Tgo|HCiDkk}k_Hl4IWz5n1;(}~3@%7{LU?KSy3*vH;nL*g>M&&+ zv>gp%dKf=f2f}swlNlDao(ol;VX#T-q55iMgK#SYj8)@%7#oCkfLUCIW>|evT(c=I z!V6;62<}7a#)-iRyGbEV!ilq;iU!FfcvYOR5*6YkyZ|S`ML0v5W0cPLBCvWEVF(@k zcJMhS{)S7tP;@?wFUHHf9*ep589qY?N@?-tB*HEKIVbVmO#+thW-fvDl;ZH_B*JrZ z2|*5xqs8EX0jm%X;W<16_2b#5G6l0!ipOgc;eMO=?vU6vy;a8yOa~T6DOiLo!C=j? zM7YKAWblRW3T^KO`=_wNLcxcIGQtzWLr|%)cx}Ymz!Z#X7%_2n*fuFZct0TmcQWD9 z^Aa_uWQc>gk1ivRux41gGO@LU7sxolVf-t=o?_%Wo{5RY2D}g_;RQGeUKJ-c<%Kv2 zFThFgV4Oxiu$fPBdU8g1PCf{7EOhNPcwh=B#6x%v4?zR*V1rkPhwvO8f(GK*JOB^j zIXndQ<1u3yJB^f{b0M>keabB1R%TCu%<^5KkW)xwD}ELQ1QJp-VFOQ2Ua;Rw>%q9N z^$?!xTUJMKC=--c*IuzY`cy*UyO*)Bp=>;-+3sl=B!cNlSYpInYNkJF3ryL;4(8ct zeFbzp954Keu@z`Yf^GL^h2NZq>wFWxH4j%gi*YQJ#dD(Kd3PQzwBR1!6pkaUlCFht zH5PrdrE1~y9iTn^qk*%k>D?d2mql4?iMj;`W@=8MszP@h+$Y*kD4%axrVaztqJM1G zRr`c5eEuQl=tA3Cmc?=URp6ekY15xZz00x`wasF%m-WenKJ^p{<(;}>>OmTtE7SAA zXTdmtVfw0bTZ<3J_G4M*+qO=bQ`?qhZkjrKS>}_;Wtjq|E}A~V2D(3rPlofP!VVK_gpwz*ujnUYiqbr4(2aF~P#qkg{(HD}nCz6mQ{+-&RP89kU z9<45-tmj1mP4lPV9=HJhHG)O3ud%#Sip$@l)oWP*>}(`Y1phEm8Thju{KnrV5 z-R?z=-e6qCIaAC*1jhj$O4MP<#(Bfu%W%w+C$>Hqze(~CcDG{Aq!%{DI{sCV&-2~6 z8m55&pD1pQwwhy|i~5>`D7V23F=<{c(HKx6d?gwM-H1+^eOIQX&Gki9tY4uDljc{k zzTM+3I;?`7isOLUTk@yt04|migo~Rj( z;~)g*3$yQPH7APDPON~|r1@wkz-h$80BxBE6X0}Smd95>Xwp1{upC~(!57B6DI7e# zc!Y>d%8VcG zw`^!`-O$`tjW&hx=^%0Z_@fgS!vGc?A8kp_z;x1_8lMgiajrIQ-SS9J!tts2{=m`0 zl10CBlZhUVCIvs=z?=Ets+lt6P9c2w4Z}tnYREqh^E)ru1hOL!RHs%>I;Z=FxkYR)TmRQr*UgMq3EtrAT!Y6yI-HW=1zO%Nv@N4Nc6eT$LwIMUby7 z&$5Ok4e)nQX+sC1)&fg}ixQY`KUDyK^H_IP5HCJVo`z5jF1Se@WwA-aUaN`QmgXK4 zqVuYo61WLbupfxL(n5TQ={!7#@!9xmBJn4a@33V%CQU>>)I~5_%}1pNDYNrp(%%X`I0O8|P)u zHck@qjbq#wFUj&7=Md)`mrd{*mrd{*mrd{*7YtFdc_CNLgeym|!qMqieF&8iRtVcByKaP_ENKcb@cRn3*wE-{bFle4xjn3?! z=cGM4`>_R*AJH2!2a<9HXy-&{vQA#pS&z;%b<%d~#d*Q9|4s^>8ZDtG@?xpBYSS&% zrZu)s%fZvv*!N2DV{+xTSS>fJjN9T;FZNHa{JV1H$85c(M4rw+%H^NP)n_ZB&*m$! zuDnfjO)0L9C|2bpppZ#)b-i<%TiSG%XY zkQdy3CMQD(gfPQ~bD7Bk3^!0JaJ^HP5e=oOlYoq2iav72Kc~p&J>(gTP$f*rqV|Q4 z9D7qBAEkABTIVO~z1IVZ#yK6DZW+8z@><)n)3({^7}H#CI;JJGC4Mg#AiLQ+h<_la zy~Qas66@DAq%_%rXBe|((oi(XFejvKgeO-c3+ccOSHnCz61L-NO_iZDk)n2uQjGmV zM)sx)EpfFd@QP!9dJs2szk;gu#zc?(Jp|a%ZMo zrF$3BO1aqE&jJ>-5H(1tV2rTOSTGA7Z!ck%P(2SAlF87)+>{BA-3ZD!660TE4jwDE zg7%0NAFe&JLF_!hluc)(d|674UzRzwEQGB-i+vGyni%)&N+UeF`{cm_<1tP{#&;MV zpv@ldDqVzz_VIw>6lmZ84qymM~8E2c@fvsqjBtp)P5cs^Dg6(drd69wxuc8I)I!#LvVZb|x?8z_knhwIJy9 zpnDeBl}Z@>5|5RExW>sznCuH8+(J(!o40DXMhOGQR%(AxSipD$r!PsO`y3iAk${;N34BTJ(6PBm$0jz6FOyM? zQG1BhVa+d5Pq1gwbcq21)PpvQ+YD~(_;Xk=bZ##NKS16~#Kvz8ipX1$U=kRYjp3MP zfRNfEC{<=Co#K5(NYo+UUtL>R54AfMh0(KadJQlJeIU6T~?9Ta_4 zC<^04Y)lw0>(62N5$+^cgCT0;d&NWHX_LU(hdD~pCX=Trw`hyijPVu}O@1c4k~}SA zUBJa3&tzuNjZ)ta`2aA;Mccy;m?~4Hr!&TYbgdyV}f7lVB;$`ivKj2>!b>P_M9R4oN(pgi^r z(c&~Z3EOHt3IHoW7z1o!l4r2TGjLoo;AQ$Jl)e_da9sRS((rF0 zcAbZ0N+eo^?uSmvB&`9N9amok`7q+KkDUe$^S%r&SZx3{#yAZ6O80GqD9DWSWsK%| z9es2WJ?+fc^0c7&+plw9?2Cow^eIHgtk_iwwv2L)DqkJPcH4 zYo0uS$e`{cbulN@7#n{K){F17S|z-cpAJmPlekWlCt@UU8R+wt-BFL)@2= zDU%|ml3IlMz(CA>DGoDJJj@ki!0?P4qzd7MFlWdWBCvg>bw`z`%2>lkB2RKuq!woz zBhW*bM^2KkMaSl6?`w|YJS81rUWQY#Q{qI9@kK>~duQCt!_mT798l4emLZwM*;2DN z?dZ}?(lRx=u*a(Qt`O|Dsr2m26oV)ehgUhm0Nl9+B1dsDR!suTMVvWF6f~IEfEI(L zpx~;67>1HK!$NR`+L9%$AE_bJG?hnV#iV&G;>~8KN@z%DeE^lyvA+ioW$#swaByHW z`^}(p0t)noa|Py6fOZugCjFghcTJd7PH?7*Yj4tpFL^Z9tc3$fC>)c8hzkBTqZ3j= z^A!5mfL=2lnDtb>*;+bdSgVoR70|B%tQB^iYRH;_A=}vjESx#(I`95FxPwWz5!C7$ z>L#aakib;d&=_d_v!4oUa{OFPa2|}=SaqI#s0Sz0tcN^n$cZ)U84qfUCA2HSE(5t$ ztmEydnO9xR{xz_%KsCVzTGs7Ka0bNoeFNv7cot7*1^kr3e#IRGE6&*BoG zFy4XW{SccY`wn!%`T_!oLm>eNL%6P29-~To9{1PmpWHvc01Lm~y@D-5d>$ljfu{T0 z@gR4do-Yuv#z8J1B+_d$WSHT*qJ61m=r?PA8hj2LW+TIK#={MVRnqLeM$I|`Dx+Ei z`)f_3L&70F-?zS0;_-{c59@q2_{R`m16Ce#yN<0ULcG5LAS&qQnFR*!O<_=J5Mw=3 zTTq6L%GbB=*ms~=7SN4&@(ulFU~&S9D)xvfH}9oa57lsqjZSl86!wkR$5^eoA#C~E z6WLzW$LnI^9|9ftJ~nP!P4_P@11pNkdXMYP#1&QBg&9fT&`LN=Epqj&!8AD-)9N%K z$Bm#m#pfY|4Sl_g^>mwL*mx=BVWEecu8LQX)i?=bg5_koQ6ndb*l-fJ?xef36*yV5 zoGie!5{`aO)+{FrFlp{p@D*}W_K!8?r0S%V;IUY0{y3e7)CmJK7i~|K?%7BUixiqQ zPAUVY6QiL>WtdXT!U+2o*F!dE-y!6P>iuo3D*ya~UK^+?6%ZrC3@?<5nfJ_luE@8!_v=)rP^?O63qF?ivY z(u6rdcsA1XSe&=8bGM;Ddbphcyw zH?*!CHl(UvWl*OLvvMZH{wx()(?@Vkfkj;VRGm)jOMk(@`k?U8hb}0e3_5W8>hDNT zP>i;h)=sY#SEKr)m>S`U;_+2T4I<;7qFD^hm_O*L@*%S~!kq)bZTUH7kAIe;j$X3$ zJBZ94vdIIu5HV#a4jZ^PG&zjG>yebFL_>N;J2VkfdWN*InrW!o^R;b6cFm8P@o1%t zI@>2O`f&pn@356oSn+X0l^hbNLdYFebhA#m1>?JKUkjbRW-YBn)m?0=dBPUes=c1q zrXYgSOxw4q1)H1MPjZ+Hr3f-jjnLLC0yLJ}9FM!`D4Y$>epKybJpX#X^pnSN?9iV| ziwBGX!V5#B_niEQ^Qb4e1zFOmR^!MsG{8pkrl5mbMqMqYC0++6|COtyAd6SafR4RU z*S%_hh&tO=+3%SazYv_q)(?$700V?{gxLcPL-8JhIJsj{m>pbjPpu%hM-4-|TkwN> zf=-HB`)3rIX$G~J10C|A0^~yjB8S*K=(CmJrLaeQV69{B@yP7;NdK6-Q5Hts8D}|# z^H2CZ!}+E?Z$Z%$k8O{&hVK4+c zo-9MKpU2=0x`-Yh)FK{zm>yb7i^fud%*twdXe>_-l@_f}5ty~qAXuMA zFmMU|=t@0=71j38S|qNSl4Dj+Lrya9${%adIQZ}ly-^pg0M<$>guFd{KX`~a>b)4sM zI&DdDy4MU&2Q9`KGOog$mv}=&&Z96dGX7A&dWNBN@Cd<_;U`lyBm?u1568KP2j7YO z9}|0UNt~1$p*kxMS9N!f*|ppr?Ub=51VgCA`h1u;8J;faJPpf1(P4uccl2C?anfEn zGy;WM-U)@dzyUBCq0Jmx3Z9H|7iVn$GeO0e!+AIrmGo`Qe9)rPD3$RnK72uE7xL1+ zuIE+E%eTV3(!N>%J4x^r)>qO{&+>-h&gl>h2`yNXz=9=-DOiGS2n!Ko0yBo@7$+4~ z8w(l+%fR=SNz-voV3) zh1SyArG57}{AwRa_L&Wct6g6*S-**_;(COxnKKlWQqp`16l^Ha;-%#8wJIAE{~?UA zaOq_5$cu@;OykiBMLhb+Me*qQauSa|sN61k2D}_RG%@k7kVnX=#^rxlXuyk41I+%6 z%O?~xoKi$XzMRl7sGQL7%9MszSsL_A?RH)NPbCrdTb}z|KP(Y$W6DlOkQd*fYx8Hh z$LDwmCt~Oho}J+bx4rS_1{g*-uCxv_uJ$0mtHV2QCEV7*7*xJn6yTNO*dj8zbefL? zRt`I63D3pQ5#-S1@ti&Y58*jH1oh)FZ92oplb($(5pLVWfONh)ewf(yGySqBrEMYH zi){~rH1?RNm`wYy^2Nl9-rvXN@s{vhtR8U?+=ru^;-~}%L64l_n%MS7BC$WV{W9QU zu`nL(@Bc9V7Gw=GFs8x#!HMcAu+AaG{Yf;^!A0#_WdHiP&z)yGqeuCGA-^lF)eEgog5N_p`W0CJp_^r&DvG_nAhc^}p&y691 z92(bFgXf$9cnHtoA*dhEHk}*x`FOlG5$?B%?+%G=(??X+&P{QYa4(Zx+m{HpIIaR; z_#O)MUdDqT5F$PTk+<>SkK`Z-tfelg9mPV>D=JqAv}kNpn-TEGyo6b zIXnan#B=cgJcQ@)5Y&&yjOkzU@lbd6;8u1i6wDXK^7G7GCDi$z_@L2Gk-`ST+`3W}^Y|?lQv+NRwHkt>eDEEJJo`WLd@;g3@Jd3?M?} zysxPuwXNlclbsXGmnv5u!JkEJof^xR$s;@$8p~80!$oXn8q1H;e2>2*MPvGBH@^~(Z$;0{Az}g1(2*Q?S5#6x-IF|ecM9mLelZ|3%wmRjEnrL)f z>`Gnm{9{PZ691;b^8!0sJq~483!a~s;_~-sHDrP9;9v4Y8cM(ejY|lGC0A2A{M94LlG9|cErv<0!1@Xw!<4nHXu6kHYh3LfI;uo58y?@ zCgHdKA^SXvAo}6%GsVCtdOfy?6asut6`MJHTot_)--Fz$?(f4Z3=QIGbUw_hYb=t* z`Aa~OT)}-Ns1g!s#r#_i`!!)a59Q$(0;0y(o7my?H4PocZM6M$A!a)=(UE@BNQNYd zcSfewE{SK;<6~)1ag`s36${WYQaTi^t7*(FG+t-yB{>P^L0n(PJ8$=1hvQEPNu+1C z4N0t%;jmQBz!&Kfa!n!)`3=Qd&3uU|{vwzm_u9fqid_A=?cZiQjKAStCSlxrBi`cm zkipr_zA*K|_?<}U#c-2p@H5$bW8n9f@XPp2gm%w70Ufsm!i>+;nrK|yl!~LcYP2QV zxVs#+5ycAM2F@3V6vnLHNd8RvIobmAEACYFYDAN_Mq6h;Ud4B8;UWrQ=sZ$u!@g5K zJ$nIUb4svJ^ykvX`MO{0$k%a(s0BTrZ?hyU68F zBCp0~W7hjDUhug({2dUw47Vb|`7q#24&aZ3E(_>V2hz~M6QUDl7`psvR{>Ceezgi} zAfT@b9Ls1da$5IeS(}mig8UWa2P@P3J?1yD%j7FN6p{84-U}zrG$Rpvqq87E$7VqS zM`j@^dSj%q%ThAs7G%_Koh0g{IV<0_+_cr z*+{c=n)qdxpYh9neYPT=-#!J?^q&uS1Aa5^V*iCu>6{t@T` znRFz~M1qSswh)%AQ8TsdT?5m~H4XFTF6hCH^kO zKJQ`Ap!7qRS#<{civ@cwc6sJ$wid=Hv&_V)2m(~<9kCjt%#dcrBwq#cVQ}PHlspyB zj7erzEtWhQpycUClkECwy3iVg{#ZRG+2QDmN&dNzBQZ69 z4`$?Il1;fv_lsmyE+(1r5)zZl9)YLofEZ-qm@Ex4i{|5qy%=PdQ^b)m$O1_xmV8-; zV44_Yms86^ASDKwa*e_3#apVZ(+JEMN50z%<*JBZW{i;<--p}Q2x|m1Npe=OYq9}rNkEFLv-MErZ0;* zf<2n)WBSS1*kYlZ{h5m`CcLg)DY3;aAA8h>#=1tUOb?Ft&FFIEUOu+iVM1)N@-H7- zEIHB%W^i2@g-Pnl#TGkEh%H{BE>A}`OGF~o6J>k%y@)Ng62`5mi7j@`UX6i>El%@F zqjIsuE*1B(tx z0KAOAz6irQ~VIpInYVdM1jXY1v0> zFfgK|TXLk1uZJjnqYVX~RCv%qo1_G{LKx69DAP7&a6uOLI#0v0WXZ0Y;$46!b8nSL*O+D4!kjE zDQ^WHza8Y+AW3F#ZAW*>eabJ1#{kuRSIuuu}wLJXB^CvwoH*v^Zgxnc3_YC`a4!Od4xrsxjd7&^4 z`OhFfi&vvpz~s(KuFDE98T~zZ#;IJdl{^%HtZOP@JNh=%O;*iRvYR)p#AcOa|W7`C45S44TMP zu@XINs1>6tr3x31$!Inau1v5dL5%vn|0WTx9|i?}3?wylF9z~F%r2uc?pq=ovhR2q z`1mQE*C>W2)={l_#^yi;|rf-KdGBtI1g@?n;0&(BLzIJAN-RXWZu+VSH-}!)$@DzF}z? zoKw^+ItCtMyLB5Vq-~D%?O$MYar25M7yif( z4VqLNE>r>gUC9ek(u6-!wRGW+EGKC${IQDf&@fCoLKLD%a?pJbsYYO?p&HF~c$I3z zH9Ck=4K33_h<_n!=*1+^da_iTR7*AX*l9_&$OL=BV>nB-q&cdGN%e3vQbk2dby#2K zWb8Z$}rfj zt(pi@29kK~OY?Fniz+AB5Yhr{q&2E~ftrX+SpgMh<$*{{HEGOe#K^~j>}#b82=k$j z4jc9&``I0a0~mLf0~s}1B0nt$5N0XmvpM=XP`4b&W@JAzG<7hNeh$_EiuT za)8*dLlO=IU3{LAe%x}@BkLRNX><6%yC?n#HE^u+#NRwp=2C(821GPGUw09h1H@mJ z%hU$khldyTGN^aBSB$Dq{3+eg_#MruNE`7#f()ak^BK5M*efDvBUWa!T|ly;QPTyU z%#IazzM|6XDq-(mjASk001c`r?m(4awtr!MsNDl4`{!#IkGhz4=F+0V(ONdA zL1M-qu%<;-EySfO$=RZDnE*SgZwWj}c|eUhWbeN~8&!Q?zZL%ZW6`y=p`$}1^$W{j zPaFTprV#&dX2Xz*uy*A#H=+1GEc82h!cj)m0I@5rD$wYXmEaz9;1`63v_Ie%A-2fB zLmEEWk?+_-HPChf&&8ntewj3x3Dk7YI8w~!UGJ3TDayYi8`gjJAJe!?$03Kh5>#aC zVpuM{f%9B8=}Pona^_U zs??Icegg8f;woeuw8KcDS?x9jOYPntO5pYo`%s%dq>a+E8w8QZBVb_i5H>rAT&ODB zZ_zMn?oWg6!)1^P5=lY4)o?dfpk*}GQ^#oaRPh;&wXKlRCZ`f;99)ip(Nu07qcgP% zqgSc5kI^0hc}6SO&~mJJA|j@?$h;fIUHVMY^U;!_K&6{fFNZ6DW_ z9HAi3b$pW={6mz#;U9c%_WqRHZ=u}^<3y)x$(itFJd-P$$n{Kr*x-kPuC7NJ?CtKB zRMg3Kd_X#7d%KVA?LlleS(WYjax848w~u3crdnb9YSs3!-J>ASb|>sm4Mf;Yb_!6!yuhjA!_ai{>JIa|93ZAfECX-bjE z9gX*NuVU^)5b2!~MC!l=0iW5pN@0r*EgSDiPXPgo$=O(x)gBvx7V)JhwGnm$9>J+e zjHZASZ<@Xl=~#(!>FZtjnM`uFEOBF;=gRIx*^kjC3)3#wWX6y3ca8C*#^8*Om-x|s zgRz>)`r=2KQ41AVkzrY;A=cTk7QLXkJD=t;kh;u)ZZq9=ZXP%2+!dms2`8%r>CTNluppZd*ZH4;bB1e zH~9&-{l^#(zV|hn{MwB&dj9gIFYwM!2wo$3BmT@b;v4aU)r6xAXIr>*yi;MIa8NVz z4nGDzO**D$u>9Qj_ya^L>$iJbI%BX;2$ME>Fn;5Av$Q|H86+C{RlaC!*#E@0`zitA z6XidQX&DdGci=VsqX7yc;w=^5sS}q)+NREKwOabgJCPReU3$H>%>ISvmvoc5$3K;j z#mmsX<)`uS@XzUA|8#kj@6uhBX1JP}R<<}gTTNY3a z8Wk6e%aPrDnJ#tAy&ats;~=;(3`0Ikw{Vh6V3S8oG-7+N7vgpCBK%<{W=@_c8RYQ^ zHgPiPsPo6E$f17sRd_p40up@0tq~Y+?r@3o$pf)_Z1PgOm!iT1(JT#ad{1MwT~O1kVqa>q;!8^SppE%t4bZZte3i68 zuu6&vtK>zDQl-ev5`}ElDjQYYX{K4VN<kjY!xM#c|bY zMynAno0F_s&8V#=z8{*;+eT-e30`#Y0?{^Z+|Bh>TsN%8>q$Dc3~*sxpSrM$e)Mk4F}S>2beKC)26S{m2Pfd}?;$~jTM2p> zBn60QwvdDML5Mo1X)b7@YaC`s zt|9R?Xi9j9^~obnx&-`;EI2&GwJBDp%h20z;EKfI>m8U!?Q)_Lzz*y`>k+$7QlH>( zftig{a!anaQaOlf@jTkIGf;;cA>N9M+yys26dvLlW{4+WEb#(XG95TWyvvXy-r?&V zz$LdU5--!8Pkh@D&xB~m5Z`%*vYi$S3g+X3aa^Lv)zgqIk0f=K>SQkStD7{{F(Dc@ z)nV1u#q|ctCj4Hg|DA#d)&ENIw+VOiP1xDw1UBr9S@~2XBJZP6&c0&g-S{lJx#~Zw z8F~L(c{TF>4ZOf@LWfure#G$v)}ZhZH2`_+EqH0IG>wnFh4|r=JSVW2Q|8_Tgm4pe z;x%5fz3o7-Me|g>2`7;>UwkgtJrCdt>df63Z^T_xx)2_sx+SNoxQa<4=uQNt6>=HW zL(3dELH7!oRLOtJDP|N)vy&=Ubt<@^nYVKb%`Ts%*#TU^K5D4tIhtwyETlQj z2)chnrV5`ap;&6?Uax$1BI>G6r4}@E0Tr5EK1;I$xPpB&Q@M0B^VaS{n$uj4W=?aE z-c{x~(F!rI%JREpnrAJQaOP=x!Z2XcTV*hccI6Mo%*53+gAtTcKV{9Z7+PDZorDpm zXC~p+>hySIX6CW~@kzL4C*cn`L7{N->#=X8po~xck50mwRm1NTvx2NV2~TD_f`r3r zI(K^L+QPnpMbmV|=KsYVvDtRSvoo^{LMILJTmKh##8yjuDn*=bwnf{F6isE;L=JO1 zxx4i-JmkQcA>cCPmU1@_t*(cxytYoIQlzV@?k~fD*GWPLldT+CI0DgwUaB^tu`apFE# zwT@`P$@2zp=lP1% z=m*$>TBI9^6nDgNLXSpNWzQfrFd{XN2C0r53-r_dXG1`U`nYdh5Wc`Yqh|@Q9MGMI z*q}0Mz0>@w3w4l3jXr&nJIR;DoTYXQe{BqxXb8f_coMwT5fUyjuZ}CDV2zHC`sNhA ziaF&;pmua9elmWVW4O-ST49F7wlb7Bv&!0RE))WoRJ3bhQjrIA2MnOpY32}Pg`Ur> z18$8?+nYXV%f(K&@^&U%675p9G{)v~KKOC%N&K$E`o#H-{qfEP{M1Q*l?6_%a9@GzP09rC$ep_bz+mwpmLb?gMV~$m4>HSeB)720{xW^`(@mhKKNr|G*zxna<@Dw} zvw!Ku4?!}yuXF@5S$g-y__XP4p3X73@nJX$CG)dPJs}oL>Vn>03o$C5yDSGsstHJgI#qo zLDiDWFgt-z$RmBZ{{fGG!Twd7Zeu)%DfL$khN_G$4l@QBW9`Ny`F~G{I+0k6Z&ZSzw&R=z=biW^f?g=9Me)eo9T)lBSiChodE}R|DJ=Fdh!b zL)%MlXVM=h>62diWG4M`N#E$DZ*=Ln_=Pq~Jw!)aIalHcC-_VDA5{HDRooUan+6x* z-^=mu3;5S%JbQqTca7Ay^dv`!cNpS=b@(@qe;qg>RL08j<5@Yri`E&{_b1DH(ESYZ z1oBNDipMHQo{&Rwg+cN{MFKJ5G_VSiC+3hmMUiyQ0~r`46rEKtJSm6aN`oQT^^u^o zE>!UdMIc1gEC3~sruduu^mIiY3Xsj82NmUiM1Ot<%H-!H1N<&ArN@CxewnYHOm6Z& zuPsK7u??6vl;S4^%F=P5mw{zoM3+LY)6bVb$)iA$ogXvxnT8jkmH`&p0cJ=^GZxnO zlGW-nyh+ipePl}p-J07cXB(%VKe&B;^`)rqP5W*=ub-dSvFkWj$=Pac8K;g?wVmLI2ffNQuYiVMaL;C1zE&Cv`Ec)hJ0s2anuhx(0T~G|prI1H1#|Q_ zFpn=@iY28{ZEw2%%h-_Z_|kP1>`!lk0-Zbp2?)Zr2@AP|jW*$#xr9wN;hJ2+W}EQb zT*4Nca4?s!)g~I3vmuD#*XVSt@)+XFDR^_)xK);DSfzER9qg0~^; zz1Zo)ItO!B{Aw;uVf;J%!LJzi{5p*9+4KE6cA}0^@k?4FymXqmcf17?8Bfqk%LJ#$ ztk0Rjbz}f8!s*B6-C<5#1oz{@HjZt7fsgC_wC#j@erLSmpP(>)78*JOlLvntBN!~4 z<3Nt)U-j$3JZyPPc&`0tqAr35)J3LCU557_({pwHnqMbXCc|^WZNHL1e0L18I85Fb zrZ`H$?*PXo$~VFlN2U7$fPsb}Y*}8SKQHCa8o3q5zXon%!x?tE*w6A)v|#ZP5n|T^ zS=-Sp$7gctkDv+ib_ZIyAaC3x#ppFW`Z8x|e-X+%x%S#mxZi%h_qE^1+KYW0(WYG?cq;a8DrVo{D4E}wi309ss_ESe$4kG& zIMh%5{FqnT;rRp-Cj9YWBY>T#<=^d>CtT`6pic@f1@8l#|Dm@zCxlb$b-->iW9?LQ zl@6C}D#_ba##&ZJgyU0}E|Xh1k=d@OgJAjPOe}D4gZZT$zaR7jsMtPD2X(|e8Spf@ zXJ0Zi6!}#TFwqC!lDRK?7i<_WLJl*|9~kM+&ck2^U&_Nqt+!isGP#V4oyxx3m2zLh ze;>iW{l`h@T(BKFRCh-ikZ_5krde$@Yu#7j9oxt-{uR`5IU?WGwp$xQ1jx&f3p?jK zF+k$iAer%Paxe^QN?#hjRrl-6UrX*netZe{f%xI3bTau4o&r9+fDiB{!{yQQkydlG^BnBVE!7MTza3p<=^F89#{E4)*Qn5?7j~|z zM(c1B>@_G-pFFV8!}Bxja~)stP5xSFTbE$^0p%mG4vYlRD1LBS?`Xp*_}=G|wl9UC ztv0#8iIC|1&2b!7>+$)-_=MQUqo_A|z=K@~tkF1NFdmP`7vU|8p9{uVrfsN38~AlA z_7cxRe)Ig~k?drcPQ~%A`vhBIixswUpqs0(RZwA@6~ZLxRTwUDwK83`u^MgUg|D{O zThG&46*7G*+BnaH*XgH2px|tQlfapVdF?efN$F@4>9r-tH;+%o=b?G{!3^5ibYLD& zm_P|26BNLt$pZ#7c|hq~;*37EUoM)pHR4uS)VM`nd(ADZadWiAuMvq#CvKy)rEqmD zO6hB_xm8PT&6L_`_*z5Df~leA@%8BV{mm2P@Af=zPXHgACwfrn&h3Qmh_>VJ&TMa< z)N01vR|9bn#gmuQuEv`=pU<}g&0WgfXqVpAyU^@J+ZQ7I*>qrGe~-%?By_vPEt;EFrhpj5(&TCjs`fzQscOhpfPQ27>!MLFN1^l6_97omE#(C9O zmbRu7WLDy4cdJTuv<21toz?hR&AWvM5FJhA1oX7-fD!rKWkw(7D=@*Y>H~ zgb~iO+c87irk>E%IlC~o&WZeVoj5g5m_in8%AyxUVTbladmK78z}f=6c=1t~-j=zf zC~J>AXP*|m<^XO;>`Y?CVj`@x*Hrf>kLFxxKWN5fi!s8p--aGk2|f#)SZ;{(F~rHK zzts?1vtm5(72ZoE!%>GR=JRDrdbN%(@zS!)6M!puMbTFpRVf%h7ML1XA~{DlaaCn} z7Gxw%@)FJ-lmL0~N{Gc9hC^AIhLU+{khvE}8${mk-H#EuOKs1X_k+XKnJU{SXD@iv zPmdqkx8LyUsrwEz*69&3*0S( z%#CWLWu{7>X}b)rR}H{Lc)=c$;DL1grjLtyziA)g{9ajWPore!77Y>7JuZ{`ahkHf z<>U1BE`-~*l3{#zNNnGkHvYDc!{Zm>xp*(4BG{pFyf=OLY9E)^hlJ<)kf44%hNj=~ z@pv>5UO*GU{kRNGukmqtG!dSoiJ*aaes=&K!gF{C>c?aH?Du>;UY`-}_Ziyy$^@s_3!&QJYEx? z;}Jm)O6%cF_#98CoE<1u~oW*?8oAHse9@ZBM?{4wpi*~j6vi|~SW5$sUqdGwY6xCk%6 zMesmeZykV(@B&-}_v14B{sSME$8W-O{3fU$kKy;*d^{e%3HSNUcZVd$@3;FnJbn{i z&@O@B8(ux}=-~3cI(;0qNKiE$KjjRwEt3#^FO?!uQDr zV-akB{{IaaBa?$H6J!tu2XYe0#s-YQ1e3(~`@L7yUEMQ%cM^i{vk$b>{i^EKt5>h8 zU%h(uitrpS2=eRB;Q8|cJcQ@)5Y&#x^7IWp9*?Jl`#j})g2eIE&S7u#ad>(I;nW*S z(Kk5H_oxjtnd+IGpiE@h;(Sv9PQn%EKNF`5IN&}XOfJOv7b(u};FXwH(O%BMgm-Ni z0iDDtA0{C<`7k}R6n!5l*eO^-1Myo~Nmq--Y+XU)BCcKtY5f(!_Sw&wuI=6?1y7b` zqpn*@2Yw&YgS%7jr591$GoY4W$LFJz&Nri6B0FAR5$^XD-xDS{99I7R(#PS+AK^K< zAt*tU^pBml-s0o&#u4Ei#u34Vxb82&MR*5X1pBz2tTXNRLn6e;<5{Y?CMmX6D^DXD zDQv&!7+op-_3N-5;=J zXvwsO$A|W`WHwT$Ocw6;z*}}7_$%^P2C7fG3^_DbhD)s_lCI@tR?$b9RC2S)fuF(( zwnl*uT)RsbjjgxKNP!DdKjdT7Z6u5b5xocdAklwf1{C{BZ!iykrAOo& znBRAxLZ9Dvcyk^G>-t~iVKA1wCl6yt-4C?^5monZ+kmj4e6$USD7XLE2E;uLpJ)U2 zm7*`S0bx6Tv<--Tl<&0x2i>L#I>>rkAdV2TvB!4J&cM764?u(9)Y0bvp2X${Zo}%I zuE5$ltf2!JO1y^6lH9Q{bDxK;B0+^~r9uCd<%< zX-xHD(hI5+)kU&TV}@t&bThEw$qY-6?RCH6a%d)^A7glxqPGAs(l_rpFayI{I9Z12 zdqVH7t8Pfq^&;xx+;oam-_0;WDfZ22>rsLKrk;(_JAhxU-5blWsBcizW`nK%ZCd>` zCu{Y`nq&Ls4!jnW(TG19zmkUVvN;ar#$}Ir(psxG+TUaC?{R9151N=%{NCQwp|_8( zZcZDPHp%hF{VJa}cjnU;ajy!unyq4k&-elXwl&@hZdNx-%w7CQ$8PpybJ}d;Kzd*& z&W#^Gr*T5l?3bbEq|;_+el3OLSsGQ%R#YZ(x!D_1(~pA!Tlk1t3m#pLT5GS1;E$Af zan!_@f(_{XEl8EPA=PbZzdZ>8+0;IqGE-(7hk)-b2-uYN;Wq8VZQ6(1a(!rfPBWoT zXR1$5M$3aKpd(X(dHS%Jh5LuB9&Pe??!UPD9M7A`Dm*vaI*-)tX1g1yCzunGk$M8k zX+V-Kc4Tg~$2XexeagOXx9=y|k&8*~UFhxbM04WQ*D!{I>Pfb@88KP5b}_-bDJTO& zTw0fIr=oUUtDS96X-DP&c z-GxxusR!Pj9*)wy=rpoSoZYJ!%?@p=*=gIXpHA!>MqdKP_-?F}>bkG8+w7j&SOOP> z`x3hSj6HNC$GJ3h7T8k@DX`GyPpOBeHn9osz6U0(5e3ue zkU3=p&}{Bb-p=&dj)|Y%^oXI{^zii2t7#bRZ}h2}zos}StlMP=Mme4)8WIia;{z2*Y+TX<>p(&$@YdH9sF zd5Z3a*Kp(yrw97Oi_L|06yfA#I*N|9>S$8OC1$Zu3Xg)z%w-d+gX$&KOGHJgUM#!i zOodu&&ymW-&{E|7Jz(^-nVx`mR+H{Q4!R(mF*6Pky<>oA8w9{1+RaHsgS$wP%_jrV zUb7dmd!%l!$czSnK=^ucj)Wrff^gQ%GA8z+2ra|}XEDX}LRNdZxqM<%8z$S>A{>oa zNCAQc;T7hJiRO_a$a0_&DaT01mF7y=oANDkOiy~(gys@-@b{_mm7>3g0ESnYtEOO- zK%*{Tl-lrWbG1hDsE5}y4@v^%%T3{?HV3(b@YpGx@1^Kdzy$a;fU6u{YpykYkGs@$ zbUC`#T<1paH5i-Mm}?Y2XuIBAzx`$mUZECg7YNNIdb8YMZrJ|F&oE-E_EQkr&!F{I zLaR^WBvOhV0j)Y%>q)D!AC>8Flw(T2o0AoCJ!o{{>o#LXwRua93YP+W-|ldkSvoqq z-)@I5*=3gP-@A(W19%V2M%?b6oeP(%LbPJpi>Q;WsljDvxfun5`}gp>djB4?Y-UC< zzg{xb%@TbW?U>UnBS|=d?G;&qv%H{W&Z5E$eY?W(QuLLCb1SPyJB@KHSrLuR80H0G?pJh!vRP@4whNzCX(==AR1SlJ zp4`4z6MIer^t@Zj=9U~i z-Ybn3-YeJtN%TDS08Ir@XEb`=Eev6CtGN~Dm~XM)ZuRr=Y~cR`rY>Z&u_^e5*c8u! zjz*7a`ec0)OoraaGnTN<(*&RK$`YHrfYtFLz6A5>VRa5KQfnL$No3{;9aj*dV531GmbJ-QPX9!9uuX^-w4C?(mXCe}^UAG((E zp)WK0D{#}(ZHVNcg7dk7KOKB--hncn&&{0r+z<+%n=PGuZt~^C=ccHf_}o;uOR-)a zd*u;)R==OG3Jvef(y(7?AQUug?L-Y5}Xi7F%N-jtfu4xTOSli zn#-#nTO7Dd=Vs!=FG--{%b-N377-Bkm2k%4=`4c73ES{%@sYYX7P$3>#VK;!oF@eJ z2^I1!ECsvKynhy+Mq7}-wh3NC6(gb9e|U#Pe_g z9>Q~Y2r9($(E>b#=kO3zi0AJL@DQHELr@`}j}_n{Jcoy%LOdTYz(aTr4?#X2^%MFR zowxoTiK(B^YcY6Q1eNCb*B?g=12In7mH7H&qrM|TR<@(pLP56Uqu4)TrHq5DAHpE& zSf=pT`#1>KvG=QprQaRA6w@;Q!B0WH@8j>m%lO;yXKYTl*Y!IsZU*wHt+nK1S#XKB)Q`0r>M|RQ|1~jxn3(TU%rd&g&tRN0`}ptRkEZB&0`?7k6(vBI`@`?A9e@9H$+~ud-`r`8$k>7Oir{8 zGd7Q_F<>3+h_Y&41S7y6VDny2&c2?4*JO#u?7GCWXU2}<$7P<)wiZ|(q(juIU1B6& zXjgqB10#bYLnC4LNZ2zHmPf+MNZ30P_Kk%7wQ!(@ka^L&P>qCoJs-N`Nx&**p@CAg z(>){8Zuble*vamh-Ug>8FYq!rJ$XSq7OVoJGZO$j3(ihndV^Y6Z7%FW=i2&lwf$73 zgm(i&GC!>NrZed49|D9t{F1_^#jj}me*C#>Gl-6+NI4>sVV?wzK@gz6pm7wU@qqSx z0X22;%&?#G!7QqpsR^n!8#IZnU;y#>3g|ms4aYfXzKtf%K;^_%Q+4SMU z%-nO*{pHb+k&4Aof}1_5ghSD9546Qq0rWbc3DyU4*TC*0QvIR+H>&!ZUY;8uW!vRHrY<=tR;tdHh2iJ5Cwtksi(Hl4e zt^b3-&Ar*FI>~maWV<#&lO()R5`f>%-L`y^{w7J+vrj*UuzXRz&GV!M!R@|8@#z{{ z^Vk9?%saUx;1{AkqeRLJ4E(TC$qilXOJTOnfI)$A3&9_1-Y0n0VKmbiwIjha?P2nI zOAg%8G$qm7SZ9i>aaq^c5JLuxYotsrv8J#ZVy?x<;oy>d#6+-c&r^sPXLg~hR<(Z6 z)j$k{uISC+!B8XUTMr^>L;5g&|J8nrKFuOC;m@&fzQkym8BTPNO!F%lSxzBhUvFhtMCA6Y<-2K6DV ztGul8&BX^Gz0f}4Gi-Zk*W~MizDdM+;I|n9$kuWN2kNxXZG1b8H}G$^UFc_o0`kd5 zcfTSf8;1!Sw_2KeJ(6+LOeH0G0@wGdN$rEyPp`-CKv#h=jpMWIU^!g(E=&Aw6w0L5T&WJNLYHkn7p+3r0d!M@ zW5!RX2pkRTZFCFefFS^ffsT-Pnp{KeYhAv}m|61i4hQBV#N|UcJWQUHOc{DquY`98 z@cS*xyU(dir^U#}#unRviuSf`9>z8r$05Lu(KOdM99tcLD&qCnP~YS`$}+?~3NR~m zMPJoAGgdYB>Fzd zm~|%q3X=rYSWeRHX@s5TtJ_X+C#ZD}@Yeh^TceD%?eh(`{a1=mwCw}XyqxCc8}j~9 z=e#uMrg`~RjF)EDG%w$Z@zOk+=H*)^Zz(t*Jb#!$ z5LNnd)irLxPM>>m7Mh-&7BmB+S2PKPOEF1c)J*{q7GSvYS7uCYi5ZZllZ^7Pm&zz1G+Q zxzin6BPm=^HpMP|1c{Om zZwL}{F|gvE-hy(o#dR{m-QzFCM#R_PQ;Rw^JZKh&PMUf-vYR$7Cs5!YDOy2eqmxU^ zUlxirxU|o@qyQp)L(UK?M(c8NhPCJRcl?}k_H8&)shmlSb8vr&#QMg=GS%F;CcT57 z)>^o@`4m1_x)*0No_qa~PIAehev<@Kx%_#>dO6_+w~RfVk-r)i-E< z6;rVa8Sf;4O=D^w4VR|2^uM`~`jfIA)05oIgGDu2U(nS@ zL`sn~A4X0Js$>&0-x?Rd76K%(T?>gl#PBB4Umuw&=h^nT?-R{r$@fX88Z<2beX?^< z+xIC~03Mb2KEa@=b-C{o?_+<(kNJH%x5xGO3iLPcE_#*fK`WZi5s8Z2Ka?HkP3?{p@%>p2wGrlteAc=kUZcpOh9Z zs5s4#5!FO3Dk9h$Px(3zLynW)e6f_0BPLaj&!wbhv?+_;Nh|G+iL`1O93S)2>J`dp zQ@H|xSpjK<0aYn=(n^!%0nw)ZDETnZBo6E4)U}+QYT?mM+z6aV>(NuWL3HQnR6EpS+#+j^8ywon_-g`=1!lwEFq$?_{-Hp4HQ*pXjrz%N+5 zv;2a+d;53EuS$G97!R&+!CsEGVYR*%zE)ilWBfZ}%Dr;5ww+Ol2`lFjnaY zVLW(LZ5~#IhrJWZ7oyq?cX!9~HIYM9J>AlEO6V}&$l?LqOvU*reM{z++36I>c`AKl zmTpb@}*%L&L=SN!u|z|Du^T9(KEqP zG^F|UUiU@g90AkJ)JICLfow&5kob*5UKK~69Bn87Sx)362gdb2<1?<#le>GrZtJyNDDzQ>0sgIy_pCh@~=#1C~0{BYKb;ZwzPPx3_q zI-!B_V!sO-O7owBcIKUVK@jE=?ocHZXB?mmx5t^ymwPcPc}7vW_1r~$7Ih;%^YUzY z1PyvF;d{b|`A?IGhCSop?O_t``z`Z5aTs+tut85h_se}a1id} z;Cma6W$J_SIUfgL?#uw;UC|$cS=dV~H7an!CWw2n$_w=)o&UUF-s1(~J`H?tqhYzy z@C6?SK532y!gD^j1SMz^S}dL~7T_T~hlij-JYOonLwF7kK|Y>eCQg}u_Qm)8Ed`6g zlX3D&e1_%Ef!DBWD1=C3pYX1XHO%uQ-?gD~620D4m+k*wgvYS7OT|KLX~W2oMe zVNh?0B;WR|QgDk%W6Ajj-)DV;Mat5fRcO^b|jW$6$?YXvJTX z=UV&?`MvGwy}>QGSniG|SnjSTSnhdGu-tDx!E(Rz1k2r% zE7$rOMIeGVT0bQAiAP}bV#KM_b}4#?ets~%%fU1T`1j@8(b;#q6uk(!>l^CMr5pzn zAzXF6L!q&NP985t4(zKA_D;PTLJs}q6#$5V|y_2(@f{6VR&RVe+}w4>V|A zDcjV7yp~oRj#NiPRiGgvp*-vz+oZ422DI4v&?-dM!n=0Odbi0)04<4<=oK;*&4CqS zO+##%0k*<(wF<0VB7z4j0^`!4qrWT;3-2$mK>~W zZ2TNcPEyE`gGG%aXQ3kp4?<2b5-u9Sb=YBbB*bMeq=)Mus&b^~_Y-;+ksiK!^uTF? zkSsk=+q3i}g&aN5*&RKhqX!R4kJ7;1RBqd!ihZAe|GnJ)2j9!!Ivy}j9B_yGD@J2%)8;Wao{j5Q<;#znfRwAi8^-oT85A=uc_n%ykJU5AP? zWT9oqFys;pS)F0X>MTQGjdu*e5=5F}bNCFYc1RKtNEt$}buwg8HmgT?Bb5MKg~yOw zv0{eUq8{GBtOi4{yOL!HeC8cPLS+c9d2V-|ms0|A@er@xI*VUAIT^qJjBv2;*VURC zfI}p%AZh?KU_pZf;T|G@25rG1f+o!*KtmQZOwb0i0ia=9a3Mh(%|?Li$sn_cAOu7N zXpt>w2tr^)fQ$uI3Brv;03{)12*Slf0ELP^kP`!&&1N1?koYp#L+K74fh>rhELMS^ zXDdt5D=}>7P1*dAj2F(c_=3Xw{B3yWNdVCf>!K3EOZvA3Dl*cmLiAOLt$IkuyYQ{U zrowf0+}RAAW$5gLZ{h?T*uAoKRT)e3R5I<qneh5_e+4ACp?)AeLkXD)}*Uj~;U@Ix2oX;P*q>}S9hN_(PXR~#4g)u)GS z5!VxRxxbS0P_v}!WIDGb|ab=M&Jp+}=Pe923K&T*P=baZ(vgWf#|Awa9D^#P%&lfa?ka_ z*P{o&d#44^YXQ9g^z}(xqUvCEK(2o_vayLxD7<4N^e68I!%(tn>oK>HFPP6{MVAE* z#$O?$GeC8wo48Zjufim+<{9e?Q7=s=ivtLIQ%3YhMK3$N@Mjo?rD-GlX z#Z67z?)7rpW|^~&!zQntFm#jm)Ep&V=K4%QeWiJt0_4n#t=jRKw#xrR8%y(FM-I(&3w!19J<4fkpTS{e_VquLh(^1ul5pQX$M<9q zI~+Ft$G`YE)}npZ{z!N({s+S~5S*YA+Z4~8TU_7pacxL(5q^mKrhQrz;zv<)PRA6xvp0gtol%Pp?X7PNh z01x3gJOmZu`E~&w!gF{CYR6;y@ZWtro;(oVK^_Qh$7S309Uqs+Bf@hu5!8<7RQa~e zKbqp{4zPLPcujcMhH4j42e{h|zXuVL%Uwsc4)V$@7H{dmk1*w|DG9pxhn(r+Uu4JC zQCi=3)A~yO_n2^BKKPyx?PSch{d+zRukD2A+D=e{2J-RC*qKYgLhxdo?HId$?0V0V zO#1%&*pYjJQR)f!2bELix3Nt+ImrcgEtykr5ra$vwU&%zIi}x|(KvQXdi{kw$-Rp$ z8DZl%X%~z?%0CC)A5E5l1EeDK<2<>PH%H%uFJnt&S!7bh&l$4atq~$NTFWmoIJ6cO zhhNs@h;=|;@UQUM`iXoivUbH%#0k?s@3jvW#82j7I2ZOv9yU~ktiBt~li{@5@QA4hduFVR})pG7$h(69v+%h6EW^&?<=kRBGEYPUqcz?IL_ zcqGC0kuB<-0gP1l&d7Z$B4P0@P(hMI^Fa7Tk3Jko`!rtVBVLB;o@!(loq6EnqMnsmc4_;DVCu2$vu(o<+htqT)+W1h zZ(|)ymJ?alErPkjqJI3Wv+I1zI;C~EY=$kuIsCFC_)BW}%TC};0=BCit8SI97*-=e z8>{{W{3=Cc743a=zxX5s%ag2sLX!09hMHX4A%98{!MM74y3r#X3gLq2%OGSl%=V$F z&S@zdQ{5RPva*3lTp}A9Da4GVA~8~g&b9LjX{QaI+t$us^tg7?cnxFm)OB5GXSM#= zVtmIJRO@5?ePjIyJQ+=cjesZbd-dHLvK-fFOfrPE1M0HwaXy&QgwBGik+C~HZ+(Qi;r!H5AYFzea*7^ zbUl6s-l7k~1{*G~uCVP}fr_~UyWkGeVt#+*eTjIs>!B zapfyu1SH)>V;!r7>l(XZUL3P1@k3OGH@U3qL(Fji=ylcxSO2lVti$pVCc&`*tRE3O zWAZJv@R$rna|}=&V^Im2%CHQaEOQu-0Y+R{E*N1foP3KJbCWK+5!64lXRmbTy{D{Fc&co}xy=%0bE+IVd7Zr+~Jh|WOA zo0ahv_Wwk6BKjU5;Dr7SWK&66l@v3pQif4Fsz*m3!H>Ph1=GFq5nyZ`1MJcrK)i`j znRpT-yzyDc1v2fK_vY`E+@RwQ4J@Bi&jtiiFJpX**@9p*Zc+}a8?4N1$PF#cKG{`k zEa;ta<8uQ(Z7RBc_C2US&ECancg~8mpG`;N24Bvy)7M5zBCc>`$XZveWEs2 zH^_*=kBk(>hHiz~V+KGGw@zu+WpSgE2LID|tgUyO*~WU0b@k%G)qCs_)N7~2eRCa& zvjiOL2si?9JWjIIilaM#regO?1nzL0>nsY`BB53L z;Lb%0)Yu>)o5au^ELwnO6PvB6bYRJ-m>CF*NAVoQ+qKIR-oo}z8h(<}kg+om?r0!W z`R=ttV^jV@ar_i%X>7`$VPLliD$Vn68k@4%|16DJ$uMkVt2~o|(EH!VX3!NJL<{*3 zHUk+)vV2$hUv5SBT<8)lk-l0>2OoDi;jMrEi;Ag-R~JG&Vl>m2|?9asYS%C6?iOElVJ`L@?Wpf#6C zv%CtZ;n!!J&hM%OME6$ote6y%n+8kK3e+j5NWLT-jTYmbOLv~vxG6Y9EpwQmd1#I6 zh=V(E^fc4Rw8m@tZFs7Ecia&BOGfzoO)RBj!TR2UZ_yT+LCC-0c47w=q)p zg&{(pG@_tl7Vn)4Yd~jeT2aka^foRmlEdsK#QFzLOp^}>%@30-n@zt6d*S0Gq|<3> zRYE%QPy;rjGnN3XUK9E)C?Q>zPTGP5mM)uYbzTeLzl6?N);OM|Fk{6m+dDV2FI?`J zW0udkdY8|+)z>l>GRxSb@L`&KkgP;5>QDIbh`<{MkUHPnaZ7ilIVaZf8?euuh^}GA0(n0A}k!Xg)3bME-3?wL+16&3`s(qxw-ogGz#ln zJZjm;8T&M9fH0F48U=7oT><# z0qvSywRHT7ygs&olP3&$6IGig;5Y<5L6@a_CQ}G|9a4y)e3xXipzOh&wybbU+ux^n zUL>tY$lc+_vDj=j!(IM_p{>VdstJ^n4EQh%K41>9eCXzkGx>mJLce1|pJl>8CngLy zCX@#oL2r8A!0L5BL$7zzfeH8ZA-;S1kgwa!|J=tx7Fyhd=X6Yh5;Tc!X7%33d_11s zOSq$jcP#L|G=Ee#p!@aKW|3{BsU+X``Cs_BJeeol;i8_$_kwXO&^s6Sxb~zxBD^cQ2XZ=DTev_LU!$7_@x+CeY9Df7 zg!M3Qhk8^u?N*vg$dl@(OCd!qf=cuJo9d=orbo+kWy&1OG6a?8`8QvttYx}0Wlm!m zf=cuJo0ic&vHjbFq=cWFQyvhWTh}Z{a|s4Nm8}`>x_+|jin5RQxD+qpT^nSNl2;13 zJxa2YNo}mm%VWjI+eq;ej{84K^L)rH#t2G;z|px}WuVu`=ZzD>bK``d1WiJh#nV@S zhwvO8f(r5U7vLd0hlij-JOc%I2+!dms1VO!0UpA0cnE68W9OYAACEWo33ua`W1sH{ zl3ZU6`#8M5B0NV6K?$0quPiMKeLNm5g!{DcJwcMAWs#4=qlNGsEd(WK^0XKqk2jwY z?r7oQ;CtKPa5UMmT=j8zcjFK)V}lQ>DcE0z8E0 z@DS9Fr=s)RVjqvkGs1nI@x8EZmS;5|m&Y^0g=c)o@reTs;LfBQ#C{q@w_87b^_G07#vfq? z$sesizCB|*Qm{O!qlA1<@*WsF&`~Yv|_twI& z`R|nbQgkVx*uY0*q;mXJ{JCcz38qD(r}+V7DMc3`2kkzL5AX+Ma<4k}!uca#SR*C& zYB02NU$364KU{vC$im{Dr@mGL_p@j(NpRzC&4e_?PI5=DnCLb=4O~gqtGC4l%~3X| zb4}NxSz#R;p!+dqvP55xBv|JBb|krPK9bx-0CB{n3V8&>k>PbNcrga>t|QadmQd89Dxb3q{qoW#SyPSr$NYJ zklOweT=PLJK}aus{PZ9AOUxbNfc{`ia%4>)cJVZR<1ZQVxnU*OwR-H1jmFKFw5e%(6|yb z))!z}Aa|e)`guVX8V?IvTakPAfeAccw}%I6bgt;sQXD~ZEnR6_x{@vB(YVenr3#U2 zzgc;&;UQUGmeQ%EEANFxebBaa5RM1MEfq`>W^V#5P4m*LVw#Q?ZIw$)aRN?TS_{`U z-%>({A!r9W2~H_{*h@F#Pq?mZ)_J=KVU*2tEAt$ag~fo0?0_XaIEGv3kEtG`x6nso zg=eaF3q7`xb5&auaw|O#npNQW_MSuJ5)TYl5oe2P*~k`fs->&-FoN728ST-HLiarRQF5zPV=!0~4L7KHt*gG-aj$ zvNsmV9qOvUK%4O=(Qv!jJ{3dC0*#q|f@B5voiEsldB91va7S~HB@~m{q4VoqXw^OY zV7Lo+nw`*FC}8FU)l$p}?RjlL=Mz*U4E3eK@56xDUEOp1oVIZFY}t05?u^GTK>sCk%8V^A!^g8^UYBjvvN_G1t!|AN zY<@e_=9tr~=je{rIkID=EyFo>bkC_48R(b}PYukO=+raKnb}S~*POfkes=0TE$}oXmVwoYhqJ_ev+2 zOCS$eFEO?!m6gYXMs|DmO3%&+o?SS9Tg~CcJ6#`=dh942GP8D+noFy*O3|$DAJ3`- z#;mu0oHW;5W@gQ_^+UYOj=oFnlsaww5d#+mpcLJm^w*+He}x9U(?X(hk>L|KpUwX% z<};l8SGU_FB!J>AMQ5Qvc)7V8SD2QfbMOMDxzFPjWpjmf1i7+$WwZxv_FhlUzMg{D z^cem8Hmo`n1(3H4%WNhLV!274wUL|1NU5zh6 zk33caM{tv?2hxlY`mxMg)({Ft%vn-0!k!|GNfHj=%%HN0?B_pd0}KPup8y72+M_r= z$iqiT+M_!Maz?bEit6Q)%ifmp;=l8ws3X{Yh9w(EsGp4<88(~vGQks}`3e0h$){3# z&(lHW_LBH+cD>FF&@DN4`dKJK@pCl`KNGT`hf5c~b9+PBjy%-yvyo3GKVHq1Smop* z-sYAzN+i1(xOaaR31?71v%otPIJ3Wk(-$EwS{;JA-v_3{d0=8QZCIj=52!Le$J~Q^ zO)n-+AI=3uG=Odmhq5iUq?p0`vei-xL`6e#g-$j}6iJu>{q}42^gAxSVP{>-+t|;; z&#~sg--Em4k9;v-PqrtQhRI?co)O#MjqhaQJEB#)5eE;f?IDtrO$(mkKMFh_;CSeY zpN)l)UxG^{IJxvRe-7crRfC*CaP=l{_G62BbsAxZ_TAgn8$Sod(JXbGN$st$K7cn*&;C_2Ixfa1)uZ5`We@L^A+ChOj1+ zpBEhE;2pg|Feu-Ubo9~0O#jKACeFzqB!4M-9*Ttn2rjW2Q(4Bv(@R^Erh!LTcz9`R z(==U_cxmg>G%XiJfK(ThqKjEAuh0_*e1A>jr9F%hVM(&ZU&C20nn&Rbe30WNK)fk# zP2gw&jP&nDPH~Rhg9qGBz~(^}PQd7Hg4r@3%+IyWJ%e91&N-0M(~=)=TZ+kS-;A6r zt(G5KycEM!*LD-Q(&j))r1FKfOKc202XI;>Fjr0CYFa9^oa}L(At{~1FG=GsX_>=` z)TiLLMRlbVU1SSm{7=1(ZPvoJ)?-kp3GLccW*na0={fkA0Zz(s^hc025aC45wzjya z%hYeH1qQ^@VBhe7Vv5WnLK^!<(=^|lg;{d>O$yXznIUm4F!=3!y!4sM^pi?r(0oqE zJ~%_!W$P;F1x&M3f7I3s>rg1y3r}Jn0J#X^5%z%W8)bT6H8A)+@c3vu9RD95c|jF{ zsh)II$45zR$$zI>B-f7|jebM0puSpYn%|K=)P=8+HMpm+s9tm~@G-hhiul03_y)piVYR{FQJkzm#{DOIwav}qkndiJaVbgA7O{OYp&^Fu zKY50Cq@5027y~WAj!UdFAc*|X#NfVHUJ;v=nrp92W z&|DM!_U=Wv&sy`9D)$9#sO8!Kf9Px*L=mfrf(BMSO z-4QOYg)5rhBokqIKFX{x%RnVBtU3b#&4`1-vOhuvwjHNgaqnKU)akS~YpT;8<+LM9 zhG?2A%u&AbYLi5H#kE#G)tbFPdCj2IJcmfbm-HY`c9icc!cT%Twbop{}j;^TOdafj2jW4V{NB2ka z2z^Xx7#14FvoyR!X&@9dz&E5lE>pgo&`?xPXn1W(!|NOk>RYPo;`x;%qQhA}!kwQM z9iaH`tpPHA%t!k;I2&5rgy;O92ujd^9~oL!rFgo7*8|VHs5h7930GQrnlAwu5Y)~O>sPj>01x3g zJOs7lvHh^t$K&}@67Kgg-xDOcHm&nn#AA>l>EqE<<_UK^sP`Z4II0CPmpj;xCZpX0?x5Dfwa``{T{TqMUW=s{n4Q=vdknhByIQVCETx<@0oge z&KLQCZklPkSoJ!H1%r2ras+|iVdT38e_+4vlAlqxLjr>^!BIIA|Sm})4 z1<9Dgq99_+2e zEi^9ZJ@5c1rTOQr7=H2JknBFJ3%QUTo#hIVOBXz8^vVY%y)Gw**3`yu>nMxK{;wPn zir>!+<-SUM5BM6`GxkcpO#ipq8adaOqPHh?;+)!{D>Xf?RyjlE*JgSurFnM79J&YB zj6RjSRXBom7HI+R-icZydKBa+aP{Nx7C4gDUpZX;m7@9)E&VRAGVDbFr&_`=i!OPO z&lJv>-lQJpRW{p9nkDrQu)7PT=)E9w0uEX73n8Gy;d=@>ki)iim;XWJ(tT${NVT}h z5v-YP1@_Gvmj|1|57?2oPna!GiarQz@G-g%6IJ|r{DIHjhX9(LhJ|K89d=YUEYfU= zKgpCBM&xH~58h2K@klCSUYmZz8js!&jB_*G!PF=H9o-B2Gy!cd0&La=(kA+?O6Y`&ZIJgCFa&+C2)ybDjd`Tnb9nzdCsnx zJt3KH1zd_A0Dt$({if@J{EV!l28yW8*LDLd`D)UJt7`@$Ylh=ckGF1lg{~P0#hPJf zr!_;qoU9p&%E_AH3n167TfQidi4JG=(oH17tr<9yhva)WPk2s$At-H((*ANV;90GMI%7iwHbF+^VUKEZt!n-z%mgf0T+k~q#_#iIs*$5*9JM=kv zw;(BLw}+c>!OaK3&4&)S2`<3B6-fzhj~9gJVwsW`1Rs_c+X`?J-T^1UhsD|Saoz;} zVxNaPA>p|`y8v_&T#6op80k9g!~i=&2;m<69H8F#0~mnuNBHMyn5o>URJXCiJn>tR z`dIf+-{gnWb(WR4DW8_}LCb?m3*k-=-2o!_o?S>p2~C*ImIYl{Ck}w9amtoXX)EPX z;tr|KXXR_VU#Hi8!aKB|;G{0hd!5?<(Z|t#)!nPAyPp8$sqX$3plK0Qn&;nCcmL&L zv@Ql;$H~|62chB0pCdXmgbi{%*MvJ>Fz09V=ate={+TA_@iK+K9v_BG{?!UU0zJGZ zpu;TX0|7FCrX>>);;qW$At#<%GQuU2YD)&>*lHb4h?XitVEjs;P|2;S?2IEsYtWLu zthG)gix;;};?GEHhyLv3Pp!3!KdIYYYj^H_58u_NWIWjABFU|>;izy)l7y#foh-$E zd0pL(JAAdC21f)vQB#Xo@~eE{X#8yn+4J)EvGQ_={DD;f$5&HrC^`6w1b%G_AB}HJ zUu5)J#Jca<8$7cI->y!2zdbe+pN;Z^BiLypLq!R%VF-Q`V_qDm+})1cQBNiU#F6M} z{;V6KRhlQSM~|>e*(F|C zY-CQo09Y+rdWj)K3QnzP-B8+PruqzqSlAmh8WsbxF$%(R#tV69PkY`OWHx1Lq7Utv zHN6N>f&J+S%0Kn~iVug{ukZ>;pw!USh|P9Y{|l=2{aKf)11Q|IRL1G1FR!W>-J@-;S!si{qj0EUbG^KGX@)8Udw1TqE z#f*>Q>)BRh6TgZ?=;7$k1yr7=e#j1~F03w0{o<$bLdP(0G}tvQx5wxBL?W|jNu5%Y zg@20GVZ%e+VlreVN!;_X_1kDZ*x~gXl;jkrna)WP5=iNGNGwj<8eL4NGh?$>LfhEB zAgrz$ojm2@pRQc8D_iNu9OWc$|K3&1jDNde!S`wVF0xU^kg$JRGabAg8&#pL9jh5X zJ2@9$hCzvdH71;$3rE06S(_}bE|wLcMdm@d1hLR~n)3nIAou4+!gqjpI-Zf_r5fsq z+dluBG=u*m(_yu2Mr?+5noKR;i?VY1YZedL9BJ zG|%}r7S~>H52z!r?0(Q@tn;AGd>w<>yejhu~YDib12Zyx}rCbHdRGrt+xTjHOy~y{hn3yd#1~e zM%4~mt9;?+ici9pQwkcur@B{HbZHLXVtoGmPotvJHQ{Qn+#7S{h8+pE0PFGdzo{+1 zttZLf1I-cVlT{}o32#uUXpb@=Fe9i9Tjbf=urEIOC#qDnF$a>> zIJ0YPXhWrIY+QSoXKAqTLT&1w^Acy#yF;wu3AW`c%{<{M# z^Ml1!2g6-R-uUln-bsGPUw~kbQ^DsznSuv11&%r`4iU<4{I{qG0|y^>Tx%s489>3M z$Z^+`m{UHz{Xn5mLCEbAzZXs zxg7!<`WhJND*SzZ&*@8h&ndibk_sZ0eLa~zg!dswS+)-`%qCw|(1$?-{?EcQPRCRq zxo4=|r>yk)Oxy#dkM@@^vDiMccZ^YO#~j_$dEd*>Z#- z*gTEX5WlIfUVOP@Gb ztPWnp73V$g4?BqS_WN3WzyS9x2Q$36fw!#d!gl?&oK_%0OwAeI_?><_IA5pi z;@-EZ%XRYLViE%YwhpX1_!7r#yRK7^0Kr897cFWQSJfN|`1~S)s|J@qHH>44GYyhN zE5ngi+!u#c;6F(RN{_fT5=Ddg`6V7zq4AR}A(`{WS4w{?SyC-NSsgdMVJ&{AkqQtuESi3DQEi#U0l!;cM`SC?HSuP&A*@sQwB~# z%<~Pl?Y{tGwS!lJ4VWiJWsZq{0CDwwbNjpFtr$$t_+PLj4^(1VTJV}YSz46$cgO3I znl3TmB|qrpqF%kfV=jE>Ma6X?V&{6TdQG>pBt_N_eJ-U37p0h<-acIqeVPsEfO{@1 zFbX_&r&#+FTE8sdnvqn zhILSXh71}i3kb4f7UjKHuJ*iFGRu1rZl0w&iEp!d(aHkV|-3P#-JXVwagf<0HDkmw#;xAYF$IX5eX+%FvdMW z=`Y8ePN9);m_t9%$uMZtH39Q1hB=l(qc%Zgwi3J#TwdB47gP)=Ag^IJ9L2pGtoRA0 zYaw6d0DZX@zgncL`QW=;Yb3KQIIjp>;EkS(+ylO9ucACn%PGBP#F zN7h=9w1LpV^b=EYGf656I?LMGVrJLgIlG9qhnkqtnxSZ^*#3o|=FXzcV-&&G%{@qK zAAuf(b>XNi=Yz&I$sB@j)x{88D(v_=?GEZg4eZCuz_u$yPF`(mb9)TUCj<)VJ)r8U;_V$K-@Bnf;79w^h`qluP{W;I#AUAm1 zmptPZwn3L4`oWNUMsNXg!PSV{h;cQX)z&`F%CqUiW+4Kk4Cyfchqm-gX8D@NqVnko z#|A)$45G$m;JAWaL@Q{**#urx?gC|OyP#FPx=vfD?=UnQ*BUUX>Yhi8Nm{?yRFh`} zXii#ozCcYSr@$rp$||YMz1>F46v9YL;a4b>NE? zMAgK|vXn7xNhxRAlG2IMC8d*~gLv~i4rO?wAgw%|=v^Vz)e5q=(|XA4?esg%t^j{~ zt2!4rbX)C=zr-wcGyW2P#`y%d6zoicQb zTDGR+hufqnbri|sTt{^>3t}~;$I7G0&h^z?`gF{*B*`PY+aL*Fw`ndqG`suw;2MJM zzm3fnTsT0ZD{Lq|!3)>|-feT&?HFGDBbeE5gngpA00%nz=pP4XmtD46b#}3zMeF&J zZdO`=SOY!+@EBMb1dvNHV~%4>z5d$D|~bH4|=H2olK)mF>U^%N{K zQ#1Lr4!!~L-=!U35%BW}t}abD=5aNfWm%Ht`jqir7I7FDjh~<3XfwML-Eu(t zsBwKk2Th!oO(6X+@IY&UiP>L?NW(lEl@dLoeTRzLl_)q;{SN3*pF(VL;w;oDP+~lv z!dI$KA))Xo+||jaFkeo53X96Er{(Hs88h;@N*-km$@5s_Lc^(98eXL|5DFT0ccLL* zPG~49Cl#+vX;|lIP`{&r1Ho#o@1Oxs0x2cJTM+gOFZ z&-m1x?c?tNl-f;sOap!bA3Eqo!I^(yu;lHJnF+F z+D5c(7SDMpp040-;KA%p{DkwKyVCsmczUc$w%F>jGk+CuF&P{5n;~FVLe47j;w6~E zj>n&_$4Zz7=qi;abk*Z?kOb_w|78H*7$(JKfW&k1o%tTf(MSrc+;_=0&C*D?(nxaT z>Lxv&Q)*lf8ky`>Ri7!Km*=&L>75zCjuzb+Ff;vij!@2*YtX8rb$nic3R8c_Q8ceb zP-&ijeSb%<%!Tb`2rA9y?U2YDp8U5>20JjKT~mdX*~Zcd?4^F2Z0 z`p3%j#Xb&CrU}o4WcOA7E1p2I^>J03d+ThwvO8g4*%eF>f} z58*jH1Qp`Bt^g0=IXndUcz!wG@hZmoIQvHqFOHq)JC3ve;G4$z-2_WS91}jSls-Lj z|8SLo=ufx^Q~k}C(};J*W#Fq7{}K6@~Ps!Lh z( ze-l$W5h0UGN|}dJripq>2KsGqTDt}9J9c;N!1-83wq)pz-%qT+;Gcu;k2Xz)WZEiu zQgW^#r^NTaV+YCDNwIn4$Y`jwu4nnhtsC^`sr;$8Zsbq&%lhb3U#tXBWdcN%f?k+C zBU_4gK#}v!zx!ZfI42K-<@n+}45s5t^Du6`PqzVk+(}&Q)^4JAMHTz&)@Dtk+9?p? z%IIDfyNV#_wgR$e54Qp*oVX(XS}#4Cf4+|X0kUWha)&GMz)(gZ&gM$~MF5{la%yt}9!56@+b%nIH;52Mpj_?-!P&*w_SNf|Ro;nqhv0E=MtXQKivG$(@U zDzjqFj3H7JM;F4IBHM}?yh;?(QrWDk_eL*8eMoJ7$u{z2HgdIXQwWDWHga^sLfh;< zZDdac4~PMtYvVez?yzmdktJ#4G3J;Fv@vpR#DlhRwX|`yStD&+gEmHHtyzu#*4Q>i zUK`h&wO#{PPQ%lgd-#2Vw@wWh4orEieOBNFFetlIB^+jPHTb> z=Zy(waCK zjrjsf50ov5cIl_?$f84Bd5dnS038b?=&A@y?_)~_?<{C5NYZVMj-@!T3rbPgWp*_? zOwU}@%@a~P%Qzge)1G4zS(z9q>DKXFz_8%}L^y%<%W{7{=Bfvg-jRJbVx+bId)C zlg}yU6zlxixowA|@;cb8(X+d7kml6tX$9>$1cQj*oN6}`;Reu=RfpgrS(TPIrWi!q%oFz3c+LM02&t)3fwj}Hj$U#lSs{zpInei+ix zQx3Q#jR5Ua{~4$9)9=_>G~H*!kxCi9QhF5(@Be zzTIb*PDg(wdcjGx;~Ex;D}aF7Vr$z)K2X__0E|ngc@JtWyue%luYBBOVEe5ow~~R6 z02l}cTg@oE&|En6(_bAE5cB>>m_X?Q6L=c}HMyB5$_xb3e|*fiq2!n`3W;FQ{V`D$ z5_Wb_5~R0mZ#%B%vPpXi(l}fwIMPrGj&wW#RM@P#=8|zV=Mrx1<0?hTb5I*nasE}J^~kPMR{q}9tvIm~Ey5*asb zrhf&Dn=vy_h;goaL{M1z-jnnMY{Rz_I^vMw_h%Ysy?m4nWXdEiH1GZJay`i^9?&>A(xoLC(Xs| zQ;_`Rv^ax2^AdN`PwjwAlBh_C0M0tyE1!cZf<_gaf^cQKJ6m6dkp)TQ2|hb>1 zWA`R=)6|tn?J#!tnSE2QX=6`1^vGBYPX0hUe42UM#4Q=#WnR)^91^xzL5{~WIRE}I z1iC8PMy43XsB?yMW^U@YfyQN(A(wf{67Q0VP`dOEL$@F)KjmbyWnR(&m|AyCULI46 zM_UqgH65EXk5eAELz^!eV&r9(%w*iMX)w(B@|eh9xZmu5QU>6!q`{oppPU9m&oQ`T zz}F0#n2EBG?SSZ=gSfdjn?z>Dr-PAM5fxvB+&WTkJK{Q$XQTZZiA1guh$RY!S%L-Z zV!MF7+1$(p>|(V+!RQkp0(ixQHu>r1=}ZpY`W6C5)!drid}!o;#M{hm-u;LYZQ+190FaF%Y5H048Ri)P*eKz{B-TYzA7fqkn?g1eg_K+Em9w!fl5&i7A?1?T6&+(; zc=>HTN&fEO6ZjtDsuA!ZviXL|5}y4ZXucDPY9qs8{nz0IAr%kvEg_I+o)TKY$IQ>2`FtuYD%QD=13d6d3`{R zMn3~F5P4cW-$q`p-KmX7rEP5Bq>>%H8tPi+kQHdEn|nTsxe+ucb3z4k5BHuiO|{K8 zpUdUtd?WkRi(A~a7XRZrP!4wy$vpb`G(RRvdi9OkeeGdPClTDl`}<4f)=el|Do4Ku zwhdGk%f)uvZP#aKTREwZ>mn*r9S$#X8poRo;j37i1is+>>d%v3OzDvMd>GL`vUGO` z--qz8vvmKa;B`FdX?_lAI_<%^{qOLC$R;mD9tZ;FL2%IN&jkYofk+C*2}2Jo$NhSk&_j(KOiLxe9|IU93`Bq+AO#svK2ta^K8#6_EiF0vob&`uP64i^-Eu_s z( z5V7x1m5JMM3aEji1(9dm2EHL~!_VOBuW=hPc~8ycmHMUme1p}lGCn?{ z*D-1W*UC8O=u|y|sOk}9cZWz!S3Hb%gmO?X2pNS3GaJxwjLFM3#BJhtNnWfQGVb<+ zhOq|XPchTX&<-@Cdo2e|_32lYqR7@Y$O6{|c7(j-Cg+k|q^ zxX2@OGd|uanI&!)add5LM~pBZUS%FmoI65pF#$PK2)<-AgTT2n&?N*=>XYF~f5eZ2s$+!ed1cRm(zlc5-i)z+Mt)kS2JEMaVRJ z_svk9BAHZ~KqlV2Y#vsGDIJ$wJ0Ip(Yc3ohFu0`lPbL#OgHPz(~0?{61=R0 zk@FYV?rgHrz8j@H>pTTJ#l(zdte9Wrl0J5?R-rdO47H^);an|$Bmp+?XLx$g;H z56(}h+|v&Vft%p;XJg+C^x$)Oc~HSbMvF3jXd52xp2PoTpkofbe-Hj_J~_S^DUy@6 zKBUhe_jzr(UwE>YJHQ2~hs3?v&+X-;35```DUnbijuHg-xtJ~ix-W-VQaC!JUUuC* z65#EHCrf}gC=oA5v%~H#Ok?U?g3I8}Vq*f_IjjDKx}((7g&RC<7I$lh4PX%P);;k_ z5gqR^byd1drCTp9ceiNd>*~dwvo1@oB}dPg{z+SZaZ^~M(MW&I9-5~e`^)x~SXuGR zF2oPntcKT1lpk04sE?o%ye>;N6;kvGC|2|xdyM{kzpfrDuImZ+7}sPy0cO2ml4EQH zngktL>%9G8>L;9Zx@z%yK;rZ82V(;_eDlg=39(nTX#$SVM+V$HuH|Pkg%0l2LR?=g z$!0;>gF9_mDJpm33@VxzeFDBaxO1`6*nmh0Y^0*S09DD&HGLkC1m2h23atq6mBuG! z^1%aFVbWRC7hjDZUh{qpf5Yx>xdTW3^wbaB4&R|Q7+lvf5y7Bf3c^}I^-Vp0inwGr zf4UD}2k-ppAM4pqLUHzU4~AubxpMrM4pmOheioHm&lUD7AXfHHi~lK)=qEiRuu-CxQV{<;PNp!KU<>v|SaPElUHk1i{G+1MGu)hE& z;T>=id{~?}7vLnk15Sbui}UFz&a&KnZQD+G*M?eGZBwnrwj$*sWms(mXR`HF_(uH5QD-_u@B*zo*?Rwvjd9JxmScUyQuz zIjO6VwMCF7#5 z58*jH1Qp_WRskNub9e|U#PjR|JcQ@)5LAfgIR$tK&*34c5YHV2cnHtoA*c|~d;uQ9 zb9e|U#B*l>9>Q~Y2r9(WD!@Z{4i7=?c=IZf#J%^c2E zX#ZSA>9u{bGTxL1*|gD#2|ZJkt6^&Nb5UU%m-g&rw217hzJr z2O9)znaEW1dJtg0KdN77AO332IU-KD{KNKw=s2S-(M!e#TcS&ho!FA^e@#EpZHM#Z z8;IkA@&Oy$s|W2K0LF2+ga>*;Pd-ZHe?Z_z@n>w49?z3+%=lXf{ssTs$Fw`NhFkIaS5GsF&le zd1~bGZ{v^W1I=@sJj%4#ROrjQ2F}k`k@pK^+J)(|2?_A4S|FRUm*%Sajcirich#!O z1y!*?zN!X;L;4N4JBxLdS!J>I6kuh6Jl3FjOdGdWo7EF}ZoMp9*&4IPRwka$9k|5; z`O4b4wbrbi$aCxWvQ_c$sd8($pj|AGud0n(znjGxnaE-tD!|GDd93Ja?AeAq;|i}9 zvjUD{(T^ZgiTJHI>!<2%48@VuiHmZ*_rfeaIF~B)gz$W^C+XnG=65#>=+MCDz4_;P zxtlbT6X)gXcz(8y4Q2zjPBDya7qObSiw6`onEzTN`6?Qz8%Rk}-AD8`kuU2F`={HM4-Wqy{_KxjBK! z%^6c>%A#9TfQ|(cbTYhZ(SQ2Gi${WaB-N+kxhUk#<0qICq?RQ(k~*qHFKI8Jwa||! zPxLFY=y+V0JXm5(0Xh~)(7~qf(N;F2(T_>L3B41KIN(Ed!ndW6b> zf1D#$f6^Lu;<;tJ)9hq&O^xvQ6b9mrI%<=7Xcx(&E}4!_E8w~X4<#i{%v$&);^^-7 z58+giIF<6?ZN=L4#ebAXR&iU`S&$T5*F$ehoJ)nbrQM1!Jp|!wCqO;czf&%qIL({} zP}zdSJCz4KVa&B4sSZaw0kZWOsqjp5CP1!6aacXeoCQ$EVfActHb5DN)pN`_01aAF z#bNbab1pzbwnlMS#pzCfhAl`OR(T?m4y(duBMz%PJxPaEZMHa>;zT4sMnUT_e5hxB z8&laPt7lqYk58kUvCD;fKad6~NH$WVA0nl{EUq3?G3UTi^mhQk=aKh#LeHfhO%ppd z!lu>|gzG~}(VrrZ4JG~oEbyf$k4L{BgZXceEX|HIy! zz}Zn%`Qw#(uityUC8>Vt_qvlnHz5g?ew{!7r8_L?1aTA{#l1TbQA8v(T9`&1eR(mW z;0CxmE`Z49zKr`m=*%cO>L8Bd;KsO*<1mclt`q;??>YBY-Ku)k2?R$!^ZzyERozqf zo_p@O=bn4+b}j|6qP7lIN}WE>xoozp`zJ1c6nx?tje<{deo;3|$YenZ_cM`gbO{F6 zrpX#=p2a5iN{p?;tAKc;>4cn*t)AV_fpe8Q?x*Lt0Jk&-ylC=eG6ZPKz{B&SrxF8q zwuBerO*ZL8s*5H2cP8n6xyC9hjT|1)3hO+25j1 zKd*|pqms87>CYmKcE3&{PT?R>_bQmgxnS-EFtO+GbjO2sTLr)}4#ZQ&f3kI4P7z>0L~fR%^Vu#jW@7{9E(O!* zxuJ&JDxM1FDa(TLe3dimGdpUt*hYZSnIu_*g@3Mlnk;bliblfNQwD%@t(u`?zTS%^ z+@RM)Fb~}wvsc8X#ZB|XI&e{iXr(Uej3hOeA+f&{zyW)4cB)H#FT0N* z5wnO|Yw>*qjBGo!%szrUp-GRo@+aIjOEDI$aq*&jGW-(m@#J0C1k{kW=41$I2n>^h zL9^jQ$v4b12!=%aq8!F!x@3qf9*R?e43cBW- zI+52kDMijoSgIfgQT#3i&1abAn=+ys--O#(?&AROtyMM^odZmO|#_!5jn{6fWtC8UYV|1->OM|_^WVTWjhZ^M` z_~Zs{TIP!PLCE`kwao8Ffn3G6s}FPd?2AiL8^1#(b&}D$_qpgcA~33tnb1!L3RRN! zQ7>bU5R2jj$+w{;;zDEImc#i>p}@r=EBDT zfFUmDV2x5#@cjM1AmZgOdzuUXK1qRQQwMno1UZI~v8 zB0QwLQnk=iQ}&-Ea(lJCbbWbz>AJaW-Cn-FkCkQYfDPcx38-toeKCN}-h{X5-ULFi zHvzjM^LrDr>11z0QMw6QAisk+nY{_WPhKyjSvMgOULdca$*yHgi5#|{N8-BdSs>gl z-*C?Y!`Rrg6xrn0zRWuH^IcpUk(b(FZNf9_)I>>e4yDk?wGo5!N<@kt1+m{{7R6}a zaZTRfj=z^K*uO*!yrq7dz>@LMu6U3frn8mUX~YT9;w`vopeHVspD!kr~CuKg2~ub)+l=Y<7$ z2rr49Zx~qW5LAfgMFn^W&)^{_kH^se;sj6GgNCv7K)9`k2cu97`&?g?zs?&3rz?tn zc%QhEV5%>?2^w^r-)6e#8oYba85G=9eHq@q1aV?naCl32hPMRe%VO|cR)B}_3?70C z@myYjhwuy@f(r3m;o_k#GCU{T!NYb)&;e!er7k{)PlP-8D1!tQ()F?eJcMWP5LAfg zM&)^}b5YH>Ys2259^fNT5){@jQkT>%z7)%A;Lo~~=qqD#7d5$(|Ri?s9c zH#2isk>2>f#S}=(?V3i~V%PO?XRp<=q2KO*L>Du%t zJTWdE!vm8o_UjSm>jpeA8FC~ZoCaCPC#E!c?OhA+NVpLXBs>}qMBK~>h{Ja%LB9v*MK{bu)v$xL3Z2@u7MrN zfky>@L&2Ql)d^ir(KfZEhF8i*B7Za@yY9fmRFm&KMVIgErm8>;LXelbJ&;6 z2{Q!Fy@58Wk(;~FI<`og*IM5@fO*!a1FRR!s_84j;7AA01x(`Di32h=GUOFCt*Q-| zcgwg)v4%aUls*+V$O|OyFT6@DRlMR{e$oqjO5V&n$b(H1vx!M*TfSvN)_aoq;< z71Mj5V*#Spqk@|LFoH#SaTX*+Hvul)3>&&-g2a5wmY=gUDLgXWrM!|dFl_M5;Nr8fMPi3dzQ0QQWw0so1cb zEb?s1M#%9i8zILaCjxnHX6uFYxf<>e)@oub$=%G%c~gf&+iA6;6=D*67poQg+&2Tm z;eW4gAv;oLS5(Pi3(wXP;5inU_&J$!Si>k%etVB>T3(!(F{e^uD-qP@;4&M!@4oq< zoE8km0ePHl4a&ugzoBdy&jo6#zw^oZRb0i*HmLv?He^KGX;|i~%OdlYtO%-h$~TRd z?2~UQmKi*;&1>gt{~1jGJ9q2ExlyyrYN?BVH`7_s+e=ujiae{(BtT3Vbc zK!dqvW@k!N+$!iblkREEtO3Jp=YzBZyIzpfIDamcvqsP06Y1x9zO=I~>E8KWe`d^ou^+krGsvFaF>*J$?X1(!7|E*Kv2NMroUI zgnQas9C|%SAwXoIrczFu!6=T8uyM3m%9g2wHi_ua3c`dr$16vod7VVtp)4D{j9J!Z zi!eQ;?z{8DfL&_{O<3tKVNntnzjHLgUW@xi(J&{E^e|+WZcJ}E$SjLgZ8 zZp1g-iQX^P(cagCF_ElK+5J^0%cx7zAU4&2BrJ=FhLOs1NfLldQe3^3Bmv|}S_YDs zlObtYurx=KaW&{I)k-mjn+!(%u#U9z`AQiq)q1m)LN6n0y``uXNu;$BlyKv^sTJd4 z(CgJZ8_c#fQ{>oI*5t-`8%K+_)`rAj2~#nkUF$tVmHor(apW1-zL&Kz;;jd5Y-VPM z>R#;QQq~FkLkN=+-brZr_~>XAkZj~qExI;?ewh^sV3L|lyy5dl}pGgQ=jN|+;x z-7)lGZw)mgy)~m#(mc@yAFCE_ zCqz58Tc_K0_GwSWokNbg6Q%Bi9Ze*P z@1WFSt+LB>cZ0oV(-QQQ)r{~a1D&sO)Kk$Oj^1Mc6M?Ck9nW?vcUi^8R8qY%WQTA` zFLbD?vxFVJRddS0_8m{vO)$;q`vb*;ilV6>!X3VnB?QH2 zVxAa0*B9U+JcEazLOhtANaV$#hwuy@f(r56Sb&G{3?72=c($p2c(aSgkr%>U9y1&x zv9fD;`IZ74gu6Hx&fyqW`G2d6!{H0zrSJ+gz5^f;TVZ6 zkD=x5E)Itl!ZWlG6r+i0F*5Ux0z8Cg>WH8;9-bxL&N^y}dYQm7QTP(G!OiXqIF;W= z?DvuIviSRocq5us{yL@eMNp--Vwyg{|zoll3;zc^4mJVdvdajhC|;Jb$Daeu(C_KTc*Q z0nd*EW6KjT)&*>!89o~}7BGZ+_!N8nby!utpS0QZI(aGj2r^k2eN?gvpM(T5&cK@W zlkGbeu6NmYtX|LC_j*}-I$X*KkalzE?zGz*jqby4k7t0MiLY!2GtyFbM;NrKlP6_DwD2K1pmi?f!?h6Z%yzD=2%Md(!2I38S| z_rs@w5%u~|T{b)O=069-EyGR_8(I3IzeXP9vy^IbI!*SgSn^|VTd>QHTv>2BgbbuR z(#Lp110aP*SDcKP@2oHMj_e@Ca)xCfEI7P1C6b9DkQcFB@HIKjoi_-( z6kQKI^#%pgt2Zk_Lnmp5M)wbgynAsJ!{67EmALhE<PL#xHnCUVv^;3OoDMsC>wNBv%FnkS>OCGDPtwho&Q7_KLTf(JLyt9wH^%b?NCH#hoUc8!ki zydNclA6`FvJvf7c!KJ~LiQoU>4|>9q-s0;J=$f{9wEee(yPhY9H0hF{YK8%FM3deG zQYS*`6d-*fls*75Cqj9gpC>|3Cgwm+g!1@)d?HjyV|(QJ`}=`yJHZ;MS{;>aQ2sYm z6FdxP>Jvi~&1U!p6bZy{2qvN#LB1j05yO75Bt8vK6FnVvfD;p@a2@(P3ZJQ)WvPuN zs32^Nxm~|gi}IjR^c}D^yaPX2IQ#^^HR|Q5H%KJRnMpO`beD-2dpBjZm*Z-u3-)u6 z5F;)vOmrn^ryB}R;&KXjC63hMst81&TVW15dzcY6D%JR9wqAwQRKu%SWJO`5vaD>u zb#Z+-4XSamWx~k@_@ME({3XR1B{$oHCh$(%A%N|0f8`OSTnO{SH{zAYlc+X!Ktbet z5$xDFjZNd@h=Ezl9@Qjm_P)>@s7>zMSOZ!!5!fw5! zw!d|sxD(^XiOKa&ya&Ybuv^N~PTe{OYw-D4v;4UTeEJL1 z*RvPIp%JWn&?EI2-MKtn#Y7l2H;*qQnNRHs>}R269zu=bH@X80CVS_TAY@)q2yfC~c6{a;{ltBjMJIK`>$g8OqH zfHL{*_n{9Hc7(+g@(UL z)9@apfl$x@Hs)!_rV|>9(g_VON@#eor9t=Dnz71zNrXL@;*3=YcgHFW$AbeqRxx9Y z_qjM&*9JG?nK1@IF&gkAb*AI}E}oGD58;*;`gCI$_Gl{Y2i&ylkoI(u-S!6oPkc$f zllxE!^5sL~OY%_0Dycoo*FyXZKM&;V?Ej{3venS5tbc5W6PX#m36+uj=y*)TVC)>J zNq@M*%EL7xAL3)-y=dZ{5A(Ir`4}JJOTbeo@OwU%3ICC@?}yjnA)Vpm9&F5fKG1eP z!W`QC9XmFagZe{|kkM>26 zm$lBefqyQBpG`Q&QdMt9kLNwe=+_SmejyJ#1be2o;hT=Bpts4D=BAdujBZ-vx5=ES zfqWXr;+AzXuW>9^Lgj^5UpLW5;W~xA=tVKRN^tmTkkAk7Mm#I<;}h_)8hsP(f&CBq z>FJv}n65@Y1t|I~ewye%*)Kg3z@H$jem$yK$^AY;)#%6g4PYnz4$pdRs3z8&6Qr3I z9*zP>V=OghI8SFWy(wH(lgel$L_drnSkNo}kI`xOiu2=oKkh+jZNY|L++`qiVL0_Q z(+` zH8|AmFpL{J_HDgJd62kQu15a>q8H{+VH`@TKW6M=7DvqMFw%QGjW~6^oaXL;!%j|( zJHae>jnfaX_XWPK+2$sY$127qBp##3>hAO|e9hJ}$Af!PwM_qFtp~D}{}aiB`s+<~ z4^^WjU~o`>>3WQAOpUvc3|a9NT8ik3U8n_&)i&N>J-&ETw{@2W47XGo8hD{A>^g=o zntLOgxdAY5jbU?Z&S_K*98ziL0FdDmoYHLJJAd4I8s%{9aFW)juc8b#f>m18!K$o? zG_#+KkgS3X;_59&LQs0Rugl3G23?fFMq1PoA#bKX81zjmgXXI?S|fwOs1dV<6|-hW z%%oyh+KL@D6}vLa+rU6_6>El$menX4#&}!4xF18TQPa{n+;{^NkKFEcAp%z+AZ~2}3u?78C^m2sgi)593E=nB1YphtjME1X2X3`s+zy7Gk!%xp)nNEV zP(dB+d&olfqtkZ?E(VZ(Aoe}NP9eI9ZPOP`jt|hz*jquh9z~+cVdm`t9kQo9<&%V_ zWU~L9Aq=UmLu0Z&Nq8RC*hz^#-|vGET!PrpF3~9Oza_z53wK#*SIHw(u$_EwTZ}^v zo=oDb3A;G7b(yFRwLs12Vv-1?(!rKexc^C*VeoB^@ijHBWeCvW#D|0$ip}sOdK%ea z={XkZchF{s>+pKX>8ND9r(~6f`&-NOQz;sOPIT;ZC>8I)>=WUOAG2P18X&wDB!bVM z!Xvr~9K_gnfX4vTrY9f&5@{BeLNVc!+7IV)JCbyimHm}v__7ePU&h`*L}~M@Yx|uD z9GKD-|1P)^P16Z+Fgrm-4|7~)oV+C6FSqY+yk%I4VSSK)43DvGZiR97#AV;y@+GOTu(PkS@%Bu-S;oUS8opQ^I) zpkOhYG7{Z^pYb1;Adk>Y95$D{*3;Mq)TE?L*{HujR6mvYyMQ1W=O@K; ziO~hqcgq*hH+xfOfOE=J)+o&1=~I-c%Tr8U?l2V%MRGGRVd_vlsxF{fh%_I^LCTeWmoav`Na|7f~AzQ(gTrG>Az|R;iLsI(PO+Q*S{$ zqqari(w`eGmUM5Q(lJ;h6bm5VqgKk%FWKgBbEsHHMl+p{&b<;HC7q^KM;Kc|kBa7M zL{Db#??gTlg~wlQCVCSSIbUG*-MrnjlTF~gC<(h|aJ~h$#t>G;{0`$*#G8665GGoH zGs^U1M;mM;m%pu?v2$#ChXf^V=B4I%F)jp5+5y!hZj=fvF_TMD^?b#VrZBI z@LzMGYahWj@^JYx_e9a=>k~7fALkp_!8m4@RMXDucGLw=26|X^P~*X?HD?DP0gM#A z2cOYBq3hiES=`u4RFw!FoET!1pfMF)=tpQ<;AA#kH*xNvBy$hayXyqQ=kT##zsW)tvL3{qSgx4W=6CMGbnqbL z4>lGMxKkcqq2|*s9G4)1_-OO$H4XKaq)X)t36Cl~pHVQyy&c)j*FnY)L5y6&x-|yl zGe;`(CVP9MNyYU&u7_|=#giKtiHlI^bZ_d*AVH~OpUCd! zS#jPmN%YxxcS+(zNQNY?F3iWIqzQx@^am;(>_)h6d<*H|`T$siHxAD%<%SFOD&SIN z%N;Jjqg1j1&cIAz)e!hK7|eUMs2d`&3dC_=x2V5mRB!4g{AeYUKhX2j4=9mkwac-{ zuq3)m5Y{e7(UwF%V}LUqXCsMDbf^&F;%`||y|xtn7vcnz8#58oRranYx&V7xNXN=!agg3N<3~iqmXFf>j#cVjir5kaAiA>&Nh_i%3%Y!LY4S z+>qD|8ugKaiXO!+jLM8*ml;FeR3DmLBER%duZ!YFFi0lu0*}e0Cwh=MRzT($$mCjX znMp{dh^#{;7a94GokdK`wOAyfgg91cbT2*lmN=>@~EabVRrqKdWe zEie2Z8jk0p9cjyAi^mf9^dk?{veqXpYrSb%>(ec3y=__RUw;rSYrQK>Xj$t)E|%FH za1Y8VIfcuz!C>H4>suyab=LR^ zw`sZgoMAhZjmu)jvNsjrAl${la1oAA72qJ;#ldh62M%XYo<3cGgK!rI!#Nygzrx?S zIH<8q841tqS0E@x6Z6EJQTTfok5j*d(+4G1Q0-Ja*-LO9m!at&TwD%KglA|XD38aK z;WI8Cr>+Ti`NMFG#LCOzoCEjUpDn;axQm0~91c^Sn_V1Ec?i#xhoBfu%wrfq1k_;_haB(=a5T2oh zpcqX|iz(9=3-A!0!9!3UkKyl^Ts*C$Ef8MXgd>aXf5KZ@kohe}Xv=5tF?Ou;9DIZ; zKBi7Cl4Zl-w<3JEB>2i6?Jn@0azVKAyl3i_00Rv{e)wIe;z?|=mB}+)r+`IV*$0kw zC2qBoy^fPJoYnsd;&;BxM1Gr(4gtV(D<4M!r~GyPnL&6Q-1LM?UVaGoYqm^f57*nv zpFjQ@Jf$atV=;C~KCT;-?xoq09-`S1CEw_%p1ux~R~^x{tBjfyh-kWIM|73-;y1o+ z;RDFCqsm93i2^}e8sFAYH6W)!q$!Vfv@uFNZBW-UFKH7Oeh zq^}|(`YNKKuOciNDe3OUko~(qwz2ay!-w0<^Xq)B?)-~BZa2_x@Oj8vo@mq6ycg9x z4;#DDUef0^D$#1RhJJe$pdWr8jV9$KeE|NGa7yFj;56Ky^BBIFc}U)5|AZg@5J}}k z!2(v%B8swZ5|3_U+M%JIp&^+HF{kVqqzxQmE))40vL!n6EzSx{xwt@XUs?p^9Lmm2p(e(Qq zmXKN(ISEg|$&w@?3=>}OH;i5Ixm2e(sgBR5!t@aDX%S@MgGs(*E3eGeh(t4JVoK1D z-h~*tb!;RhAHfLN$u%21xS|xjf{e14HF*mU2aI#8L2Y~~)XLZnzs&|TH#-p#gPJRddmdALCFa^mS16s9UY(?f!z{}%Lm7nO5$Ovg83|L6~Zz0c0??8p_KaBSR zv%ks@;V9R9A5uJtN5a6&DS!w z7EL}F5@*^^uE;oF(ktgEf~w7JF6i5dnY+V4@#^3({Hx63LdPeNd0y-Oi{U!lv<*zo zEe#G2#tIqf;bJM_WF;8HtDJtq^E1NaLERYShx@@~Km0wlj&227Ucr(5{`8T3ge4hv zP<)ih{qV=sHJB2deqRat$Pa&tFk6M539BFBx7lL=vTv)R#ZK{GB97MQk;*zh{53#l zioDj>D&JEu%m}Ry`szmoYl$0PLplG?YYVFZU~~Ae&iTO03i)9jKOCiqcJ2a(YOsDj z0Dk7Sb2eCK-*#fW?_%a6F7ZKIa5QP-y?zi6m7oc4 z>O=B{T8UFS_xDotatdd)hv^SXP!K{SFdGtJ>SO{}Xz^Pp5T%$c^NDzs>#-8xb}qs+PC)t%gPw?O`I!NeZfy`esbn z9}ygbQfv-3L?41O25as_B{b2baE;$I4j+JX8|u@Ts9O^p-8`<>FzC1yEaY+hap^F6 zqn^Y~dpeoksGrz+mKRJ1p<b&gkDY(#NBK#@1;P%1Wg3a~q z2^GA~ZdHbgxuI>+Nzc`{Cn&<7gK5E$!S-MSKC{y{#Hy;M^nol)cS11aN=96Zw`CV5 zu!19v4}~?l6)!kKpYcAiY4Aqv_)_>?;6(+|JeN&tXr&(m2y5JBh@E(Ytw8@7Ya434 zBHLWZxb`*tZwZs0a02Tm2en|5vW9Hu^Ab;NT$T zIaWps0@jHg@hiOF$BLx58m28MATz9x@-+MCG*-++NhwZa`?&)AK(A^I91oSw%~G+A zDJnXX3lnt8Otma;({~8L zqh!G$&o4Ud-$9I+U(P%Q;qE*I!$thL!^OdNZ*UVH^T)?ja;Za5j3%zT)ymI*b@9Nav*UNd z9XzK1kAPDA#pwp}*AI^cTa?MIEYFn#ItJ#r)a3i!f_w?jjE2(XCPUm`mnBexsfxVGI!mS*$xig$??vTSn zIn(9Lw~UW)xN*k+)_lt->lx_4UWe>%Z~!kY`0=Avp#D=gxQdVHQFPX3m`3g-$-B_j#iOdjj6*K)qy! zFdflUqOV4yZ;5s`f#*s9SD+wr((H(akSrQeJko2#Xb2irKNp}T-G>kjAz3t{N2G6w z(GZlNN%u5FLr4~ls0HbNVl)KBXxglI%YonG-EZ?Zj;sO00qI<2EY@KsrgKykSXMjS zIVwM#0U_%f=stU<{=J7w*dL*A=j$jBv9;z*ZEXiK43f~-cCfwCbSUkg#H4C=yyI{8 zmw0~ozaf?l-J}qH9`DsK0tP4Pzb~4!nNR9XtwSmNkd$yx#@+2T=oAO%|0X$P0@?4k ze~RB~_*7dwmAwDxR=j^c0B1Dmor@;z%9(x``N|n?D#7f`^eg`#XN3=Pnv}+}u>)T2)H$zTihUfo@ue9GklS)b&_0Q7sq6+-KyH)xf2ap#{ z`twDTc99p7qDg8lZd;mPh619gnTa3YTZ zonz1e7e1i-zy~TO`+@S059kT-fdTu0)Z&ATw(yBT`-%M*KXG)8PYl{mta*Oo)^U7d z(42e3n060(EZvjhjK4T+MhZ-GVEwSo5at#};<<$$?^ZOcozfTP?2+QWuFtQ`OTV{M zZ6^uso7vG3^T}`X(GmMeUUA!n#Gb{8aY7}qL!tX-W(O*xJLc_fY1Pb}Vq_sPSl0!i z>X7)z=$n__(lbnK)@$lzZ;FHIq_g80s#e#8Ad&Zb%=S8oTYHnvfWBZhcTIT{Qi96a zUZvelkF^VSv(!`c_Jxg7T}WQOZAWF5Nk0Rx(FyTR?9)(#^ELaahpv=*sx?_W=ty_% z@8LtHE5U%|qu2-j9zN86bWg8I#{Sm#_wZr9ScKB)`g{1uBb08{-@``+A^Qd(2gaYEn3*|1HmRtY z+&JIhlt-vGG|#dawn)B~us;<++vIFgD&ayV2jYKHZWjTpHcr_w2B~;I0o}N(D8OX{{nft8 zX?+M|TE`p3zm53E{qqmSzsKX>)9{b7#A(#)@o$O)7;V7irIqj;>e?wxs5`JH3G9U_ z*tvwYo|zf z@DhHoco{dwYk0fF#q02#aF^!{$7v0}{DQQEyJ;DY(>_k?x>S&sa5pW(aayx~yj+l$ za5pW(aoW{dKRs?*tc6$^BivcXqKpuf)UQcjDM(LvCOtt(dP95FP4DoVaF=$5W7@T@ z!W*##LE48bYrmNr5)%Ap>A3zasW@*<$1!-`mWuOs8>cLH34tYaW5PD(kFAh~0#^c* zbp)-?a7w7(XvmsXhhl{kln{SxWrwwmAS=$dn`)0Sn`&7j{`gJEV*E?^89PB2cgShK zs|#}SFveoH=8`vl_zu!dkMWmNpL9(g`m!{lcc{OGxxOAhl4n@bRg?Xdmm~SYJAo{G z7cu(q%=Zd{-c8VZ2tqydc-Lay`0>KyrDfqx`67tVlD?k3)4&w|4I-lZeK0y5oR!DC zK4<*J{j%=ROo8crIs5<#AoyPx`jHLY&d`q;!u($;d?iT1B_@qVSO?4xFGQFVCY&%j z*&FiF;cVBg3|l>L0$&}b!Z$WPoC=5^?nVlp`=g?n6D-~o-Z67QT%5_^4Wz(BD?Q+hNqeO(pDs@FK{cyGn}1(C`C@D@%C&<>-TWua=_^;Su3X z9o$vu1n7{zAIBiPC4Ts9V31WETt|Q-3&$gWT!9+y1sKi=^#wwOo?qN3^y0SD=)NRU zk^A9?f!h!FA$|i6B5T-9jPLNNftG;w-sWd<*$Y$pR z*)IKX4=|XrVnMRJLvIDdwrxx(B0^;rFHDGsG?ALNS2Phohyrt&bLJyo)pz{Vh|fky z^4O5+ZRc+eM4q!unzke-QkP1xXw}T%Y5xDyl_U%AD>F$wX;LCPPWz-6b72 zRzNOvM*zIo;jjd*Sy+$45Ug94>)H;2dQBTxP`67A;q&825N5VSx3R!!RIglFfkvaw z|NAr{!Y8wRnFdylJ|ZbE1+t+P`-iuo)dnlV2cUUHa5kMZHe61YZEHL|@DOjP?9^)9 zQYdbfS?3G+;{>G%X-l##<>*+<*iv}N;L+WXJ4jSG9KeAy`Ft!a>=SuJVP`%QQ=PM^ z0^I$~T8~e}awHg;d{{oGL(IVspO4y8N$F7`a4VE|nu!oZA7qu|DuUBd3p%bVd+<8v z!J$avBd8RmeFSyU{{!X8Qn>}&JNzgz9<28Ip-4`Tk(?e!a&R|*s%h9+>!eNNNYQNg zF(d>d)`{*B$j1rs!)HJQ#kn1ue`E8?3;c!}4$E|+R9B@LIWc4$mqJSj z(DI>Z#ou2FEx)CE1w-v$WvDge`C;mVqUA!CP@DSJmD)Ilq1KS+piQXd`c@ikA+^#C z<1Ec2rVgYt;>9?oQ)1sscSP&sTIr$&XG1Bs*IFyFSQDvOuo=*0n%bp*;d2lJ8+X)4 z)Ct(My*?51N z=?TxICn!m8_`cjt@05XXTYhdnW;ot_Z0Czi83Gr_8pxf&O}Ik?(GV1)iDg6agx5lt zQ?j9R1@2zVL)&Y*4780?4#)m#>{uDJOLjsB&*iS;w|n_qugZOXpQ$PHA?+vqDQM=O zzx$cKcVUNZ3+I5@L@@C{X@@653a-CWgwG%U6e2gqcIs>c<;frC@KxaorIaAG)VI!1 z+{76C(Fjt7%}!n8t>9xtXPA$BVc#fE6i3%lsrkEc7tMu`rkl5oF2Jd7UxZWX=v7x? z>_q2mPnPzZK5y%{Ne8xmU}@$AG;W3l8iO_5PP&(gaTrcun6cq3LbOp#v~TzK;@Y9` zxs35mDDL;M&*7++uCzaZ0En;$-Fk3Ww%NSEj(0oKI6*aTKMo*VvsJ`cZQ>4>7(jEZ zIcHpH_i$4Sdstpx^dM#~>w-&`qdvW(ydxgq^`n@g!<}|Xb)D>OVF-I$#?0Op^5#U} z^Uf3AgdYR#n2YI|ngDF!JVXMqZwHV=I633ug+~$UwLm35m~E3{9lsOda6LZPD;QFD zK99j7p5X>SI-f&;os=I+taXf4#bH_#tLnt6v>DkCIlJSBoYnE8Yst3gM*g-%3fq*r zgTHbvZA6=@9&ZbCnlewqB98NpoTGk z6&?|<`T#Ce2nL1*V@zz4ycS{di6*n?>9qQn`N6Wrb(diX8D^`!>B8)^Nw366-IlRYu>4bkUJ`_o6Qm z#e}y6%E|ZcyJYi|mq3;CeczH-t?=c275x942pA51vHxTfg9Gjg=CZVj8S?j6z5-lw ztw;E5kcsTkD618dIr0!W$CbNBtDF<>!+;kTCs@2H=i5y#aA;J;kfAUa_!gsmd#iBa z+x<1%EoQ5QwvgsG;!WO9^Lv~JwIvL1D1(PP)Md~wCGUxG`TRD4O>BUmzB?N7s$m>g zl<36_kowc;se0Qm*f z;ms-+ALYd0BfPY!ue1gr98Go+@>7D);?w@Tz1qdc#0DSX8C!^;LOh2R;2}JNhaeZv zq1i}7pm|(uq%e0GtSzg2$AlepV9H)Af*&Dr7`_DxKaNj(OXR}wgF=|_%Yh95R%Ao1 zRlHdBP4F_l*l`)3DKNC;54Mf871YgdPwj}v>#Im^qa(tH>s>``@CD9Jq{7FqKyv+g zIo{M3k}B-_MJwecpbYBs9^a@0f#h8Ar%Rr9em8q3{3)~@h&1L2Mw@r000WL+h(W#o z)lB@ZYv|Rlb%@S)kp{j=@Vk>Y!2TF7?x>j)%R$c$+A4nd6MQ@qIok93933ByONaD} zeV#do3k7j9zh`H?;;lmOiz^`KcjER}#1m_%f2d#lcf{rq0ec}&Vwf!!iBn!`y=`R| z+^7#sZCC+S9HR{V+J24Ipmdyvf04%TI=uIkbC&(GC(VcVi!E(6_ z)A_>rM+=TR%n^6B;y5;@m;*W!gy-9huS*qci=-Irj!40Zh@@6`?1Jx>p%AB?`|3+8 z!BRDgFyRxEYVeWgGqZvpv-iZmH@6!(?|LFJ@StX1dCeFEf1KwxJ$VM%E(4{L<&|!es~9}ezGSRZX8pUp-`)5_Zu-Hf`i%=hr{QfZg_ocvxv>& z@3(->$`F-(^fODuGl+6l{JBnjijM!QYRlL3(QBrI%Q_t_?OFXN&Z9m1?Zc_&Vf2>5 z%fYUTZq_*&LNOg2UYUgJLS0=2cqNJJMKgK)QBW;pI> zY+qpdw{aK8Sr8*gAZ-uAEslqvH)h!2@WV|Y2aJSah>bH6b#l4!D2B#Lw*s)Uu!jy_ z{JBIy>lT;ua9o8~XU*TxaD+>PV=EDEX`n^GaIPGymEJWj4%W57O?al?B`8J{^VHZn zN4j_%S_tp5hlb!}ZpPRqYh4`E2`z+|HVvt5a;(@W`?hipG&z~iC}0$;J0USk<2o1r z#soj%nfWUo|0VcC_3~nK~gTDX^7MgC{J&LwE)cL4|lW z6yPB|gNL9z9wSo|E*?il2zTX`;TVZ6laY~Df}`wV%bjg^gj*aBprlYjI0BQ`r+^(8~_Q;{xm&qL5Ib-MiiRa)B-hS-y9?ZTG ze;8bg9&D&8YpOOGJ8%32_$a%1#(#^q@I2`Aj;M%L9ky;cYrVB24Rh>pZA@_1Ck;Rk zaf|F0AQE{j_$D&e?1+@Gb$D8hjm{*qUHAmneL5SH*G+sqlJWT0Ihw&kpSiO;oX*(R zbY|=Pv8Rr;LH3= z%P@&mjXGS|s=z41m0(zYE2}pvWU?0Von>F12gY0rEgXK)^*k892CdA+O~Ka1RK|8> zS);FQ^g8-N3lYm`+(3kuC$Dmub94nWZEZ@@nN)a4nmEOr#{UbX#x>=3eYwq=i9U%U z&>F)u)%3Su?1RKGCK1Nq`Z$0Yh&aW_?BzJ=vjkIAc^KG*({C&b$(@Ip35$5?6dZh^ zpX-O6*`^%8V;Jtk!bH^2GTEc$w<$9unFeG&P6J)?Trh~)!ZkqduGm5FW@dKonibRh zdXfdFZpekicF%?E)m*Z1Y%U2dcsqlshzT^Oq%gj*Nn*<;IA_BB^9cu10o+VUTBL9$ zzXWSK=4{a4SS&Km9>$yx+`!^_q+-qn1B>N>JGMXsEFUm8x=F>l4@q1IE;NN*2oW-- zr5{cpwrt3_iIuDMj_SC1`wrZk(AfQ29zWd;WTRu_(N`g@yRRlhOyQwQFr=pNP}8g} zH=VWR`p^n6jbc1MR9DAUR4_9;0Tr~39lwObXwpA`0HLj#OoQQI zg;_Kowhba~j$F&%3&)1nB7=n~{9xn};Qq`{N-G~#``QmjSbBQ!dnk&|c2YC0?p9TB z>&D$`%8GfFnT+>Z*zc|Ad5OngAh6Owe^@0r%%I1EdIFEGEq;b&hW|gE<5#=Y_Ykt@ zO{{M&n!`8?fZKdx-(0-lz5y`(MyNg9M2}4)7&+1ib_`O7C_-vxTf9U9Gr-0B zG0+a%u^8|Dv57tW9%2EPDsE)VwPnX<;gBU+mtY9%5?g6Hh@D>YFco6X6ZviSIVo>m z(g_LpNJPWm+>Bh&`B*R8Q>ljX!_{EQtoCrCv*!J993XezLPT|k41!T&@JxF|6yi#j z#n3f^e*LLB4wB~mDdCxD$4K9GRE_NwA&25!^T8S0U2~WQH{)H#<#@L+?krZNre4Q_ zqW{U#y=%4)wVi{`L8WK4?ylaEGj|x}SE=f>2queAQBr`K3qnrpNo7ASi95DZm6_6p z?4d;xWlw7mx7rPQ&3a|(EU4Ca&D+?}$Dr!su_8HaY+1rHwl6_`*hZ~@)$!Ov=knT{ z3-A!`_-N*Eji5Xp_|oC{@>my-Baehz`V|-^#p0GomH`aQ0_Z8@xfY!mG`FOew^zqLhXZs%i0)P0X z6UNdecK;Y1u!?m<1=Cv3c4xmxT2}-jJYA0nh&Zh1NQI7cPGG&_6vC9$@83};9Kt-b z-)x2-qSBnWlzqX6`Ks=MRH-an4TTcD5kG9|(l`7)o)@x>mcq4w^DNi+^8nkl0y9nH zm*8!#dFspXn3DUm{5C0d)%UJ}Qn(E%Z}~?|iiMkzW%xAw+`!=AP-)Lgxek1KZT69P zze3*qHcKslmpOnr#&~%O(0duNDE>xxA&X-g0dD`nc53RZRt*vUo{XFLq@3bX^dmdM z`$Kk@!mp3;R`XO?Pq<%L@M6Tbv1d(0EFlVY;XepU@TiJ=@^FStcw}5J<(UBG&SV@M zV6Zd&7>+{y@DU(TKNw?&`w}YAH;}vRJlKg6IYF$e!k8zXk)88%GNI~xJ>!6pb(%Gw zMT~RSLB|t?rZ#oD+WAJhx+WrpLRYt}NMM|5&Ox_WR)vW&S;d<#{BS3@Dx<=IAsk03 zVkR?nzVb+ARS!v4;3Z)n1)!$JtRJ2QjCPyH*{C;$qsJpf9X-4R&SIb!eKSK2+JsZ{ zS>{%QUToWjD-5_e@155R{GJFj6pTj!OZZ*T!1-z3rT9J-m@@&_0dGI@Vk|$L!|yn{ z_~#^-JJtvG9t+{F!zKM=@RdloYvJjJbR2b0ia?LO%Z6}0a*9z}PatlY_?Wn6CP)1| z&J{R=hFJu8fuw=TsKJ~1M-g+_)i~HkL-hT{8rgNCc~P3GYq0FU-2FSF8q}JUzgiGYqbCUY6FAA zWNVE~F)Vxr8YX%ccxN|=+Dk-FK$`Uv7*xrnqN0SG;Z916{Dv51$t9z-kJ!)drfwRM zZh8W}NBCJ)U83I~i|_pN!{3qeL+M;b!VZb`7cRkL;bQ!RH%m^mN7f>b1-11~f&#;4 z9t>srHExFxzs+B{W}fj!5Z~COgj-vO8!#E3Snr3QBXV!z{?PBAmsk63H*bGutmuUx zBKk*uM5HeWF~CdwnAg*BOey*z;L(@x1Bx1P(w8#nKQW2dnl_PcK@ek*B+|>ANGsx` zS0qqm`(@%Fy|)Uo3GG*L;75J0j=uNsLaHho?=D7(f3oocd=?!=u z{VesIEl&NaUXk{xdpw|58sS$& z(kZtoJN%ykHe&>zGGp3xNVqc=qMi0t!O%r-0cY8JCerfH55LBEhoY;xncm?wXt&gl z*UEF@6L>6q6hB6d-7Do90R5`h!rNTFjHcmM-;pU_7pCBQ5nrBzZ~Q|Sa;SW1gm0F@ zcjeCw@@XV|t312$$M+^d$3>#&FMB>_Y?pcA?VxGl8~7Os--U#I0DTjoiojxh-$XiW zro@=nmtzp}HGDS{a7kP0|9Tif*kEbLBIC%wI}R4ujfe#^2F~uVvx98F+&eC~mSIOY zgU-+lK`7f5+;r{NdS#9!oI{@(-T}E5qZ}JinD{-wCMRo1xb)cJ1&B8}5cGuaz&A77 zf|Y{l0j3zL?jQaVh9N-@{Jgyr5!U+=bZj3t;c~0y21AgXt<zMWKK*DE%$Zbd2aI2jK;WgYZMNnuD< z+gD)#71Y{q#A7aeKXBkAX|;W&La$Ds*m7hFLFRn<-(f!Yx(;|B_(&b_0eNN%WGqBtQFjMVg5Tn}*>hO2v7&T};fWx#ABStd3jTx%_1M<{}L0;)TdokO^={x>U z^_}-txemP#zISXBmku=fd%-qjAFsCIIoWznL7e5GU9b&(w%7&JF99OViF_BGbB9p;TX1^c(0Ke-^%>5d(_rNii_X^IwMPh=q`+{ za4q^F@{N9kAE7V23WROklK)7O^y6XqkEB9A!lJ+)A6!Z0AU6f{JaczBITHOC8R~US zdPmn3XG5@)xu^9UlNhtR-AFr0QK!BpwBZsyqECHwi4#XbjdTu8tpFHQJ=m#&twxH& zl8DXlTXtct)g-Fda74Q{@iiPllB(VNKd^*5+gZ!{dMaOsJ7l>Z{u_!3QD}xg;mZVV zDVzyFNuMP$6a72DvQ45NTM&MVzy)R%{f@22Vy8v?Is6ZNYb|#ncLE}tE7momchDN| z(`6l8At}i|j*1+>sjKaHW3f<_zi!?p9_Hr({6*F2LGF%Wpyh2IbW3qw38)PrlZ$$no{>jybpQd zP+B}5T;lUM1JEr+!ZK1|RqDlvqf1xgzI=v}i+#vZk9=-D)qLxbZ@Nc0s_3_en{PNb z2ec67ZAe$;Hzn&L)+R@eZCvD29^TwEZ+IL}k0Jj8j?qn@uFPYHIrc7;!e6jlO8+L% zhU0F~7s6`6*H=+&a*ZNrg%v*BA^u8qCGc^(gYcBcSoTQT@Rtdv42lp}fc8Z)y1f{0 z{lnO&(31y&Bh)fh}d@O_es>u9Rzf z!6Q$+g0@NSkpbzks3l}osK^Y$LF-VArp_Z)4cvgSx7_T8vd zqRl}E)I@(mFs08(3nn!5#!tk3n)uH85TwuOXR~H!`Cd!--o2}{{fYZE&v*B0itqGX z67yYSC42|*6r(iXQ4z{_Z|c2ivQdYY?16;rfknl|{hBA+{hA`1lT&UY6?&yyKPzawmh{I}4M8o%ZxTVyZ-+#t&sebM*JHp$f|0S?tS&6pjsqfas0-%ufA*=WHVuGbp% z-qtZj$g$b;tH7?h7f0oc?&aaT3U-2G5)i+T69`g@J@h!U@nfogamq?=*k!Fj`2=YV z%bh6SnM8X z&b2VviBo~s5ryz0v6p}lrX1L@@q?ItOmhjnN~Pwo$Y=qPp&B~b=Pp9;tkT=4m#5wX zal`&_LuFa^y){8%xf+xmlBRHtRuWBbOWMJtYw*vj>v0J*No>kkLXJ;H9uT~gWfB>w z3Y(m;`_ZmW*Q;?F%8i>w!ZwY_EHmaEw>59-?RW)#PNuT_Q~1&>e5b;fW#Nxi`0_0LEQJqc;g45%Jqv$=!dGPB zXDfU-3x6WuySK16`lS+101DJ(#8WV0if-YssnRy^kr@8v6nr#>->UF)i1;B6VgkA$ zHt-x`1J5CT5)q%{ASR$2Vgt`1Ht-zcbBXvF4q^hjAvW+FVgt`1elihX;UFfU8)5^` zAvW*~V(hQ~9fa`duo(Q#=|EY&Wtd&iW*Q2|;^!g;`>U1cI0P_)Ecb-JM}mQtSDV-Z z|4KK4q;MrF&XeFL)4{K&gLkHbeSN94YtzB)>EPMv;H60rTanat)q}{A6`cq3p)(+V ziC48rO5WLMkI$DrzRiM0e}_)4Z{gu67K`^K7Oxte!m?HM@Rwh@=yDW3`UQkKx&|LQ zl0ii?@C8d|NZ2tM(k^{3^ui^YA1Rs~^4m-=q=uhGcDiVcqhA~_kfaPUc&d)gQQ}o| zG`2 z+-s=lO-SxSMLH5mMY;IsRxX!hV-Pzeqi5X+lCPI)6E3q^3W4nWbjlSTC0Y>}ilK`z zbRePbzzj8!?*^6eI7wvyjD>-|WslAkifE;6VVXoLbNbus*u^@>Q}#|PdETXWr@fR^ z8F1PbL+7=|(k61)Lh&W|f=hb!Gi7=1! zk74?H#mC9YZphvs$VA-;GP>%r6!gleS&VIv@=T(!6r3xGL@7xk+Dv&09)KjIU`{CL zH^|U9)5t~zndmSjPsjO;v?TRx25D}s@Pm4s(TZ$FKSUEM z?G{Zg8PQ4cnFlCQWAO}|e$a?BY-TcS{Z(oAJJ@eXZafE9Ai2O zO7E5grQb?|VoWDN>4=h`bQ?)flzS2s6|BK4tTBBCTlZdg==4ol|V)DNU6l2yu17D&oY=FI6s)0rpSkI_1r zf;8scjWo@?HE)WYn7dqtdsI4;gDc?yGc)x?tJQC_KhTM8FmE*L(ee{eX-53RcKzY3puX+;dX1vMu zC*kMuhT-Hnco-3My{tP1v#fw_#7!vTIDdpL^nxC&3B;0PZ0C(s4&Kyn{Iu=N+NO(B zAw;ao8ZNk?Ef{0O+^Zi{i&5SvC=&~s(~m;X7eG7+>NAEfS1N=mZ4`!}^CWd*N^=%4 zPY{hm5TqFA>H`MlKv$H*f-*6vx#Y0j;SddELmOP+F10w=zUFXntQ(c^I-fG3c_i#H z2VxuTW0TL29|RV$<}+l2DQ$`NUOGUy-e;3}c4QGFXGsBpz<^ikokxoG;MC0`G^g=nWv5E(O^`J>9hdSm^P)xVZ-{$Y|gZ!4R`r{ zl^?9MS!vFzY|zcw^gkD)@Gn-K&s^1(_FGTG+1sSqbhVfr(dcd?Q`0N0Vi7wUh$b;} zt2p{+;!YUD1R7(Q>dL%QFL&=m@1AX(%+Wo97+quekpLX5vAl&gVHab0a|}-#%g1Kn z##lZs3pd8{@maVrmhYQ|8)Nx|EZi8&Q(3q%mZ!7uB4hbPM(koNpA^H>#`4KA`~b#s z4zV$cbBGN*hq%aC&LK8NaSpM8=MWbe%Q?ixD9#}^@EqbIV>yS|7{xin2A)BDk8I;p zP*09+oCKxcN`lf6B|))`lc4k|NlnDoC;W}k`g`I`(MK`w#cgBBr<-jYX96_r z*1Dm&JDHhUSKFBC-?5EZlR4YC>|yh#_Yz|p$Fe0(d`M7Ico@g&&uNw$>zD;ftYb-# zwvG*!XF$ANXB-2yHR!Wvc9_S)gJ7SEi98sa$T6}?cmh(dcTHq$t)WF)GA8o8%my3A ziMc@RUbvMyB5xvdtU`-aau5@_cc@oQWQ%cb9v&62NlGg|k1}f_bG}#zQuA;gKJ>cD76$ch`D9IGxR9oaoRB`8t*R_%8h$XG%BRsS zpR9?@YvgDmFJ7LJY=ms)qkb@w%6zm-=4lg|?&Ub&oX%NHWGyxQali)7L=YQUYf&Ps z_JdWaoL6_r8QqZV!@3wxV$%~}oWUq( z^VnZGmBy%8={@||)lkAl5}_-zEH8&XrSA29mCJQ}M6yjSkrmQk5Q8u(DPL4UewPVZ zGO;poDF!yel@%R{s>|%c&3I}ba#r!aRYs=x^TVo^a{)8`ee1@~89UtJ@Vc?X&7Da& ztHLcZUqq7eZ{lZcT29kN*Fo)h9T{a5VHl@OtCPCLvB;RjU^(2l5z}2b>lz?S?rvHf zgY3)cjzOq6I4rV@C&rTEMG=#N~hOlze5K@*({)17ACGpY zL(37)`Ej22xq|({(()}ZFLjSscr=K{nWfs^SE7vlEqJ*s_be@keJF!;CTsk#pXHf& z9FGslSu1p{AK|FsbQz3`{=XHtUn+f#o+TOud*I)UW_Eu?PL;`EBYmvwXgJBbmWX(M ztYzZK@iI9~Hc&IC$%dA!6Q8)vIqne&f5gfl>@=h`Fr52J3yn*RFZi{belQI0jP7<-9EzBS-4w z%*v_w{&FdQH~?YG9{KPi5?`v-)sb zAdd5u;ZQ1jRBr-|U&cD1UyG9X=YNIfwVZiXqD>%p_wC4JY;6=szAM5ZJdxe7hrMm^ z5ZL$hRmiUyt-veBRpT#%;S}|=pyqu*-UnM=ZvT19Mdgrd z8LK?GS|%)A%eIDIkrT{ElUysMk4k8-cr-X(mC%0CF@It?-QNqBFo!OpsF#{oMwPxg zTQ)u0hqm=@

de()T^CYnZ+rjPQ2<7BVwf>aEBviqUNl{yJRYvrUQv$ZSRGC(~R_ zfTuytrPdY^PG=yc6blXC9u7Pe4Poo6eojXh^B(Y~zfc^7W^w4OCqhevs`N zXKhbMe6$lPD^*f+DhuJmL<}sSUgPlTXv#p$CmgD&ME}zG{|TR<#2z7xNf`Fn6vH4T zmS=zM@N89zXYVh8XP>L5c~1qj)dsd+^uys%X2fC4Wm8qN7U~knR|#js6oA zP|{vx2n;nNx5;KD8ipp%^yBuhFAjW_q?5Ub{XBQv!hKXFdJI%N&h9W4C&RGY7a8y* zFHD&Ru!T+h;8bk0T7;atDmQvn7de-S2XL~?LC$G0xPU@`c06bw0n$=5ieH{@u9=9u z3sH`W43wn%idISl(+7elJsuBGz0UGP*2fK3dZsYjXt}aF=89ocXaW6|$<2mM&6K$_ zxiTpu4#YWz5LrWRbu0sKU`m{|(GuUl*!5bo-n)AXa#?lx5W?#kLG3brxOQC=`&G|{ z0=n#%5*$JB#3VS1;7LhvC4wi%!SDuDPQ7R9@^o#0WzAYqZRqr4&8-bCyTeVETN|8a ztOWfyT$ip5NLjzFHmMD+ue-G|*o!pKsT27Q_FUBws$rib3Pf##cYu5xk&n-mW0Qv8 zw*uYI8UM@cO;hsR&DVLudEd?q*Tzu)k`oLtvnp3I76JtVFFnY7%5U?b2Jo}l@DIoL&c)eJm&Tu-m;H1FKaDZf^Z99EoUa{uJ%X=$ z<&`76&T|szzU1|}d~Hh#C5Dn=Mx_E?sRKieGqzE!ZVg2`RwrUJE|e4o%&fbBnRgd3 z>9Am-G*1n|W|-=?8E8gpP%z9&GBBzGR}F}BA)T~TKs+0&>5fd&HKVmj04I{34t?NE zU;1rfVV)X-o0c~W?0!A#;sy$eCc;%S>lC%{JCB0k5sQL>-PbxO2uM(9J&CxuHAHZX zf`LZ#TH2C+n}M;BNCrk4lIc%NpnQ%AWC&${2Ft!4G)G4%;gX-$GDSoyi2K#lKjE)r z|D+Vm_$V!TFF=#KN_0_ML{h#sqzObJu=Z7+&Rz-L1<+T|c@^oS#6N0yAMg%c#;K-8 zWj+_@i=pc42Bh^Wlg@4=gJcs*ei@N-jF|Mr74Lzd>1xtcws~XD0NZ&e3}qpJUSrtz z*$HiFgF^a9+<$Gc4@P z@n9#82Rm<>qBX;xnm#MNK~Hb=9(LzEzp@jtoFJzgoZw>+T!Xx4cH(#6);Z@Bry>BH znVD1Ny^m4}o6U)`Na{n*r|jf&P-Ot2P7*`?zL`0lPO(EXduJIgSbGo(NQW}EEnK5@ zb_pufv<07cHd{a3gqOmWGyvRgME8{h<;q@KQMG=1x&Qk4x^aPPvukF{Wg{DSL189vJzej{{};AG&3zLK?$vIQeM5rP4D>m zB;57$$*}bI=$*Z5HSJ#~X_Y1ee{BK$by>J+pRZ5gK7E1O`Xb!Yz`Ju8_QRK{v1sdj zwesN&E{>xT9E3YQn(IJAkl%h4er>C_xC}j4y0{#A2zTjWI7g4Em#bVHjtml>sTYEh zdNJv*E=W&!COtt+U-rI%a`O*sZY-X^cN#6e!+OW1N~}SAV5Q-~I>Lih;*X6eYsJf{ zvS)0lBc)Req|hK^X4Vt~FC`m);YQTSy4^2Yg3kBVtRD0J*L>F;ZJZm~yP7!f;=9HX za%`LrJ8|S)53%q$EZk7JdzA40j9->ya8jk$aMf`7uv)J+ z;IpGzfd>qZzIxD0RzdE?z!tp%KQg2}(Liutd36r{kulg-$7NSBQxp42#vZ`65L-~o z7<2+FU32*1^I}{akP#OlMYtq(A+G1gxVSTfxCkl2C9#WeArU-1o05cA01f(AVfN81 zfVyb*M+~!B@{yghanZxen82pE671z%w(org@_ssXKm!#VbCLHqOW?Ig)u7X0bkaDU zqR>Y4IwEVrMoXB*B*Kd%2@D}7A=FJ0^MpwxkR*Yj#3Y0|NgCmEnIR0Kpgg%URS3g^ z-$I1hmBoG8pz5`2AoQ_*UyHIjaI1@`)ELiizY)KYDoCr-pnGV?yvfDm=p(|Nd(PM= z5|rp8lm6O*^n_>96O^RCUfbz)ZhEJmA>5XOnKK;sGp3Kaz922(Zd!)pv__BK;HGuT zO?XC+5|q$w`js0C(i86VD3W`q$fO+o}gU%w-lr&Jd>WFT>7^bq$fO+o*<_0 z@!rBt1b^rtC{eg-Sj0>BZcseTz8lswdKT6h9%R4iCCEx&yAyK7&$^sF1<4 zJuG)vmhP!YrPBeCzPQef{dF^7(q`6U4!^^Y)2=W}#`f^JR2+sT&Nl`Z6QDSRS-b1S z;KUahUceEtzRs7DPt1W|Km*RZgJ;;`NBoQuy%>=%Z-bAxlCcFR`PkJ&cs0UC%D#*E z;aacSoQ3lU9-|$oZTuz{SYRH?8X9mBC)O6cvsAyeR`Z4yVyFm)N_jTggy>Km%~@>5 z3I7&KW`DWAy74xZ15B0JF;Gm8Fh+29^8u?cti7TP8k0Jf>%Kb(D?Ob=W88?|7Ix); zxBDja)eA?1h-c#rA3uhF2O`WSBBp&roEG!an&$INb0S#qY!rvg>--abv}C0Si)(Zp zOL+9PCD4lIT~xl7u{kFhzGf*ndVt(NE?q(o)ZAyTkR)Wd0hXndij6m14M{jKt_#6R3yIF{_8KF<3V z?FRF`7VwLnKNx<00n~XDR~ufGqT|SnBK}D{m$j6OQgpnNM!QzXp6_8C@4Y#Z=TaiK zRyIl=Ca^V58CymKTP3;=(HY+IyULT{4rSj6A=iTAJj%lC91`1)nSSpU&?~7)9~{bP zUHfgqZC|hkZIWTXO}Wxp4tP|RQ0#=%;(d#j@5?S;r+*^c;-!*jIMz3YrdyM=WwurC zt%{RyoAx0tG23vE%MZVeisNGUPAEgzq5HPZ?n;0heH)lXR?MMmzo@FVjINN+do^}qE8ue^eKp>zWb_;lc^WNEf1JE!;5Ba z>&58uueo?pR%`zdo*7FMl8TzNE$(lk{0vD*alxOz)g4tH$is`_rDb2 zCOm_ipu2_p_5$35XK)jAw{U->05{$jmGKtDF7=@Wk{VgqJo|U{t}`b`z$A-x`BHBG_+#2fxv6Y6r=C z+&{bb6ScqV;&$f02zO+RLq&oN-tM@*SAdJ~3@(DY<1%IbzKbiiYy39hEHm~J*)o$h zg1h50I`;=IKBt_7XJ{j6QCvSPz(sfl7eR~S`cVNc!ZWxC>W<6wc|W$eL>3uxWbtik zTl`xp4nq>B$NNOm)+jD!Kt_4=$NE&J#_l)153!OTxdKGxV*Cz%iGO5uq9e78OPr;4 z#{Oz-hW}|IVekrx2&v;cVl;6E)uUI4hu0^|jN|FQsi0pMpAATI#?w*|-x z06(_?c>&-T79cOl+zwVt<6xTS@O8IJ4aaBV*$1!)O)(=r^VHT5v+rgi8hJW~$@C3G8ETVfb~ zUrX`{&f!?);&94NxJy67S^8JIX-|S2$efDbCfuPvMBW5p865J6JCx;#+a_TMV3Hn} zjHsaMUUlvpz?c{Ma^aC!%?$5D89ov~jF_J>gBxKGzF;RO*hY}>c!V&cc0pxF^eDuJ zTI2MZ#*!JfZ$QODcl3BS;rT7a`)J}lfp{BmzXQ0&-+60)V_@n<2m^2iK4Y7;aW(%W z{D$5hb6T4`5374=1NSNY^@uTAzFtD1yIoqW5+fc4eiU>xc#x^ z9X3$^@QyUK-FIO2OqvO1fhq9*?x*?Qg&6f8v#qi4P|W3YD9V1wlQbQQrN2@n3kWD9 z=7ZL^?BH_xxOZ!N3lXoI?k3!oIfkXY=s&HFSr3>_Mm_*N>QM+q{~veX0VhXs<=yJp zosANjU1??&XF#lIb|n!+kN}gxCV|0 z2QW_9#yH>k>^q;&5hwZk|KF>suCD1`iSYft-|t(&bk(c(UcGwt>Q(IOePuBVM`_N3 z_NI@=x@%_~@VJRfw-`v)03lt=pZ)NYtOr^>IUT{Vj3s9P zdpT671YD>68D#nZ$}@d3G8~NXY0-7SkulbJ*nk>p&dmdcnP8d%zTu zXX0lAqueoSzZtJ^_N}bcCwp6{(fQN+qdcR%)#NM|=I#6@YHx}K zuEFNO>RsbD^|xY2eO9+tPl2G*pJXpw#kU?39Hy8wXM1^o729K@eUrHJmqp~A&1Zrq zAW^Mv;z)c1D!mYKh(%!RTSOyIJ^VMI7O5;BeGW zJdQnRmBvr(ikzgEn9p-bSbt5#bJ+O>Z_GspVx_;ary&QInJI2ws zCdYAA9-T4m>VptxXz~V?9mD>M@ulS1at82heBHW*jlb1mV*_l%RyAFAMl;a@2Hv$X5p5A@ghFP21(;bu@V9bow z)3<>G-k#8CdOKrrn+33&cL@vHSZ{Cmm$cMu(ox>!$Wwg2$uroadljf>+M_dNgs`$l zC#8A?XfO{g+@s6k8$ok>bTjE%#sKw9*XYgE*H^AJeBEAXx2|uaZYBXE%UFE0CT z>|1oN4Gg(1psIW^TE_-vVe_s~XOZBbn=H`2+jt{CZ{IEBXN-&cZaX_(n#oKI$?rda z&p))agHhG!iVxwV(K%Efhbi!IeH_7uo)fuc4xfXbJae8FzCkGxnr*i)ab=X&Db`StUiZg!{CNJKDQc zX4Yd7E#W>bKClSypDk}nb!#`vGXOcAt@Wj)5B4`Ao&IxNi@lUi3xM8 zXmx1xK!Ylhhj3pW#$8!3hh}@C1v*-9UQKwg9zal5_Y0JsrYrQz*`F}xjpNXRGY{Ie z%fqt|!hQJ|ck-EeI~zk0E#W>b6|?m?TCZ$`2m7N0Wo0vYv)MU%Pj15fycu_S z8(Oy2B3i=^2aY z2@mKA>Y}GREutqppeLw{o<6vUp74O4pp5=*^+|Nzj^49X!hL&VJhWAM{32SyeOksH z?MF0Ub`wRkg!{CNJ6h95*tZnX67JJ74%(jRuV^FuLzj6LU~zL<=WIUfou~29=$s?a zxy`xL*ajZ#oU4iF33RY?z9L<~$Gpyk`gpoNF4DAT@X>S(E@rgFZKKu${K0HW?+xl) zA}L(r%FgfUF3zQr@&TrNo9XMW|t_UyCm6**;{Af=_{0J}L zC+1hk@1v@F8m8mt>7H<3XJWuUBddGU-_o*+_z>>%krprmA2y95K7{*xqzTQyhi$8f z58*x^X@f<4j197J7V#n6=Oc}{h>x);wra=6vnj#@n-T}$vvM|N`c3+QB3^`hew+3w zE@LKM^c+RJ2oHFPlbMMZeN7QB!UJC7mS*Bb?^MK#@PL;%vYB|%y%q5yJm4jsa3)^# zk43x)4|s_y4S4lLy#9fI=nbv{P261Cxth;lLOLZSf#@Ycqd7 zjvw{?(~?ruD{PPyu5&e?(YnnMTw6+TT`|G4N(ruKiuNJT&Vn~EnDrqnX6EyaUu2n` z9zDNEc!3`i6}8E!qz|F;96!&G5$?BBQL-}1_aVlQQTs)F2>1C&Efw)GeuLFl#D{R7 zk5qFJpO*GTtar!9^BaT*enU*eXBGMlT1pWw!UNkCqne2qZL5eE;Q=o(!h!^1jFKLxC z@nTyo;zfACOPX~dFLNGmqtDBm4-y`n$0I2738u|-e0r}96YjSe#^ZJyzvhKeI~Fm% zWs}dxJJ&~e;9GdEk6^yGgpqd<4h_4#;ynQ-bZI3GxGj$Np)=lT3ReGwj%k)RoQJ->t(;Q=p#X5@8K z2`|C}UIZ2MGHX6Bu)JhFiZO3J>SH?2eqj!WF~RALzKnjEf9UyXcIJE_+XsdOV(B<0 zC?;BROi;|M^&_yzesp9YMpN%dmE*La)K&hpps2j{X3+Yl1x0zSPm!bhQI4VtT_$ER zAt6iR_4OBkfKlYu6?s3}tkZ@#;*5 zy^3VGrBDV!XOi%u4GM1E}q%#yE61}iU@av@0A&FfHYUISqiy4SrUqkA?5 z?CI(LnKT!?SM)QkaL8Io4wojI;W7r?({OU60GB3`;WC!P&Dq7vkXmFHg!^{Ec-;PH z{93z^aNaJ=c;MwePp|F>55@xoWp!ul>J>h{XIF$5*cHL0qB*-VI)A0l`)bs%?0?2> z!fkoaK|5evp*RAw2+cr>tJnX$25EZzPc*rpAn9OkrCYdZMV_|0_EcWw%jB)65^iPU zVmjmDy5_5WT2EJm7wC%MZR_e2+IO*>#x~SuKB@56X7Jn|9O1saj5~P^?dwWt3HNCk z4{2{Jp(Wg>Wjv&PeF-h$J}u*p_FuKUTS{mN_h}h-w5GgoD4`|Xr)AvH8XxvXpVsqX zgah@`bTxJw1i4r^A}VZEl1sfYp%$P{$TPlp84FChB$!qyj^ z7OY+XPCBtoI`jfok`I&bOfEskI&lO)8U35sR&pwGm*Z9Gqq4p%d-d{FYdw0Weg}u^ z;piuM^n-e>rg*beJU@MjKX!T(QoF}ogw8zX%IN$tR~Ma(H7m2<{&t_%dqTNMS?P0G-Hx~@#(!eJmFR*F6uLGWXj87Z2Da#do1 zAs^Eg-sAJ}+5+L058DFcVOw~wPwVx4gnMm)Y9S~mhVw^@buIOMCAWy%Q zQQJ{N?Lr$6>k>^$YGqzWlsc~?I;l&MiZ^pb+I&NkOy_lIVBU;@(eCy}v(MTaV_AE{ z%UK^F5gmjC0QjH$1OWJf1xO$p6Q8Md_A?|)JC(H+#zYr74n-T|S)U(UoEPw&yq_SJdnb>{SgH7F zp4QAUh%NlxJ9&bRw{l6;*!DTvl_>9dEHBPlF2vbVG6;^*npes|82^fWKLQ1P;Vlm&`nG`*({V0Z?qU z00{u_4-1fh^~ZyKjtvi@4k4QP{ zA{QW{{+KOA*_=i;CYD~zh^ExjQzVj59p-{E+SmnIyA)l>YYx)IReWKZ7U!21iD+}&FWBV)Xe`Oxx`s6tBe6itM=!>Na zHxR@5Vv%zW9t1lYC6Uj3!m=#m;UhSS)FfR zcE%SIxe{b&d~sQJ&KG|+YyZXT?S&(D*G@IW4dGI{X!9Ooc4pWf@o2={ft zxYLDMHyH70y}Stz)(r^KKIUY|{yDL+q=k0IOZ3mix?}8Om_QApqHqyC-m$bO=j2e< zXDHJrA{?IcH}c^^BdANhWjXn5EGM4@s(dz9DBmOKz-f(m(6G!~O*9e{ zWDT1jtIF%>=OHSC5ecAQpKk#Y0HAIG68J5qjmybmerFdx>Yap-d7WMPNP4+W%${GO z_2hR@VT5l>o~Fj`S7in2(Am(5H{bFK}w_(paXiKD1)a4N~E zvOe7qVPH#@Xh&p#*VJK$2|hc8)5+uMX?P-+{^ ziG=5O&O#Xc;^HWrS_HGU{vC$?r0rC?c6!QAK_=HOGu;kV7?YBO-<|bfRZQ}!!)oMByjWcC~ z!{?SN=?_7bJQsRMo`)awx~D{ORgGW7Zqr6EJ!W-P#b5?BA_-e(VSFHWYI8f3I9_6U zvgl=UM{_%_s)0hJI%4IgK=(V(-l1_F1hqE!i0X|^(OQt?H(x$|1`FETWH-GV3No&l zrey8sFC|?CgeW~pMA1aG`+Q3`Hu77@@PM?dN;0CxK^X?CYu`#eVlaQBugtzonYc$Z zR3_Gjjx*RI{HRe*pQy3st4j3S@Z>CPdBmrmGlRwiWc8E=gY}!Uqdy-$s8ICJjoy~XqmjsGNk_dGnMdj zv3;3s;hvc`ooc^$0bJ9*!q82x2D$9UdgdXEpK4baR|*3v2%&#SmsvHTdWNamOXnST7aiSrYCAguG27uTh^fWP{(G z>Tyu5jH5*I5#1}HRF6$L;#EMDp1QQ=`aR<9F(Z5(Zw;;wgDQ4G)5UiU)>aTR!mFJc zmPQ-vLTz}0OG9p~$E7^{hM={+x={Q-(nqaZA^glkdAp)Qo+q|3dsSbh*^<{~1FsC?(0wX z0&w;SMm3iM5GPjy_NKQm|Z1BPd1pm1wSKI+)yNGeOu?_D$IDKuikkFZnqif zlNZxEcSsmpBJ!+v-ic?NP=qQz(9zom1|xlA$v(((dEbC!y}W-DJpN#EC6IVM2dr7vLv-A>q-)k-S>z0;RB5D|O$k zBnXe`ZlygTJO(cDq`g}yJy$YmbeJOTSI={N1$xHa5`yl|&_ZaQp(PZ1=EoPEUk&MG z&%BIof^O&O6hP0=UL---NpEzD(`EZ$WTzW2_#7Qh%v=tv>GfF8>>Pv??78(c=S;@U zIk+(c@$g!&rvba3tix}IjI<5p?)6gs_FgZ>lJ!96y?f+~P7 z5LdYNZlp!{Zo^Pt3zMp7{Sh#NsE+?R(PxLxMX0i{pEh|l=5d`vz$RSZAA-kge*ix={6U2EhMmz~l{&^BKh5=)^Xzl$<4a zl?uUjmdS8zp$vr1EJH@;%g{w98DEph@JuU%`Z2UxuE88fA?%qBZw-cU-=8oJU(_3& z2_34RXrBO>+BWa4I}x$$-n#3No7(yDfXlsg49sBQ!qujub-@$>bo276i&o;r-;N2;G{^lPrdOOFH> ztbj|W&!ctJy-j;6+lMk_b2*Ape5-l#{AluM)d};#I*jBq%jLr%UdZcc5HDAv94~Z6 zu~ffneFGSJ4NSZ`Zk-IL(V?}V1+s?BMR%0YHb%P_bdJDqKm_d>D?;ZYs_S4!KqU{b zKI1lVbT0^#b8jz*@IKv}XTrAkf_7tl)8?^OFW;achhQ_v%(9c4SUttxpmFj@qXEyE z_6GFs6~*MbhIhvmh4%M?#)iFb&@eH15rpvef=)$VvKLf*#}(yrTSC-iIv1a1g90Vo z>xCl;OBu};56Tcno526;)H(EnPo#AOTCvJT8R{6VXUeWv zWvgo4r*gJix0hP^ECcR~s5tnvH>5!oL)8X9IbDBWurQZ-?rU zwsEL2w~E=@K|hn*zfs$E`!{DebP?NpsmG4b%{ciyG=ZXijc~tTW896g7i*t*zEA6| z-4pJedE?FqLG)SLr^0X1XIakT8Prc@4^y(gl~f% zQM&j&y@Vg(+u%o(jGx)-xX9<{>5K4SuY;g2`e&5T6CThLl+jmI-xvGz-WY~(zpfc~ zbqzULSC{y-JKOfBaI+^?r5EzI!${-!7@N7&=i}*s@W5sW%F6IfZ5Nl7&=X!sjzK>x zGauR83b;!6YyRr8xOK1uAX&HC4Cf}<{XbJae z8F#ebQk`90LQA+$%ebR8`bvFTuf7Nm^hHpnFGGJ#2|eKfJwX}0(b+S7dQabk`?53c zWH-KT%BS`G3*l_Pt>dtm3;)u(6ZV|JXm!=V=Z`lyU#{c_I4$}o!b`^VSeXUKI)y9@`2Ye`N(!| zB^s>J(Wd^d?%Prn=<_k`+d{Y0KhNW+tyYp@E_&j1Rq$$buvv%wBZk}0M-T%_cv!B# z6IAaIhEe!W{PEdF@RD&UR(@s+ue`<#smB>RKs^gqVFy?8Va(hmnPoLUmz83sKf-#Z z4#ccPY0PmuzbDWWU4%*7cckrBlJ9c}j$O)q0W-p;!j`(uwow=<-td~t# z=4uYQO^m$@yjG2h(>=t_OAr*hh~=FnYoEIRt4%q_7go+`z6fpjLPBsgw!8^T5QCO0 z+fZ-x77Vl=GWKTnbR9VtTIep^zB0ajp}G2*;Ewe+WyV4b_6~8v7B?}?K|a_(Pv+wp zZ)7nfxPCTZ^$f<~`q7?&m3=j=HeuDW!AR9DroCo^|@+ z$>d1l^^IT`MYEHe*l~e3;*wQ@bx2<5J*s4fiu}sihfUOoz90?Ts7Yv)G*XjXAWqgyv92UWB+an|bNytmv}xN~ z*Zd(9U;LKUt-7bO@~eO1*V*lI8*?tmv!wiuvhtTXsqHEMf`a_1onk)~)rK1DxTWe* zSzk4`Hg~@l|J~ca$2Xy(@0#`s6YV~O@H|zcwA(!rkEOQdLVJ~_y8?SVQf-PTU6%r; z?}zL-Mj~~}jzfdew<^D{0U=8Nfh6RJoa z9?QIJ>Se;xg|B^U#z4DtF(+;(I0uHwoh-y+G2ONdY1ce8LnMiq7R0sKhS9)+4qHF? z-FxV0Z!~#Qz>@p12N+agF_s$!7?b3lKR?LAj2f09oNg~Z+zFTW?YWZ`m-;%@k<9T1G%m)5vm_k58BrL_&YqB~k;s{o z!M9^QXs&0?Lgc8YJJ{7+8DvRwS#e@M({*8{-Pz!X2kplW=<-8M$@Z;M&gEud-_~qe zp^hjPn{B0;Af0wIVkAg=O#0--@{J4jMov64wvFX9h8?Utwzi6#y)za)Sm?(TQpVQa z+>_(;f-@FU`6G}o`Kg!@=Lveo;(OwsWS>5H0BJa5@pU}9&RBdCz{hjO0^h}wGZr7m z7L7e)@kt3cI{zxqdgl{(>gIp$jK#N+CC^we>%ub@-(ms`M$cG0DCo&I_$WJLq3eU# zJL8(uE1)Y`n*@(ahcVHo;+S=*f3`R;;Be|?h~?hTWHJV9FVEAOxiPVYKXzpGn~8#6 zQ8o>w;@s$9*pqoblbkRz#QT}QK{@38%>P0_*Zc9!L`KZ}nZIVR@cm55#z?E#c$3Xn zQdYj7DFK`tew77C0DyN{fCK<|w*^RmHm5o=<$Mp4Gd(h9^vHK9_4|ZLYd(ZM9TR3j z1e|lo1W%b0RyNJS=J(jyS8k0__(2<+I}4}3L0C!u#@-XY$>giP>Aksp8T0CIp5nYO zhr?KjY{znGj~lS~!iLEd!)<#On#}TLIj$T3c!10vg5s-wwCpEz9{%6q2_V4h02Ym z|B9L#Uk2hRIygO8E3QKtYl3#y@dFu*&F_PVqH16l`cCk}nm4g@-|_bt6=d(A5#Fc! zj!bwQ`;O#LvhTPYHdnIm=;X=lxcr@@8TK71G#WKJP8dAi58cP#cVuER0U^A7$6cVC zdFr<)gWF@I-t;QTIHBB)^&;8j@NXh3)QMSdJ3|xu-{#)lDzKVqZ_mgN;bm`6B*qx1 zbZ;+*FOofhy*=08RjxIBXVBwnNEJ=M1)E&WJ6E1UvNW@u=B2?Nb>Hjm%dOwl)xMX+yX)?`0~Y8B?p-<20vAF%Fq?<$IP?`rcw`L$)DWNXW2 zU*y9+KX09#@L*qrpotsIswkP6TapR4jrd#>V9Wg!;XR#CD_OmBZ-&R@&uQ}KnJn#F zefT4)Pa?Z=dUx0mZr5?ySqalNd1cFSjH&6%c@>OXF_-xv_{O?+@-WgpIlshcC7wP3 z1~EQ$3>sYLvjBDO%fU}`@Gld-snU;uYl_QN2PN2$;Pe@2Rh|2RfTgE>c$l86c#K#3 zki)6SAvu!`Pd*vy5z2Q%zo~0a9%~-T#xDJ)o-8v4{mdR@W*7k;j1g$>sX?1NGAQ0S4Gojq70)0_0hpe zo+xSm5h>H_2*ccW@vZ2&XLbHW0fy4`ENE041apjdH}ymCT7QcBQwH0A07iNi(vc6R zCwIkdW`R$~ovlPT3eUqcLd3JlM8wj|ejBlK5^w6w)WM*yj&FlaeRPhfV+T6*aF%ulZy{7X;u*M}`Cj%07{tJ;T z{X&{cF8#lA>2JjcPV?!%Mmm~Tz4Ln_W>;eT52HPu-!Qqmoe;UGoe=J~6JgpWudJOg zX4}aL=3}m`8QYiv!wb!W9oDghiQnTn2>xO3;m=H)*ZGS+{;H3^>ErME*s70z=mW2B zkzkfSVm`96J_;P^hkB#^!T%8UYjvC$BfPyjj(RqJAED%MtpDLdgdrF%65#10@eq~B znBjQK$4CDWxg09!Iqm`{_bz1e_BiYOihk)w>aVB=J(G(TKfQ%JK%$!DX)um@`UU`? zuQp-Yd2>F!7W6+>dMZ%qTXCG61tR&{ZL%No#TrHwO`nSaloepJjKAa2r+094ucV3oUa({Y6OQhuHOnp zK8yh80)xYK9r9syIvhrTbD_cEG7oWBRSt&{;5^;na7BkWtQIE^Bfz=H;BYCBIMlx5 z!w7JmVQ}n1Ahn#HWVFW!CwBaXEp85!zvkfL>GRM?#_RR$i$)R>drk1}3ep-azK56n z_-SLUhnVJm{ImtFe`A{a@zWNz-p(}loe|+!l>o$1 zpY!K`gS4^MJp_M+KR*l77PMYPu*mwIAZ;N8I=}Vu0J;b=9o)RY%Y0G2^(i1VPih|T zLyhTTpEVNU{IoHZ^rKAs2!8yu1*%o}q^R}EAZ?+D+uXOgmrt>%`E&@i%mXd1w_Z>B zkK-q2mx~*%Uon9?5@Yg-##&TC>!qJe>1AOSB=84S< znu!NmQg3YrDela^Jx=mD(-t<*gVo;P zgBGDl?$JEi11+sLk8Qn&7r(yiiOQfn)`*Vq|T~5IV@m(adSseSSzTp`jWDQrFAj& zR^X57&4Jb%Ay4+>iPS*Z{=r24`0z$ubH6!&k2Q~z&+;`-^061RUQ8x*Az)DmSR4YDgn*?X0IdaoGC(yYXFLZ8MQwzlHbPMw zp{R{e)J7<3BNVj}irNT8-OQQ!l3N>C5E$2ykQr{gO+cQdX$>kE!vq?i4_e@jqof8E z6NL~|52R+)1y&>SbKhJQ+2BiNjX&`0Ud#pGg2~n9K0v3>=h$uf3=I45i-rF2sY@}H zPri&{Te^-5|Kn5Fhk%f|bJ9GN#~YveMF@B_1oY1i z3NRJ|k`S;a1RRwIl!~`5j|c6Afa^oR%^~2mA>fV>a8C%hHv~MC2b9YDi#*==)T1Gw ze@>{q5Rim`H6h@r5U?%;Tp9wd&jU&eaC07SeCo9!;EoV*PYAd-1UwW1eh~s54FUZ- zglY-_NghyIqBVKE@u{Oiz`77{X$ZJJ1l$|~UK;}L2m$wmfO|v0Lm}W7c|d6qAI;;9 zPxa3YwHE@C5U?f$92ElAg@8*#!1W>E<`D4O5O7BbxF-)NE%Uv3yz!}rLclLVz@s6c zzZR+~1SBC~O$azD1gr}Imxh4r^MKMK-kirnTMPkrgn)ZOz`Y^hp%Czk5b$US=pPBy z6atbwptMA5@_1;AAz)nyxHJS@9|CR;0j~`KcZ7g@LcqOwKxqLU%HyHC3;~aZfd0`? zdm$hR0r)Oeeu!{X2w0Z~l*)T)9uI?!5O8w{cx?!{BLv(N0`3g~59I-+;{76zhwd^2 z^v?@aF%|-n5U?f$;5rjuot`wCxr@X*a|ih32A~807_0we&yYzvS8 zhMn9~#Q|mc!;<6*q~oztAFK4Sn?A7O$Fx24v8O&(>tio{?5&S|^s%o#*63rcKK9ec z{`xpTA5YQ8f%-T|9|!B>5Pck~kHhqFxIT{1$C3JYsy>d=$I<#YMjyxO<2ZdBua6V- zaiTs>(#OgAIE9aFn`RPGEPIN+_};cz7pJ~-jk=EOdx(_o)Q@Wh4#LDrmDwhWE>ct1 z9xas|(C+MLr3TvkwX~IJFXU_1)mbx2yU6BCTC9-U9R{hpHh+Zy&lq|1tkOJv8;8Yt zbkx#IrMLNO=yS5u76RE5C%YI*o4;1}94!qfpoN%5XJTD#{ua{G>H=EiV`#-B+x#u0 zrKtwAz%{gD$8G)=($c;IT7V3#7=N3;g|uuG0WEC8&`OJG^S6+eEh(Ty12VMI%-Z}d zq-FC9XeS)4w9Phu3u)PA16qJgzS5xE{4JzqLl0;nqoEZq(B`kDtwd+Tu79TcO!N*) zd#JT*G<6)@X47iFA10dKk9lgkJ6{Grgg>YA=N#N#Gc+=u`L+3Lb&+c)bcz8j9Hh~s zc+56`3u);|16sIKLo05!&EG;=y5E2n&ezb2Z*KFqkd{6>poIfAwBpd){I#?>pF~Hm zw9co&mHR$Tx`H-;g+bs?*+T?*!`+*_rTb{}*XEtmHM^C7cAcY@KBvv!LR$7k0qt3i zmWgqjzlF5yzyjLy9j)|kZT=S0veye}FLbohCARrnNXxD=pnaO7m439%-$GjUuL143 zj#fI~Hh(Q`u8!F$E3K>J6F`f8CpuUgu5{aN{tAPjj@g?Bd7tF+mae|d-@?2(1PJmz zMf3jDL7F!)aJ7tO5cHWarjY)$JUuaRe^CiN2OUBFXDGexbBPhR`D@Ca+Yg7L4E_Ar z?uWO`emK)`{f(vMI3-8RA&%zVP0KXg*HcOh1$WWfeR!tDZT_mt!+bfID$AE?aht!z zw5XgeTAMG^;x>OBE$*`EjiR4xKe9q-?fySwZYP`(?0j=*mF@pC<}erm#wx`y`~Qr& zopMHi!O;yWXWZd10@$7g$L{|#?r<0Z zj*f3C@wFz#>|0gQtb=4JQ)8Fx6007u6wdM_jSFz#>|0gQtV^0BY`Fz#>|0gjG8 zD)O2K`7rKq7y*of2=c*+I605NxWi!tI69uF$a{$7!??p?1Tc1@8hY{dtA5s}z zSX(GKj5{1gfTMjyWpq((k>D`y^uq{nv_GhfF0L&W9L60VMu4M!zcRX{wnT6kcYGKD z4t+N5XK8Jz;4toR7y%CbGI5%mvj6W1lZ^dZ4LrC1_uXtN|M~E>w2c)$Bp|t1_k)NR*!O*-zNZjUcM$4E-`wOK# z-KTAkmXNs3-;9kvfXbmw(I;cwI2cHJIE;1UoSnmAtQ!Y|JC6@z-8kpu za2V^x!9dUB!&o=Yc{v=$x^Xbb_4qK>jdMW`hp}!P40t_0jCJEYJ%__sH_k;l9L5AE zjxNH;lz(ySzbm*Ig|&pc4pjZI*t8MYW)HW{$(6z-O+9n}!o4=WDGG@xU zGx9LBmvqq*f;*^kw2XDrUfM-VNZjUcmM>%7w3l_!5)!xho6$1XO?!D4Eg^B6zZorK z-LzM9(Gn83`J2%))=hh57cC)io4*+?W8Jh@bl5FXeE zLD_pS#*R`;FaC!yFAvxo-wVCQ;?TA{8zemVo(@4-9{;U2_)MREEVE(4?OAGcyWZGuSu1D;lbKg-<~*y-ePedBkAMp2RifQe(t- z<({YYbsb<%Mo-^_`{ibQ;_6sG9ZzZF=GG2@w(y)kQug1d?9W1yFZ)iEoj@ZygMHHz zzU%~fvNM{=&R8h>^?()0PPi{S;}eI*&A)dTiW3eq%)6#4^Z%;M&qit{^B%V@qs#;v znHlVxp7doV$dj4TOlHPHnQs8BNM^!)nHi_df9WuklR0N&ZJ(dl-UttDjG(N&nKr%A z(u;*K=C$by^gZB?#R=Lp;gtjfx$Is)g0eh}PuNsKPk7)H2+HV9+q}`I_iU7KUuTRv zeg9VLbaM$U;XW~GRg%AbBM<}M7DOnQ=G5`8hgss&2xYzbuGGO z%+sy$$PRsDT91de1&hHiH`8gcMJe)r$&P_QS#wNC!5>q%6qzv)&VJK6F zS;f;wGDwc`^wA8G(3YO-Mp|Zbr{D{an3b6^PYz>qFU;XE=HdKNWxY9v!5Q%rZs=c&}XfgiJqLsHg5qmD=%Xn&Z8>li*q=PO?+FGo$Sx82Wkn%MMapmFInDr z`dn(8=vLdKyKDLJ5eW9RFF{gP{sV5^mE|YUl%K)A=~K7A{3P(o&uCVD#;}{5&@y1{ zR+hi0EVm-nmt}&o5NKp!uy6Xb?U#iFo-B-JvM}c9*|epX0_uFL=L-oBd?7)ZpD}j% zPnKTVD`Q?Broa4Wi$h=N`69x7f5N!)MaB=l%%}C_BRuef1mPxf?QSV7?1KUscf@3C z6sQuKxX#P9E&f&OnZseM8|PIy9L5BvH^R+m(ceU# zzT(oA(1m?6u;V=A^#I{hL|9`@0uE)!AqR?p ztL^b#yez|>j8~i}dXUfA#0p^CP7FX4XZlq9q~~JK5x3a)PVyq0Uc4FHJMmyV{S1Cb zgLPwqtb%yco^VbbYT5*;P+Q@d&oy@cY9wa$%$VrDCt3qv`FFL2*8r;Rvl&lsWHX$4 z7GAGSuchhW{oH5s*&$Zk=5IEaV62OvsN|ahtyxKgPQG zy`h^QKIRhgBUaqzZ^n-?;g=h`yb;hMUrKo3O9|@orEjwI;!7Fx@-Y7J%@!vZR}voh zLxQqA%zW=HKE3CQ3HN<5Wqjf~cy1OS5Awo; zVB3~)!s>0r;wdc&0PuDTkN^PhumA}F@Je7Yi_fekp)NqfFE0c1OWJn1xNsZpIU$f0Qi{& zNC1GJTYv;sO@9S8vHAA|o?A)ZhRDKI!y0JLmD_MJ;h(;lJ<%V5Wa@&~lKhD@=v(Z4 zLs3P>qr}qthMtPiUv}RR;eC4F5ECB9eM96>a^KK*A$Q4rLrxwsMv?b%-8V#`u_xm0 z$-(!pu9@BqubtcwS2i#)`2mCwkE%L(8S5^V0uC68On&ElMgj zfa^f;4*SXv8g{9HU^z5F|MMqaU;WoznMoL?8?xLDLE9Tvgw zr!b~U$M;i=(yc9-dzs3V%Y3dvIVxE@HTN)4R9xiYaz=GNf}55`smWn(KN_g{T_Z)`=lm7DAEjJxrX znMeQ4r(K3_vCQFxIYcIh+|HECI|LA}l419Ut^*yC#Z` z4^F4sL1%-xZ(rOd+>8&H@HoZ?TDJ2>@2qN z%C!`_bbP?XWDi@3>X)tn?MJz`UOYaaT-o@5n(Qln--aY9ujz*~dY@$b`r*C7cBX#V=)?BIqJh<-0j>tZlDHq$J>YiGxW2GIYY(O$rl?|Dybn?8-*#m|Kc=?f z`Z0b-Owl)xMQ|UY@#QVpiZCZH&zBQ!{V{zxudOkaSm zD$CpJ3kbJ)voBygZqv-OzJM`f}oo^L#ep!F{y^P23&xb&9A%X0hHHvl(%@ut}~C=@89Zi#v-{^x6`z?%?bU ziHk%}BNA<2{lT#6nn>youBNKp7?5z|518;c`~f+X_=C5@TuS_bljjNg0}Ac?gH8S# z5fhVtk(PvxK>Y#xLbInx8C=_^+R~{Z8Our7jOADcb3Zl5aw50!1H~lU=M&xwwlnzz zQ!eWhq$KZ_k`()d9KJ~Tg6Dk2?96_R zub@cIS4bT?Uy(5jeTCL_&Q~bu2C}ohB1f;jVvgp24$Q;(3U4e&xE)V%EXQ~_mOIy{ z_51?i!B~!WA{`?Yp!UKAOy67(`p(i|`C#Z}5!V-GI1A2nG=$~Ff zPk2C2P#670CG>;`^aOR$Kcj@6@PMA6F8Yg0=m`(#3Cif-r{};fDWNAk_+BVM8NK;F z?4>32ga_Y;B`Bje`CnE-Pk4|&K^Z*`VzZyU+^6^24&i>=VO-kn)$q~$!)_GYlex>C zwrzqmQxl}cnIMhF1Zf8*$SO5K){Y5M(U{XPORs~y0#PpbT*>Dq+~&$Vt{_J8bOzA8 ziGT~QB^`KI8T_mHJU32$%$0xQF#&i22VR@$?6@TWz(xy@0012ekN^OiEIsQ)95jvsEM`*q_7!p-=B z36Ep^Kn^A2hku}JDH%UFd7j|-fkOM^huoN#iAiOQD}rwPunX+cj2|e28$VEMcJ4sA zy>D8GtY*xRp>5wdp%1ywG)^$`+i`+O+$$0nj}vnEZ7so*vG-#5x^Y6c9)}^7&K)#Y zGk5S5!nuQ{nX!SF=EehaGkY}S0cP#S148e{10I85JxBA&jR%x;1KHW}K#o2)cX&Oj z+l>djxdY+bm^%<9^O0umu*K)+jS&bB`UryD+=0xB=MF^kT-zH+MHeIi+w|X(A<=E! zPNZz^P*YtKN!$JlscP5u2{&z@36G=glS4_{UjlO}Y5Pu|C)oBWwBPnW=Z|ffnCvJm z$+dlN?m!t_+o#&nHw??%LBeM4z%qDq2a((Ofnt*F^9kc%JCjc^<+46OO0rB!QtT6Q z_-!rOli?E#U*{9L^*aHnbnc+J8lO<29L^mS&-jNDJnN}Q-IsT@7?h9>7( zK5YLRD5g00+bw_RKT0wPe2L2Be97I8jj*=9q=c7kiEo7sd7bdv5XD$X=kTN24vC`e z@MegdwL`*9J7mJ+Xouub(hgUnib~p{ljjMxLkjJ;!-xEK$i!q{vEHI~NEuu^q|$6V zl(1=sEQ8k$MQ+m$i%GVx9qtddGqpogF53>JBx|K4#qBVM-`0{n8ST*Ub?vZQzXwAq zZHJnxX@@1sVLMbj(+*4UTsxd++M(J~t{o~LX@?ZkwL^isc36@@&<-Z%tu1*H|Ozq0ZY1@@Z zcA`jD+^%x?BFz(68`~XamOZx0wT7>2SDwB!mkq>7r7`gnjV9|bE{#a$y|{fks%JK4 z#c7G z@Lmg$008f^00{u_ehZKQ03Wab2>|dx3y=T+AF==m0PtZ8kN^O8T7U!qxXS`00KnZA zAOQeAVgV8W;2sN*001Ag00{u_F$<6Y03Wvi30Ti?FQA@h_!5z_v2sJ}jY#SnUe0QB zV`ajPZ(zdX@D1cp;u~HD<1g_IPM#;|8z{8z8>0E1Z(w5bDrtevH+b`8%3ys%n`*Q3 zWXkQ$lSNk3FK1}m=QCahRx|kwBfs?-BJpcP;$okX!*6Q|o{YZO@O3_;TaRyqR60-A zTuoo>DTMQ6O*8$km*(clW0^e~KfJ#awutUccY3*+MAQ-3AQ&1?YFlvy!7JEJ~J`-m{_lCZ%;+vq33!E_qi#TYlBo| zx^%Y8S0!x5$t;)I^Aq|P!xw%A2iI`sA+w)~RNP=SS8*ECTESsst+;Bg;xy(^wBo8#QK)`XaT?c( z10Sups#Fw_wBj_b6$d1(IBQzQ-IZ05)X|4g&d$h>1DzDDMBQYM}?=h#(zP|4U; z{gdlwICfQZu~zM8;QMtA*33B`KtAGTsZ(!XiEw{kiE&4}MD_ml5?aE2TE;`#2TN!P z_h}h-v}P~u8$PYK&P#Z(mqt*wPHgDESwc^EKu=H?{kKZ!2@mKA>Z1R42|eKfJwaXc z-zlLdJfJ5iqc>-E9`fnEIw#!MJ>yRIW*_pqCA5V5w2V92rD`wVE1@Oar)AvHqJFvm z`F)?3=Wop!O~Q5me`S>?k|$?1;K$-go+Dry`1Hs<ga`BlW%R~2e&o}8doqNZJ()W{tKT2L^RWE)$BEL#@5d$l2;T-jqGbGxzxqiD zKf=kcbsR=2kgs(oY$PuqQ8Ip}ygx1BNBB16BTB~4$oDg!pVzhs_icx9XFG=W=Owg+ z`?QRQwEtd0OSn(VxU`AaK|lP9=XdDav5!wTjR!q057pg!Xon6Up2nL$gB`YK93^1W zH1{~Lb(J)sO%rTQv~T?mZil9dl`leRb>_?-4Tixx5ACq7!JbuQCM#T1`42>85+ngT zqxo%y#QnD45lPn&4n}#J;%k!Xf~b1yn>ZS9(;3p4=?oKQn9f+AaUOjJ-kn>F4Ujg; zOXf1ntYj`jDw$h7!MO}2_UAH-{j~!oCW8>d?Xg#)J8*YJi@Km!#1JNTW*5bw+R|e{ zgCXBuc;G$=g&l=CjlKZ6V%P(@^dp%b%P`cY69hfW`?i3&GGpY-*#qAD>^JkKN;N%} zc}8n~PUEYO_D$}?o9IbW^C~A@4XmxbWWd{d`{fnQXtENaE^2sPllT6589`orz<1?c z{A~SoQQykG+8{{r0-D^%n{;L0Z*m-zH+$1p!Z4RdlY2)+aDL#v4|4F<-jOa&CS5>-^=oUI0D)qllPcz@M|=Ul^=+{>sNlv~~WeK&~dwI6s^v@FUgoT6M64`R)o0%-#N#;DA@-V zvJ%}EH8+Wll*%;ux-P+LaOLpyKzJpY#P*n* zei4-E!O*kHis%Us=n2Z`QD)8qSygj`U9^6SpP*=HWy^h{1H{pS7V(8l?n<+P&LlJMn1K!ed9t&@_uOi-r z2fU>zJ{I0=utmHH4|q%4o`JWt3br$u8yyI{(l*gZ_N5DkHHnuJ4rz)poI34Aut-u( zpAM|?I6aNX=}S1qLsNx)^+fk!9KN&qUv1T9F?ka^Qn^&62kkf61C$uAVmY#R&21pT z2wj@Jj>a*5$IS{3Fn5+sHiL04KUxHW=FU=20M8-=_1-l{f~VndE)e3B14ay4g(o2? zCov5S>@i?p`z0uVBCyZ^VX(d8Tn^I%?DZITb9jD`6PKK@dyvitGabXn9GS0J>}Q@s zm<@Cx~dJ*}}~cQ!G=f^5u=~ zsMiz=V&jjkUJn9^t+*$vUVjxw(e#JVL6+9#6fp92xpqJ5+^bEshEa4QVFjb|`Z>Fq zyu`<^4QeIOXr+=4#UyBSz?O|hU{I_Daq?u9nuh79rpcYXX;fYa*cj(h8!?v>S>{Y$ z=CmlB=6Dtn%Lh*mLH={}jt8$u0MRV{rre#X=7GLu4vLKrtked!#%SyOM#{>YqcuBg z)0B46!;hk@9Vyo3NFAR#8ELE^ofoKXo~Jr~#009FH#(YAoua7fdgLo6dDVI8RNV+T zFr(VM`DiovpvlUYO3q`UqQ*Q$^~e`XsHm}SMJZyLq6`~pM^Mxl^2QfZYNK0ws3?5o z1d4jBjgFr^S!PUZ`YhBEoavc(MB~+TJ)h~VY_@Q!w$C=}cfEce;H_5@Zr1OjNY^Vj zACzAYBud85^o3QQpVvtru*lVK0TKXUzyc&- zXP@&jHdO9>BH4ZXXYs97^V(7ov7b=Acd< z>7<2s`JGfV+)+ZI{W<8n{5dESlZzpQTl>;`sY>UdXlhhmr;eXWrPIJ8Zc|h@EoE{g z{e$)sjMzCU%j(ThrF>?NnxSpq9QAUrnrV(|%53MTQp!uEl*Mz@9KI>elQBm%eBB(i zTlXoX(mARs(acdjg>a6lX=aY$>?uKtns>*&3CDB)iJNPUW_&m@}Dr|Emy zAc}Ys9`Kg7^H_MZg%$B8Jm4*j@v-n`lP%&+c)(j)_haErA5g@b@PN0ti^sy7PNj%9 z;Q?>)KaYhsy;Koz!UNvo&>jnKy1gRaga^FELp~PX^rJ<*2@iOS%Y7`o>6nXn6CUsu zAO2W))6*C6COqIRox)?`&90+}H{k(q>1Af%jp1zqDj5Jv0D#pNAOQgOvj7R$0r38S z+71lf92vjl#cJhbSzuP7_AuPiFN4g4>m4%f z&gFihL<9Xg`{pJxr-u~IryduP8ta5fG&v`Sf@P(h9S1I9@q4P|kf*XVU(bXxJ${_9 zVlln##||w%s}5W1jlPM(nYDYVTQmMQY8$Msy*n$tFY0`+py^wY7lzbW-@n*oKRp}w zNsg<0Qm8A^L4I?=fV_nCGaycfnV5bulezs-=&_zYS68$sPWxl5E{sbDZ8a|FusVzy zyUUBQ(>C{+S=U|j7U)BDQn}XHDdsIhn5HIo1Kn*gLw~uu6Eobo(1KcFZq9-OkCmPc zV%;ADqe$C(B{~vIS`)NwIdL$^+pVF>Bcf`LZspg9CxNak`~59`tYr;jmCH5Ctv#~` zR(>n4b_j{qJb-ebX?V$UB==hR=EY*mvDWLeto34{2xoFDSf_%SuKcbQ0^cT{%xKj2 zn3D$C2?jqatfa2I-^w!iRAf5fF&M~YI)F^Eu9}w>XAoB2Z?m_IOm&;4Zp@U6c55rT zaz&7DUToi^egp5320l8wM_V`+#n!$kvvJqL`K95<-ok6MYr}4Z?Qym7(u=ZY7V?R%*(D$B|RciYlwtu_}H^^mu9vg3)yu`tn3^SzlU_nQ_ z#9;Z}tDdSup4_t_v8w>s0Qdr(l+r|NK9iYC&JB9~fOUzo*KnB06W>NL#$d znZq}d=Ee(L>*%vK>wI<*Ea%4!U+2fWb@)w470K(zsvlY7^y0Fv$u^^FnX59JGd9mG zoXrc55}Q~4Ih$AX4P+6#!(q;C9E3U(=4`Vcz$W8vnm^&XR@A#@3-=y}`qmC=|GEH*oScB)?xmJ zg>jRl&GpMB*?1($P4;A?$pOm&e(^{f?&fCa4I{nqa@P z_NokI%IRi2+#D6QobniDU;tL@N2dwrzV=<2Ui1AfM_OhkMS9cqO3*2>!LFAc{JiZe zX!<}_PEXKAdS3=lyURa`!(L^zqHH{7(u13>ObY(^@{HEpA_i8LukE0jg&iA&*}1U+ z_JQ$<4wp${+2+~-)f{t z@0fUYmmhZR*|=M`Mib^3@nG;ZZ94Z}7U6dNmz$7`JK8;z_K*@;ZUEJ z^E%^W2(PTFVye~SzhXmhwnl7t99F`EaPny6c@UiOFl+0F`#ijLYQnv>b*g}%jNZt5 zgr#3j-7{v!`NJraSz|xa;?QqxprvC$m=lRG-$9k8p2IjPenreFOWxJ++RG z0#M&W8j7bshwi0ANZjVH^wxIW-t2Q94Y;!hZ=aj+V4pjDFNY|ZepYM#$5?)%AI3cW z?4>xz=5QGEaEx5X zAOQeQu>c7GaH<7JK-UdliTdClZseD~sxHk5A4z7*z&TV}H_~XJX0MO7hJ+&oVz&I= ze8}`&Jc3FyiCedUU+b&*Y3`}_PqX^XNmtec-msyz@t{IY0`&&ARDeAy5Y+!^NGhs- z!h`w`&p8k!tAAs^r~CXo`z1WEUxFrXFp`p)*}o**N(%*_K{VEy1OPbG0wjQ|`!5E- zySo1pn=SzmTwwtc0HAFF5@4NGB7UE2Z`!AP19Wiy(Dc!m;SSelPhJ`I>1b01B#WYf zzOxd1F>!FTI#Nw8!pYRj&YFG(9>Y=prj6kI(#z6|5gqO6o4=~Buhye4jBue4OIOJ_ z7TB=xx4hOfR2B4E&uz(#JZKeR@n!ZvtTVxtw-8I02O(cyv>Ed4lgTI24NX0a<=W&D zW)4A5iTavzn`_eJAvkhx)OwoxuIg!?HyJn2Qebbjf9%#j;_UKxz1GuuGgz*BaLah3 z)@#G*rQj8c!{w*9Rk7@ZS7hL?s?qx~=-ZdFh!lgX9@yb-<}wUnuh5mR<(&47WylIUAxA zWTkDHp{ZBv%|WAzkzV=iwX%#RPj)DcViYX{S2F7OPcrZ3CaN!DaYf<(iMlj<3~N{Hl@(6q zS8XTvq0wOpNX)x8sJ`t{$cIqeE`^L4g>aaBs7bERTv4U<7_kY8?U$mM0vRl+YAKh? z@vPCHXnnrOhCHL|VwCU$QjSOGJ~qcueCV(?dm>r{Kk{KrWY@6m&Kp!8f|vP$lUzk_ zr{VMpG%QTg?gu<>KY-uq3(&mSl9CGj02K$Ydh3x>Cr&LxOz6$r7=oxE`WC&sg10BWAq3X zcvtk-hSQ_?$*qT{uY?SvRh*8TJT|ITr!R&U#&g-`a+x0GyC0uL5ytz{t3aAuO2Fq> zrmGP}mZQjWv^Ltj2wCC`rc;UvUexauBYnxf$a?)wKt1^EQ7pYv;RHVfb{0H1eGQ3*D(!C} zbw%Ag5&t&gXty}yjq&p+PJXWaIDKGkX!;VW0J1$3lp8R5n$`I{aMLLkuQpUqrx9oq zq?KBaYIReX2$e6@wOp84r+$Rk3~*PMf< zyCaoqO`k;tEtwn}S(04O;L@nJRJ5$$sf+-BHr4P$WV2*z9rfbW5UqJ9I##rx*5oc= zHDd)vwHEBNRcj5vJa??^xbkb_y?3hZv|?YUu-ZW93s8?0xi;AOq8FvbMV)&AiPjuO zo2id3TQe!fvy95$xwi9)P20(f4uNi@URyS{E}4Kb{H8KKGA>4Lv1-fU#@TxpA+0we zalnh*YsRZ5j2yytaJ5 zFK)#y-V1@lBkxbmTJ3rrAK2M0>CesiLtVRM!4(bfg`)BWlvB!UM95( z&&o|$tb8J8<-4kte-!4oYtG8q3KO)##J0-XE-2wHwOv@k$=c+8yWpgJcdKiP-L0st zSn-U^SFA(>T&ZHNVgp>|iDtqg+NzvrE3*c;GACNC=^7wSLfhDGlZ!@n(>Aty1dQFK zm6;Y9AxWCq!zkx&xn@>t290$OG}b+o(VkIl&s<~OBWtXCR65HSZ%7Kw)aFdiwEGNGovd$!{rl(_l%F(81JCrk$B@vV*~#|e9+>GfuCC$f1VA0 zr1#jkYT(noZ<$v$_~%v+dV__3rkecHhKKsbckeU!=k*=_);_`K*_i#2=~|8>;`CAY z`niz||G5D&AC14Sk#4|%LWlC^JILvo=ufux4EL{mq^e(Dwr9fkBcDyL02|WdzN5I( zrw+nQMdU-uJwp2vM_Z9^$D%KW4E{6#>;8RFrDxsH{1&<`&` z5q{RtBp+wHJ&m5|b99FIYp%Q%M_Msynwsj5uDN}@F?F3h$EI$O=YpwC@?1FeTzM{< zx<#Igr(P=0B~$-VA>Goc-^sH%F!gIpbZ#GS4o>}614C1P)WGo6UoVFh@&eT?g z>@XGAg=+3pRRguDK@E&d&C$T<)QAS=P5nyA=TFrYQlDC=fyUHQ4UA3gq=5xf%QdiY zYC;2xrdDZS@zkCgSTePb29{3kr-A0wff{H{9jbvHr;gOXPE*HdVA<3O8rXU26b+0| zouPr{Q)g*lm#K3#kW5{ufnBFA*1*Kn^G(rluI!%$fE=TP@c~T4U-4d5%qO zlIMb{=L#yPko*G3l#D~LlCT*7d;#P+gmdnX%8mAy`Rr5JjpOLi-t6r0p$}kSH4TSA zj*DVx*&Tv3A=v{+$zB;|wS5y3)90`adtiM01K?y&hiw@5%wJWJcWWt5vf3pp_iFq3 zMa-)0=N5yXmj|Oe*jFeZ+dI$-d^fKb}K44AIBQ*6e}ij;lr|qk-m%RWUBcuO@4VHaUpUeiDih5)!QZ z?7wvuM{Ss!t^5>5m9yruf9Q*r>>Le2yl7QasV`1nC_+;=d=>Lx$_$UY02V;gt@Ncg z10j78vD9lX5vTjZN_~maD&j)HYi$OP^XgkGgH`y@3k(xYTXNoL&w^!0=ikA#p2oT> zlhyG5mtlTeAFbj55$EHSnFlKmIl`xC@9)BM%eVl%qfTXf1{j}r`n>5EXV@$ zGM1x>*`YpF$VX9TTYj5jpMp{AKi{awNu5iV8nh@lR=1W`#WmfY=qB)fjr6T;x|T{^ z7^-O?@)Bxd@+mMXfwSMH6$xs$72#qZ*d}`ZhbvfHS!e3g(87RlTJA1GT$B&YS!CjS z0T_Vb>}h>Wc}$KXZ1@!L9jvZ|>8h|`LZ8S1%%QXoE4g?trs;nEVUi|3?ZJ5ZRur>C zJ2gR;&jeW!CdjtqtytfJsH|8^U=ufrZX-rd=k_r>FA+X#H^|8b^9d>rfc9DaQJ^ z&3xlFGgv?U7H|{_zk_@u5qdgr!o%wR2=Kysel1#LJKYy(ryFl1cJgiTxqWZRKC z#v4g&pbMvP@Zg%;lmB*kRnk=>ILLJg%7%;3iFq)bgXX1oCz$t2{tam&p6n+vCiR%R zU*c0a9L78x-Vp-B{B#b7F%Ji;`Na8*#R>M42>17s7@zo1ylGE}+@VO=VqvcFrXJQ6 znFB&BYZTBO+msw{L^y6<-;u?&=AIp{_L$quxT403()h@&BXzzZpkOtr^GzXjqZ-b? zQE9@sSNX!mgz21K-Ji;`>NHuuij%VA-&O+_}y|~Z?tR^ zP9h%E8@=tiS<$jnH%wi2^(E89c+Xwc=(Tm+Lv#A6(cxdIM(FaQWluf*=)>_m4e^6- z1^%H|rdYI;zc}ihb>^GyK4^e5n!n6i9f6j)kK^a(`2XR-D7s={6#WPd>lnb%`XjEQ zAB2}kdHx4&P40Zes3-bQ#GlZx#s6%VK#2zMe~kaJy(7;P5JoAn zJ;+q7y+?n-GU(4S6|P2ioo_?)&W)m{0k%W*nuf)@39wJUixfwLLPHZSbOC4;)^MTS zUFdU;_L&HML2`TW92=VLxcm^Q_d&0N(aC^4^zta0gL&wz=ml?KzRM4s70tn#%wV+p z`LiUo8Xfi--~cufy>Oo>`fuRXql=qLQIB3xn-%@?TEc#d-5CwN_c|LIhJpzjiI%@Q zitgHJ7D5NS!iHXt+!c1-ziFr%efMLwlzV;LhK^gO5@2P{!EW49B^`;bLWo@I(J?5s zN-%&r*3fgF6-94E4c4Pq!T1#R>|q4(IbySTGfJ9m|M>{Udk%!8c0LIWlDdk%9CiUpmr&w)V zjV7kGFlS10t4E(Z(86A}UiCK;{pt`KdM?_g>h#B`OV!^zqtlUS1!`YqPOeoe8H`?H zWUfY+!46c?_Zdm+(FbwS0WEAW`lKn*(&%3S+aj`Rt}G=z*0VeFyoOO#1Mx(7`{vL$3o60#*~vXngu z5we6-DrE`T3iUhZT<1EU+nC?;>-qh^|Nran`}#i5dEVE#&b6Ow`&{?fdP#uQkJ``# z=+w|j2c-2Ap!!2DZl?CXKsA^9D_AE~2eB|uau5rrB;6#qq@_%&WMd>iLaHrg0Man0 z27kOE0H(GrTN131mQI3#*u%*3w=f*_=wAX>fiI`$&w z#g6G&EnFIRzmJ}SQ@dEpNqbtk&~yFV2>RK{#1vsja4ISD4^GaMrUJ}KaG|00e{TQ7~J zuc5EQ+NJglKy&eg*s6~?y_YdvTYvYjb<*UiR*Hq4U*T_U;e-`{@0QsZ0XTv7D2>9f zuAnVj0Pe;1Ab*eqhq3Od*3cKD4(Y{01=J(Y5P-a*mjJEN^VoFzzG0;#Xn}ssj`M!i zTS}*silwYI*Q0+@Qr{F#Vdx`Z2|KNN?fW6{Nu6kd+W&1_|)~s@4>+OeK-50~LN_C3+pK)$(JdCwwSu}=Nsm?qn6~y~4 z%Z@&4WUS7>{N;RxthCh8Jr&1?Wk06bxUmq8p4FBpWs~#mHLyJ>_X+SK=AKFvpf7GY zjRaVU^=s{=zSQ zmb%n(E^^YKDNf3ik|)5LCAjXwS_;5=86UB50^7s3{vX)-wj5oteQi1ZZtbk>uHvLF z7=!8n=LPj3p*9+dR%{L3Rn6u!03$oOHu?s~Ta$aJ{!%3kY*oyko!Li^buIH(WoK`O z)OZ4{$E~wXH*UU_0+23arZ61GRg3kVKZ-vMz+~|+gS~IC zB*7eZ=QxfGvXcS}p`eG+U<39WA{ER> z@Bou0IJ;P~R>*hD9oa|(?d;JUelEml4o|^;*6F0>`U7syL9ueF&K+hfll#R^$g5;7 zGijriyO|fFDAxUI=V>#S$qwuZl*5phW)3lVKrN5M!&PdF1l3t@-a!%vd2sDwV|`&h zW>Qwu+Gch$=_+Ye_V$>#0LA)M?DTM3x{`yoh{ z$EoFiylYH;Qc^C*=n&~7C~2P~Pb`sGB|~#`V{(_4bWDynnXJ?Ne3B#P7K*i4W9`rJ zJd;Tp>!%!Rn55Osvf`>InXs_?C3r@yA& zBkBz%O;u-D)Kw+{A>+LnQLS@PtVL+&I_O3;vjLlwS3xZ z8(o)4B_-XX>v60@I3tneb6$_=N0_`Wc8(xP;aEE~hdrVjvCcDC&lKxV)On1_@d%x! zOr}SW=1hhO>27*Nw_;KgXArVOq%Eh_LI|b)1nbm@NUI~0b`j)BCMzS->dfTX2-2Mi zU1?HUWVt7kqzKZRNtp=pbUaNn^<-vDfgaKQ;ytX@MW{pnQecRXv-hGRlb55PkN5C@ zlq+jV1v4^wD3h)@7tp^7W(<;8oG)I*GZ6Z>7+xnGw48wRHT_G0Nka1BtY^ur=m~76 zPGx6jVf1@UMk!e=0~9 zB2K*ouB7PS46{SXotu5KjCBe`kQGeUM#RcQ5(l+$-9-OVU`O;CPW{qUN4|>wn#t&5 zu719Y{v$pHbGTY-{7zTZG&xc}{^`fl937z3%dpKhT0xuc)b)40LAltG0U?Bss8FpRrlSQj{lBC=O=j zads*My0T7&>QoH$V1nB({+9xk0=<}=Q&Kt5C*j8aQzg)sa~PDq+6Sr;L8~o3x6x*p znt?$~KHTDyp-lX~Q8O@%Ndm6@=pV((K!SbaeM?fHW?&Sj^<;HNk^{4uMCsUR6ZnQn zs@7_sz*Q!G{~3&5#Zt{bqdFr4<(RywWL)48Chuz>n-%EHWU`WZfixz5KU@|V#bl25 z!{ve3nY7e?_+elIlR>JpBJc*29))aUyap=+Q<&VTIv)pS(&Zc zsl9HakeN!h3K_4xWrvX6N_GjUu0CO}kQlYIUx?qI4+$xut$c(C)^j}_aYq94InM=j zq#O;r&*UHJb~DWPL@<^=2EPw1Wl~-1@Tb7X9P1X%^Ur}*OiVsohZW38A?LKleixEk z%XMBzea-VlA--q382FSecT%r)F|Ywi92{8e`r*aE7S7@G>a{Kh4l{X2%YHrZD-+*G z{T(>PB&YhHe*(XAT2~iX%N6hn_B@kST4OOn{5;1B@$(!TbBSZk)N;kf{FNoou`z#V z$#c$_#6+rjKhKFV_cHPGoF}Fvle1c`q?j^^)HAE$-j)7UFt^8)XL3sOoKHv|+;v)= zyOEF&U+g@sDJ*1(^L3_V%p-<FUV|sIbCTqJli5bM?J?%fug!r>(st~`AwH8ubeN=lPe$BU!8H$$UAg9h~?PG>< zjlH6MqeIM;EVcSV%nr^^2_0X9VslnVRPjNTRSdKGiyWMRfepG%n^i+nK1d z@VJ;0oVq{0#>Jds;*YOMF&CJu(-HSZ%w@LY*T&?SznJ(V?kyqyh?^1V%tu1AOuJl`EQa|pe{)(bwG<15Jghx@VT_lDdhaOB^TL<_lbPCA z-;W6~c}0ErqL`d{sJ-&)SY8%$59_SQGdTK}0?T6_KplW?sg_hQD`ILgIaJv7=Z}R1 zv~^Yq*{uF&t&p8sigiK?s&82rQ=2Upi6HfujMn*dT}%Vc;hkEFbuo>Z#3T3t6c3TuR7K5o8djz9oVTWs*bNt5k3plNTaL29sV9u|_ee96`o1 z@msl6Z~~JLw6~NBPG-_Cf=uHY^V_0Sa3+&(x{_%Y{G7=_ZTBw0Q%wB+^K|eZCcRZB zEtoTjMpJts1EZb~=4LWT$qT`}Opa?>gM;~*>=rU2Dm_?|$)yNVipgV|R(h~BlfQ3s z{U;-MKa=-_Oo|#4tiz<2lGlQdFnK`jj14wm@`sZE zL6W0T^EJSfDkjbtQL8;5M; zU~N1sIwy7SP$$%z^HWksL7h-PPQ8%!=enW(Oa{%jhANm8BG}4T0=6wupt0!8(HXx< zXduVhqrNwlN#x2QH8h0n_$!B2p$SZqw70Ygy~%d&QqSKuG>ys2+MnBoW+I7$&Wmgg zQ=n~V4%_kDqJ1cn$!O_yFMGX0`zGG5I{ZD%66x)f_HXR;1$0VObpjDg-LJ6;p^I$! zoO+3gp({-MSW}rqw#C%YHMZlo#ap3-yf<2&5xPAujniOD*Ar%j?nHvORJwY9TgWi= zB=3aEv(6}8F}@qB$CmS_xb}K4)Q-va#~oQ1YR_cDr;aQNJ;`LB>MRZQVA51Q$E_jpCBF(UNWr zjph85(j0CJ&1F(rd)@ZX0wzx=*%4aAIrMi)J3~v^vcF5(8Tyc8`MacDp)Z*Dd(U4& zSJ+NhozYH&t}+>}Pl`i(}PQFHtFW z4ii6z)rg>->N@LHi=D?h=d}M+k6pkz%eDVhk6p~f-)%h@yNO8`?NK#j4>9paZu8iv zJ1H%{q^Yr?JE;zbK59!*!L*9a#iWm(oU}uN7meVrB|0LZ86*ZN{Y!za63g!`-D2Z7 zEx%2>#U`@l>*5nCnC`K+Gx1~fB7!;eWA%!?i*?TFi0d6&fXSb-Td!cA5z=Ot%})h0 zKu9$mm4k_(<$l_u2FDg=@|U*Ykl3P34!5#)QebFoSte&!IWjD^GN)cz=fRBFnpsLQ zipUM67!_Nab#`k{7#&;pPTHGy(Y^UtArC2;fP`A-WMNy;70l$DVof80X}v44Qeb9m z%AI)m1W!cUJTHdXu??Bjx{1UFB6Y~l{mC}16plrymrb%dGt9fOjkw+0S`}>fcVnA! z4r6o{o)_DU%jMsU%!_TwI{nqtE<{3QZ!T#qhGj%B^?Nn->Ga^~e z1J8(LVDaq$hmaXKhyVE3Z{FU*|;K3GFR|RV=T0R=l3~jB{~Gla$I$6 z^lm5BP-)H{$6BjYzLvARq_KfcSZ4f&_&&oqHSo!wE=Et49{tNPPo>6RJNBEV7OQD2 z($IO2xik{h-byXU4;tfB%~gCwmzP1x7B)5T3)jndt&P964pOuZ{y5}v^{cQPP!-$g z6voW~jr&;3IUqqK18s0VyTq19bT?A>4Y2=QWp+ec;kKf#)`sGjNw$q@E8B!qqiv5O z*IW)xk_X4W8GuoJ4Md}4;Hhpd?r)zsX-pFX@1SQ$gb&-}E|>L|yoKKkq0}^dTKnnn zTWxPLPzd`=Zq|FKt+VnG#>k5-0N<8!_16c>k&pFiYHIy6fm1V3pt^xPF#xIIKXY2k zso^L|Ej3&tXQHjwsTu#d|NZDwWa$#s8F7G+a zk(K^NiAIlsR$X1obQogCrGfG)^~N4%^&TwYqzUt!-lYSsJu+1~Qqt+|Jmo?!;LV%0 z^65#(il2AVH(gu~n$&Z8Po8$6U#VXGqmIq}&PhK%gsqSFl?L|X9=Qm&N1kNI^1p$9 zb%EK(Rh?9>wUdf;G!nW?TX3ZG7Xv3=!P$Z1cFYS1I-?^z1=`|HCbylKo`taJX8}u9uN1T-{{FK{&j#fmVWrc z`u51){-68qq37^55trAE)p)pqs}Nf88Q8A=-fx8t7hT!fo^{eHts#S7c-Znz($GiL z6Xwubo7&#ZDVtR~CsH6#SLVFb@Gczt!!R$Y;kPF^sQ~sr%hoA7hyBm8?ZP6hIsRGK58l}3dV9J`ci->Wt_DtTfm$)x$LFx+A^*5mc&(Px3+Y&> zuWWs78ybMearC^0aRbl_$L}JR{*1#l2-~Bv^$|;h`{AmdrKa!WDubomm_J%QVBO(Y zmYbO!Zi(v+mijB(u54uu*R$VMDGt-HBl*fI+_Q1q?E3w;>QzRlSDAV@z(I~tbt1q~ zmU^kTSUkwpS{I%DGFt%rzoW7#KECJ5)K$S>8(oZ{Rh%>z{Tlr!0RE+O^*Ie|IG^)I5A?PiI$qhY%Fg}h+P5fv zd1%Mh>V5uaIT3Y!UsDrbRod=8Q ztWi+gd}v)a0@gg^^v*BFx0!6^QyihT*Ih-+Ryu)Sx?6ks$2m5>o9hP?9(U_He|6YZ z(>-+1)t_H--?z_s%2^qg=`6QX&mXnP<&SEkIOmUQqYO(A-;2Mi%hEI2i-%($x}RCm zeg2FjRTVoOzo%nHC4ZEq=8wD7erxQc<(*yruGM#SF!?uEq8~MMjMn6P z_?d*Qt8Y|qx_YS|1D)llI!>?c2d>?+tNW%}&%f#Vxz-hzgJZ{>^p@81huT{6bX=ZP zD`TmELtzNpWvx}fdYQlB(4)$1DcN$33zMBWsdTu=K-=0G(Mnfj!ao*b%+){ca-JtJeph2Zz3{?63I%Pcu8HtHaz_Hk-fq z4!bE_F2UBC~W>v$@MzM02KevKE$63yUHxBta`pUzg*RBEIW%@A`qM)SLHzGR8! zibX8lI9GhY?8dp`BW8ECb2*)l(rRY^cK&!=`}mDB$vU?3zne)mbLin3ZgzPXSG1Ph zIJ;Q(-_I^pbav^fv&$Ksj{-U`oWADz?*HHCqh7DMGmpNwcHGAG=f*-jSk?%=l$9RGlLTvT zZ(k>6m#YD(09V-FgF4PjF9x{IEE88>)=DfcK&*5+;8r6YboRS?$n}FB%BCN7?6~ff zeE;Wry%_cFsk**89&%}1Q!gKP&e>b1Gs%70|9&Zle`y5k5O;gJiX76_)zCBO&8#oU zt`64C#$Q)-S27b>WX?@O^)&FQP-+FV_cgzIO13im3FICU;9-dT|FE)>tejC_FC_AEPbz& zrbW9n9*%O->CQGZvQ?+XyU-6*`dIV~jPBy>y|WhJVJ^qVDqX?Ty!y;yaUb7^r3FvB zx_?om3Q($#T`5$6d@5BH$w0F1cBl_M&Q@MTpVN}1-FW;?eKNA${&OFH75jKQj{5-i z@lGri$DK}BmZoAa>4lQt$D`mQT{r#bKK=&guOD0aw|)FQU6(Y~-d@5QcaaA zskD6!z;m3gKT_IeGg3z4NEyU>r*))E)sa$G$3n6HI8r)|#$Q^osf}>beZ!s9XOxqc zD*H*zNPNFRXXuPF%mRRK6AN_gV5+jKk4ieZ=e@9hY<7a(?n}9ibbrcCBCQ-5Fo|6eQ2O z2m8I1o_Gq^Icz0Ez4CXL+^CqWV{80n#|rLu(my&H$LN@z73;=ZWwnx~qubL_TlX7h zMH%JzWqlW6??cufn;Z8G1iccnZ~b z)yg|+K#}nFzx$VLlI)ZUi!yoF}wx>w`-A+90#M8?kP%j>SDukybEDi2u&(@RR7u?;^YBL_* z!Tlhe7{)`rmUz>}dhL^}2Z@J+O>B>ihdQh9%#B0eRH=tbVU?0pYOYcll*l8+LzyXf zO2<}yd(%nJD%-CtNm(nEYN>Qx^pfBxo&*A}tMR8r#s9@a=v|lRQ&?AY(;5$zTG;hV zJnU~~M@2k*uF_o+YM=q`1ESF$-ejVGj%A6?xo%@AyA|j_^(7@fbAH!9O?d-r*RJYU z=zjVyot=-pkEd#Ed8XvWz-MD!-;E#d)^*nhI%!88w;J(J!OC86-mHrHU4PHsrzM`( zaT;d^IV+RvIV-F6RAb|5XQj*^PHOzElUAtoj;`wI48`s%oc}Z6pRZNGlhgv7?l!F5 z;w+7O(ACh|CtY6r6YKVPZf55#+CAAF+H+d>gZg62Xi1l2a?ZKzc$_J%gUXC_* zQf5ULx(Iz8^#j|!l{qf8Z#9;veIH`!-?s1nxmD}1J-=1|pSEBM+xwqs!Qy&LaiRqd z9=1GuhpVge&p7Gu8Q1#XYLCdSrTsHsYV&4n&u?>s_h9Xr{WooH+vCPI@5WaAw)_^o zRBvY4wc8x@49{@r^zN=i<1e}rJ^YW83Kw_1E*^WQy=83N$Mv=LYw&mZ*vc;KfA_>u z9~z^feKquwhE7xIt+j54aYkbd&=@gzMrQ3T)EG-OMjMUMRb%|9dLvaDFEQewIF@&? zEicx%9d8xzmcowE<(Y2e?Zi7T`d$D>r-pu*3h*+=eX4?s@t%&TCc3*TxWU!r@D!)l zxtp`>dn7uivFWxbUYP=Ozu2OVu`|4Gf(+*l2 z_jPqSt*%l{l}a^rwwk^)FHOC!0t0$?Oes=6PZOiZ?0ICP0r%aLap!=RCD&l^@_hF}A z1NfBV(!JV7mfma*u$3hb$F!XhskQ9cQZsF>B7eHP6x0!#ru`th5nr$ho|UrYrsyNS zW@$3|>~C43k@pizl$YOFno-`>sXxlH8y}-}hVVzqpSxWCTEF00s~XnQBwVr?_|N^1 z^71?9fM(|lEJf)lr&rb4i#XBL-tJp&fqv~zj!WmFf3uWbU-P}nag34UG0NXa%zcoh z^|ETl8>c1sJJZZ2uj@**<#GHyTV~mf{Z$2UZN{MuaPM20rR-{a7xrhH=Y85s7U&4Q zj&p?#eOY^UJ)LJt>FhErS+$1bb7@!r*$xmZk$?!-(Bbxwddb7`1cF(nr=w-Zq-py zPDfdG?ctxFuEc$OZ%#LV6Sr=nF9M!nM)f>^rQGPLZGYLIJ<(qU`Sy~rcMj$l{toR) z?a$fHOh3Bv=K0%6kN@VR@6?}`*7mKUF=AA2{dE^(tj6$XFu(rluXW#$R=|?e7)*?q zx9H9_%(-2=X9ciXgnIg^$`1hPoXepcg&*7Xhic1viZ*zqwB7NM+Sa!b7|I%)iTCVe{>j(2x z>iU*ru_`sb?8^4qH%>A-pLgHy*!o8eyw17uzkfN7`x*O%@u!nZSRcIbrbdCNo;v+d%TZlDLYT?pIiLh)7jgMy?7?a_!CzY@32%1*AaHtv0$6~ z2JJhP>^}ahCtVK6U(M$j{;V79=K6uZs`qyjmvycDatr*WD31G)&Q`T`)*W@&m3(+N z=Y1;c`p;i`pMT2vuq3Uk?7n9msiE2VKYx{x59c!L6A!DOj8b-U&nX0PIIgHY3c<8# zPWlB$o@E8ZCl-RYr3DM&cNMPgss5I89hB2mRa2b@GqvOu!eOS-8gF5+e!I# zl)YKUwL&92q1wz=qIEs~!U@;^{I%4rxRbLl4{p5!&muX-G4wQc&DB@;bj7e|f5oA@ za3ya+o0_k8Zyq;`-x$Nb1ELsK`tM_0#PN0ur+af;{Dt-p z@wXf?Gyu(1%CW++!YVD%(Df>HQE9MB7gfrwaVIEySfza`eH(`_u`mY}&BXwosIxRL z#z|dN!oL+Sq3O|1Iv?evdogYSj@wtQ91ptC70L#vm5)`b4NmVfY(blY4Vp$SwK5#_ z?%_0y#=t*N#W4&#_Lci~Fm@t-*@}7wCgKXTG)rwhv!ygJP}y*m_O8O+9qVmTsoZM( zmW0`E?Js8@b3NxNJb9-XBJzv<`^Mo-63%|9;Uhbol=+F3vg*+bx72XkP4=x@022QY*#X!n63%zq?aL7?>1 z1yY>9_t$zK;0$5?OB;P1a$LWhr_}6QE%$|*fv-F_w%TJWSkF)I#vbN${k-`3^WU~~ zI_l;W{~Pc%-&vNmuE?IPQ+uhMvb&2E8;(4L`FJI}A$=a1BCIq~2Dn zaeCL58XnNkNmG|OsjsjAjK&^8Z?FRJbv`^vVCn8S$0p<2f?32X5_q=R% z43?5vcG8!n0Xk+0ty|pH%TWxq-w6My(#G=mwu)oSN9k#np2E9rJC1hA?1$%xecYPg zeR&(%zWo~*ez}$!rZ+^jv$Q_-zoy*!0hLxgZds%i(xdXGhUdNMq@*{j6sbqOiF$wkEq_t<`Hty(9&tff#Ba5v3t4Wp`t80ME#*A3BRV_Kx`r>}M}?4BuZB z)srm$_Qvm>^xgU>j^Uq2_;18+)tiPT>Iu8Z>1DIaY)5eAHi_B$I0orGT@-v))Q+;qI;D1_lBb60 zr8r5Eq2x=bl&N9zB_!cYGQ-w*6&VTFS4ESqI z|Hbt$cs^u(#J4+~x42XdUb@+9$|1Fe{;qyqSGL=Fh~- zu*ZJRdhPUFAdk-WMt02j+P$_b(c1a=mvT5puGU61g4r|-@Da`=)T*Du>$^<3+Z#M26!`{KCrwNeS4^ZItc+b_;bdtCJ$W9bsE z39U3xrT0~8gwju}N9#nZ=jYEa<^L{!cD(tm?~h-9h38wjv1~T(fFiCOM`a&s;FwCj zJ-_ezmi=7O-2EGu!=Jm$;Y@6OjxT+NYZ~hrPL^|DMfkJ0uV>0<4UP1`KW)ITU3rFm zXrq-PLup>6yrhOdTJEGfsym5hSQ|>~PLd+y#$#_HUy>R&*qf~M&$CYYBgsmUF^Xag z@-(U8+!(`3zhVq4{fIG0ii|<)PVykBVVX%u${I=@$%a~qR?;Lz>NV?V*pH`%&&64f z9vMn&2J+)}RX|eKP#Q-z)Q+fT*n;$KHme@7)NtG!_p0{at(FX2mDOvcy%o5ordPGL zY*wN<)Jjw@Bt^z(i}NqNrA-abUx&L1mhQrpFG-Plv?8N-y{TdPn`Q2W-mldQt+p6++74Fmq#agwgCua|ebtV(6E^?B_*ptS3q3sADB8nizBgRR^w zMdpR-fZn;LhN-+(qB^h=^#}>Y`P@oBiWF&O=@W+E&8CL$#(rR5(B4?0E1VbKGx#O) z*K1?2PVLG!+|Nlxam?6KruTKF?5h%$?V6VIMkz9XR7!fQYD;M)Dy5aElq5yQpc2uG z*VORWm@ASZLrdU3k6yv1hF@Hbe{CM6fB&lo{)^mlxT?3_$Nl~R-ZNFfcTZTNrs47- z>zkT}N9J;p|2rbT#5m98Vi>6SrMsKxgC|}FR~oo79B1|Xm1VQ=4>>Js7EYBknuXoD zSu;IpYo>2+nuQ;{)x~J5k~@cMrl)Vs!XIhqE|G8yb;G*jygZ6);9FQKqibOI74ZN3 zihCuV2E=h{ci>lMRw{;jt31qTJ#O=I^Ljk8rH{T2a3{t{4Nt(aMp9&G2drIsL7N&b zBvNE3jVO9IYyAsJk)hNl=`F22nXnS|Nswb$HGq>h+(#GfASAYJ(kNdef`Ftan#(mgN?RsMm?wIf9I^CtQ5l?IA$eK*=3Y>$~@YC-( ziB8`rSE=Fmghj>}gP*!SN`|F^Rm{@pm7FX@GEWS*&q(Mw?4|Exqk%u3WdNs5d?v)Ve2L9-f3 zk)brJ(Fk~DcOlj7G-*v(k@eD-x*islfUS>{c4Yo&g>r@S zmjiF5Ns0`mx{ATRZ)=jItfBNe(}t2189F();TM}YH%`Q_^(ho+|4Z-W0(@dkZ}9@q z6Hk+A?-Br-LunrTw|WMG=ufL+DI;UNfGhY1ne|rbJ2}-2z)?K$vZ-BH>F5+ZJ>nSK zm7T)ZnO5&h4W-|bZ^U}1RWG+%zOH)1<>WX32Q;*gvMtJDR4RvO>-7C@0LChNLDQK3 zq;35G)YM%4sZz3r&Q(@NHK@NBs1k>7BQX@eM~%m~ku2?3 zDO05v_3pUDY=JL(5g5k4X6Ugq4-ToDSm9pU30t zLX?tV1BMPq3IB$1NjEbMREd1{YaB|_1eLfZBTmX`3{o$)`vC6GSwiXkYHD~-CZ1ih zR7j;nl|EM~8dm^T@7l*s%B7(}l{}RWtCXm5e-RcrrpXi1JK@xD`8Vu~;mA<(7WAgo z`U8@(hSED%8%k1SD0vHd`OYP;ph?OO0QZNcwU`cXr-COEy4 z%1$afs8S7;f+|f{sh>*IH3uy`VfoL<)$O;pOK z(qfJAl1gu>y<^I9=?JK%p-VNV=k+U^Z7O}N(h-$rs&w!(fH%1pkDh~ncc}m#eaqp4GVPHEt7)yH(@% z*SGUY|CHy<-?gknj#Cg@`%CC*l@%Z}@9HW3rkE^r>+uVk3 z#8$P^cx+XXl==2t{_v$)M|Vfn3QJ_$*DvodY~P%mu76rVoGdQmizml9eK@ zke8=7>3C{@34LM0!Z;a_RZ=@AUgP6@d zNd~H6J=1Gc1FOpc6lE*z@Jto|s0^~rW$@QIm?f2UzoNPYTg!gS`8w*^lO4ZR{q_A- zjDbT0tt6pkE0w9>e90BGY;OSPs1AboReDRM@v29sx>OsH_U=JO^^zKRr8LgG_^>@-Ow_C~H&XvO$Nl+OxP>Jhr zKx*XP$jU}>kf8Ef2*!4B98cF*1e zTc!@DJ4_|NWvZ%`W7yJmrMd^>rf`f*Y?;O^Em6xf_M2s4&BbzLO`gPFd>htoYPb&e zVv-_5sqXLKQ0k{vqWwNek$MzLd9l5iq{z_Gt!(~M!_C_p&S?PJ;f<{Q&iBSvXoYcY zE0C0ZEBJN)ba_{Q+0`!9X?wOpb!w&mbDciPF{nkhlzZFeBt?c^xZm)b$JB7`H|*=j)bK3SS;}>~ezKFO|5;WNXD};KPqfm{m}io( zSE~;zpdM*@S$E1g9z*S&2>GU$xlZ52y0`PuT{u?lnw8pvPhBGRoMY~_?-oQ? zWI68LVBa#PhO2*QrN~gK1A32$`_y8++#{u8sfHJ0nx0ld(TJwX})u?cpCcoKwHf z_L6Vt&z2?Lq!)lc@PvidtO0lmSK(Gl(RHlrYxuRM&L3OLy0)B!ZD~i(aFp!alU- zmbiAr^Bj7085v66hu&XW-$YVmD0!}Y97_I*q{vX}SH(D#ye&z%Ubvxlr*W?6Zrhgk zYn7H@AGf{Tmu|dipmB)51Fm15t#}Ampbfb;W;n^eRmjNcJjk=LPWnhC|IVR;-U18| zuYzYt?EvO-YQBf_zti$PlK;ilp1<7cFuPk1|9-*0|2Y4GThshA*hz1xM1GB4CPvmS z-6c@2>|KJDsGhAvcL^j##-O_dddq0<60Agb309)J1d{OUryEAa0xtQ!Y#5zb+fe_j z#3krKY`ghy0lIf_?VA_(DK@lIWA|-x08dhFANRj}^uKq^&|UApeMy*|kD&Tn!sYO# z!#GlC1r=FCRDbl&Ff~lIYbDx=Sc!HgBt^zJzt+C-#CvvJm(Xj^)bL^)Ggc~vYeM@1 zbi@ty_aU_mua&KIdmsGjfb-|~u+Rt2ANYN3SYOw76HmJy7V&!iN5}r(d!tD8M>)+} z2lW2Z)`69%4y;6VKoZ^-;JJYHoqzXsQl596l+n<6);DpbWlspQ`xb)c3VQR19tr)6 zmD-{Yvl6d;IJ6hezr^tC1of=VZ}2{AxyIc*V^__V`7304Nwb0V=#}Z`EZu?sY4;xw zE_0IKZhdyT5#YC*?-`~q!mr@i%FsG)RP4n4IsNt+t`B+v?B>vw=nt$m~%(M(5DWQ;g$ zb9&8|8m_9+!z$$v3BM)AnVsf%{53E<4W%}ZhpJf5w)IEidh#&V8unP6d+b_Zw4R!d z#V^U}#4)P^*00wKiU*ox%4IPcAA6ELUs*7<>rNsO$bO`3s>MdL4q#QUd zIe-6`FDU41meg>*FR>k2YJqDSD~4Z7$u1RT|VBf5U|9?|bZ>Hh*~@ zaFUYp6D^V0y-tzu8m0-!h5un>DS{h}+rJHhrK|AJp?V|!Ss z2%bt>i9F^XTuNFgWZloqLJRZ~Gc`>2NhAf}J3PU)G2GXw0dQX=2f%&(836a%6GQQi zluqdaa0PvxmE!wY{~Ul^&7I|!Wt0Wr6*tNvMh}gxtC-W&aPfKg%^gcku`Nkzg5Cyy z89wh=+{*+|!uvEPTcAW2yr-{8qdQB_)L9g}g!@3*xt0Iq`Ru zp`nlq*wY`zSovU4NgM0v3|s>uxf|%jj4bCx@7W4TA?PinZnA+6ND9M5CVtuPf$3H! z_#>{xyQ0oL&>ZJ1vNNc^fnH2*jx~aH#^;@cb!c@yW-?rB^&Z&7WMZ)LCV;+dCubS5 zJTbVqHU5e%lY4}Gf@Cn0(n8u{%?(3R1lkE%{;?xtgyd}N$QmJYRp*qDeM<6`wW;rZ z9bhC|t|Me&Ya?l;35mmU+0^F>skz*xwO7cbG)JP!S<5vCILoDlY|zx(3E7DCY*Qa0 zr2kN7XN8b%TK3~Y#td-zNi1*EdJD&=&0!rOZ>mn3kk?dau8?_3_6q5xv7&IiQR{qw zI%BzhDhYWMbu8&DQ80<~ z`4wlnr8ki7ICfSd zDGMVwhm+wOOp8WkIhY+m=nYAESSRF&=v08i5rlN^gTI(;f(kgV<0KCiAy|vl=y54O$xuwlKq0lDf{-T)TAkWZLr8xi55pruGKJKE$Ax?) zq%O1qKI8$!G_DX@dLViH9mB}t4 z9r1*wLJoiia6(8wBynh`0TjF+{|oEqKr;H>D0((pRmce>c`)oz=q#i_5v$V>h6pK% zgmfChd?8mZVeiJY8o@dtIWObh4|N*BSs}CbTAjua5sHFXnkWN#Gd%zM;bRLJ|Lhcrw z$Dx&wr}tPp&7hx?CAVGI1BE1UYANT?25KxrW( z@RZ}LX1H>IIzpx**~cVJ$QgVYxDR8sgfT**?lZV*Ad)F$_@6e&Xcf9 zNGA3K(s>F_2-$&zbe@8|HErq>q;GVF@1 zU167yC&W%yxF%!({_+X^+Ceu+#94}Z!Z;+=nG_e&0!vDH?heU9`Xiw{cZZQeHbvWU z+5=__`5p=B^nepW;;&jeJ;}A=zl>lRB&5?5>I>O?$m;ZhjzSJ2A)Q_@UC4)Gr#Gw+ zvQzBzhHFel1dlvm$5$Vyie(1a6l~iISCY{HeV`o^^Z-BDwE94rkfBH@tv(QDvL$#O z?@Y;OJ`GcZ1n|WK`OK$bk&yjOY#sK6O+t<#p*rjfyO?AI^FM?B8%aMnA*2M7#!M~< z$%j3nEs|#-XKl(ej!Gn*nB*1G1J{R7BY76e3mJ|ijY$nATY?`Pw&m&%&4ql1gv!+) zIttm3yW(_=l?DTa{DR~aCL@?+1Uq0IPD1h=Oc&A%$uuVOEzvdh07#?>2{yq!=%e!B z3^D+QG_qv%4qWXZc^*~>>DJYffpEeR%-#~zc>!uPwz0OYwqy|hh9p^DbGwZ-7|df< z=d<3H41q*T%rMb;5t5mtLmK8Qfa*i}cQUY6A&j%$VI18<`2`A*VMvZ6c?rfeCCeG` zCX(mN(Ta|~JR!1M$rww5-SI@6=E^Xim7`8@0FpeY9fqx4Sv&PX@FT0@tk0E08860SW260&|6I zT!6P{nC?heBV<34f0&#QGPp19d{KTC^0lC}{E_=Av|^GGeD_i8O*nF2g?>UlMlyuS zbRj7XF&xP#SRtf6lGmB66LJTpMP(li2ZWSBk_S^A4abH2`Lxv;1J{IvL}v^HQz?fT z!S%~+9lizyh3rB?c3y+hLLQK`#zGw-^~KIuXd-0CTSKEb$UkVV#h%=~ibNbbr$7I1lg^oDy=ff=zuo6zObrD&B3$ z3>YKi)+B(((J9P?<4iJO^cw3WWtdlISXnqNrzK+;NK?0+ISm^W6o$y ze~tA+qvjn5Vyh5&14kT@xiGGeCB3oTiM$K-2Uv0jEfbjs^#@u~2z?#p=RKG|h={)< zn-9mBq=Ug54padgLijI?yHU6I^hpQY>(Tynq3XEZ==(~BpbqW+7Ar}@yZ5^=KTDL% z!tX6f2MdG$D6P@BKP`khA3(#w#O%3EH6*Lx5|d5veNkJ_t06dqbo?H*2HIMpJz)*J zD#Z1KwXi}+8rCk&7oS4Zi)=^x#%C}$Y>8{Zb#Q?RdZw>z3$BN#S4k%w*5$&JC#JwEwuaF1i6K*7P9%Ko#vLCcAB3<0f{xekhQZF zN(fmbP+6lP_ z3F&+dlZ2$sv-#Nri-e>hq5SND<3hF_u(QlwxF+Nn5_Bf87fO%C|HAx?5uJTdN5~w} z*#~J%{5j{p%BNXQ%Shn%n5{J53g zftyx(2cU@P%)xcSK2$#l_X}BygzD!Y)Dg1%Q|r|aK}#VAkWiZ*g3e6*)#DBto#T)xWD}A+Xy-Vb5>mXL&CgE|HQAx`l*2bMb=pb&0<(pDDEavXb_vOK)asmo6GBQM zAv-4^@0-?6@9(V6uTWmdNF=25D|BSy_xayoIupOQ{01w8xZd&`?6P*Wl}|#Ysg#!A z$|qsbOiQ|ne?A4JX9>ZiY4v^@8VGS-{S34d;^z0?q5K>htI;qU>nto2a%O@h=OFlw z)p7Itc__lfU(f#m2hd-TpTCTKB)K{M4gj2e&yojj!x!QxUVvruE%`A80DTye6P5(` zyaG@cV_krP3s@)ky^xDQFL$ZE>W;8Fm!PANW=TgGsy@(B;;@CE~J%^e;`d_?ZS3z zgLc3y5^_X{G2ct9`9eH%O2|qfIm~4tUly?QSCsMIx3zIZNVLg%;uGu4GGmx9#cn1Py7WX+9f5Kc0z_Ap*$yZ;zqumh6(ppS-xObN)0%wF+9_a?g)BfqIt5HWAp_#9ox9CQA+I7Kox4q@ zkaowdoq~pTkJNvjMM63S@h4_18F!1dQ^@2MG7kyq6f*UNZ2igFDQr3lIf8_A3Y&34 z#^$tk?lJR)yn}>v?lA|L`13^(lemIX_t!{8OeG=DV|&txP!Us~$(G>8p0IrS0c$DapFn#1cY*|Wp$Q%ad@ zLfp=!w8^)@>co^cyq76sY6$5dq^xNt#LcJW%p^y!X=pwzZ?0^#cHDeg!PMVmiJMRH z*mtufZa%GO#t8WxN5Sk{Xr0}0tJQHcY-KY=h?`-nm`Y!;j_EuC|2ArKyw@`wg_O#R zcY;W&8u|(aYr~`!#_^8i0h1|YGtMCIAgN}4WRjsLZ`DoIHj0%Fhaa(fwCZLclb7Lg ziX+#)v^u3!2e5uAmZ^+;&j4Ok82VC*NM0o5qiUEjLYCtCWg(_s!{q(S>J<0{f1e4- zgQnGPOYXt#&sro8nHqa6`Bm28wG7?jkmalQV|AiVEptpr?)PjCYneEj5>V$?{HheQ zgF54cT%BNNhgzo9e$v@w3Sn*RL_4(&?N}(*$%pOfL5hhwXvrb;hjgCssEK3ZpVBlk zgP2T)OWp8f674iHuSO7h*V)+2jv#*^X<~NaSvh)U=v)<7uSgy@{ zNbW+?+FW5W9x{=XLekF6#Z@VtLaiKXZ<8?-_%9rBc7ewVLfqK}PBuc^*~L>z+}Q;# z&_&0cUEp?Ch&#K$rWHbG7nLzTJxtE;iDd*gJ%{y&7A0 z=x>e*DRHOu0BI)l16ke#ZZth-?h@iop9YxnLfnbj^M-C9FqWRY4K%Zv_@@~I&2}Nn zd)xjq&@}&%Vr4-7yDb@H<_k&0{7{b?Vk#ZCI&p<88EP)ztU&GcUJsmev7})$ns z6Oy+~lL)dO$s9BND#aQPftPGQTxbpmX%V($kx9H}bs7p;V!8{dD6y8AH9|Uw&T2DkBwpI8St&n_XvVPaJ-i)$3`d!m{GlfY; za8a_IbJv??Le?P3gC^ITy+YjTbb~o1#H~&@n8bf5b^rcrqbV)K-G6N~&4pArYgZSW zOm89ekl^%$K5mkbaktsk#b&ce$h$~LXS3NW@XuevYa05n+_1dUB?cy zPRNTwcAAS!GJ>V@3!m zCuFY~C$Tc};>sQE>@!=1OcU~rxh}DG;2xHA_M2do&CmBj4wytH>A}m5@OSi3=b&jQ zBpPo6i5xQN5^KBYd~3!CIV9xpO?%HHH|;%--n94p?xwxxF_ZPY_j{A|y!Qu_^}P2- zll8p!xQVWU6^}LVz8d<;Wc_OBXOs1-p5m*;Iv8WsB>nSkTfLZNzR$WLYyZ#Z!QRNp5(kKf@6>B zr`xl3kM@VDA!G;=3j4!!7t$10eEX1GFkvA*kdV#=Ggn9<(Ya{W2zfwsE}9cU{=_yR zJC|?~W>e33zqND8loqnQfz8ilQ%A^pB&2=W^b<0?t1bH#Gg8Q8Bvke*W`&T0kK!H$ zd+(oSyO7gJN-?=2gghmk>HTHmVr+i8BO#CUmq`}VzLw3;Rntnyb4W=0su?3>e{HLC z&CC^Y776KGGY5nuiJj}_tdMeI=ej8pw5h))cK$XsguEwq{x{4H z))Bt}W^zEtX>^7)ndA&v%XCsfx0(N#WFcMq;kRQ<(uB;r-SGY9KW07?e_#2JInKo2 zSN>yyI0w-B$L%ZsG5MJId&Ylm+B5!RDv6HUGlF-b7Mj6+==O}@H546p(r&!0C+)`T zC_3(>-Se`Zw0mBf=(uk)a(G$4&B)=65gqq!MwFNJ+l(l0F6;Pbu+d)DJ#4hMMs(cw z8v!rt_ZtCkujsgaZj6_8pBv+ylKi-RZqUoR&kcG}c#eQIrgKxs+m0s!w1RavydiIP zUQ68f8?oMYA#TTdi`N8KcofUs@aFW=@>}9|thai}1uStp)?8lBf|j@)>uui1!j`!G zX`HuR$oW<{YGd%Ni`M{D0kmc2IkAnFr;N>l5)A|z0Kqg~^{E3^Y zmyq1;tzeQ4BkNhq1-*gyQmk~SD|_mK-u%**q{+U!pm%#2OU5W^CB*H-3wqQ76-B8w)b{!bx$_b1hiIp^x9cIRvk!HMJnSVWTk_4r z_?M26)bZ-$Ttcb8i8-ZKuIHs;81-;>22#&kR>$gmj5>E?ta{#YOoL+48AwSaDc;Bi zmVAQat2~lNz3^j1Hkl1bS|MrYSevZ=;md;zv%8|y}#(;Wxc=X>1AC*_VTi>A$xmS*N}a@tZT@p zy{z{jeZ8#rApN|JQi@82?48Rq-cBKPggonIT_5)MvaS!)ysY;r&v{wzQwDfh?^B-l zx>v!*!P(P&c|OoPEUA~oKGql8;sx)5kjDnw)z=GNPV{jUt348uUhoSBo3Pl#Jx4Dm)V@mCi}R-hRyg*%ZR;!PJFx4L-orq#uZ-U`uitBavGtuBUoTSdpM zE?&B6b@7sSn02-U3n$=<*C3wBco&3}L2@L92s}w8^;Zt*H?17fy}Y91zC<17ZK_4( z+7fhMq7L)Qi;i1e48Li0G2E-~?9?(qUx$vkX>~Ee>&QC(*P$=pw7PiN8z?$YbjNd{ zXslmvoRDrv=$XNdW}M4viB~N z41SG5GYe%>5QAk=}d2pq&~F)p3GtDv%I}R z-a#^wNw7PWDUNAd=fkxcv>pE=%a zA@0U!j(198?O$g{_d8xx51aaNBqY7#RTc8*Z0reWd9K$)NX*-KR>x$z5cksLU2laD z_tNBDZ=Dc#=R40kAY|GxyZ@T!1$)}mr{kJ}Jkon!K_Lr~P}qB3KOsjq+C0zqMhZEF zgmmV6n}l>mPf2zbc!z~NgM@Szc*T3!w8mfw7U2Ic^pb^4!T+_CNt%!)E$rRs``#EK zYmm_0==!V#?2AZ?BLSkdXFbFY##`>rS~F zUEjRH|!IM(o_@mt~FZa3&IfR7v%genfLN3SJQ@#(qWkPb@Vo&)#^o|MXeZksU z;aw4ufrRX=@QP!ql-3~6+F9u(3z>|BbXI!(g!H;*?R?~o6!J0>()q~C6f#xv{IR!7 z$P&r(#~xlHa9TSg&zW9cAwM7?JDFa6AvGk=pLiXGG?zSo;*AqhPx8FVn=hoJDj&SC3ktrr$D1qtPOt+z~wyI=m) z+bYD}FMsM?5#sKbKl9?!Z0hcQ`7-D-KPLVPWQ#{{WpPH+^NlUuY>DM&;Vn1K!dtvd(Q$kH z&u^NAKlgUAjz0@;y=fNS>YcDUI>Ub9CBMM=(LMeb-intjad+9&JdacrJtg-3#F8eEQh!A(4u*)kx%<8!Fgx%giA?~c;Ywv^* zcbC1#OCD}x6)9wI-}ZXX3UMa``@Auh@OzMt(D#1hWis)vcTGd>`Hf2@GRt4{t#!wR`OYs^^FBh`YVkz1?d{ehi=N3GZH0 z@>6&^MD1Qv(h;74QhV;8)dP~9;iZu9J6V1Xe+Q*LLCmi3?U3&woxZ27UwltnzxtlG zcKe>Tx_nPbzxke$e)nZffB3SdZeP~)r!Q;T6W)fiP~S1oO6R^eya#d($qr94?on5@ zNM2G!*M_7gJO^?m$!lr zkXD5vWUjPO z&w&gjQEmMfUJltmn?Icw5Va6v4u3i?Alf1N)16`B07QSfGfX7h&&M*MgL%I0 zXwd^XeNrIMpGqAqQl3z46$CCgi%T6N0#z&@QXi#e`Hm4;kYbWSRO%R!3z_f`%~R6- z6(ee&;Zm2;J*e)uA)*7a6Zh#55%nye*LyUgsecU-*`5>xVrbn!wRNnBeop=6)<74I z`B+f~xsr}q{q0y0S*`xRAaDgn;p0R;B$du$2p!>ZBJ(AV`IBa6<4J~zMiy^`9qmak zM2)aYhKo@zt5Q6|Dv1@z5H-RoIYFd(QsC_mA4hVc$cL!?;Yv;tn^8*b4_6W=8X#(f zRdTXuMyahQ(mXE72w~KE$1FdFj1=QMDUydn;zcUtSjZ`27UaoTzVfGvrH~g%R9|JxrIOewz+=q`Ab0Og)xep&LN+G{LOnaND)ajxM(o1sgASJC^xE^n}GsPr|h}T%+ z=kVB+C}JTgBSgWNEdug^rW9dZ|ms%N5zdV||K zCy!$$iFn8*BbU;q0ej|}6Mf5^ukf{78Ma+GZ+tQiC zWRVTgnZsmJ3elOv6j24ynZpzj^%mE23P${?A|7%kM*OKF57LAYKUI`Mz9yMK<8rEK zfgFB-U(;!#3vx0^9Ub#D5!1kJRkw4@bdd;omqf)(7g>;H81ZL_HIQ2{;?EG(kh^pF z8m5Uxhp!qFM9`(Tq3k4t;b!e;bmP`})3lDJXh( z=xmYh)x$H%H)PN|PjtMaY7TyicCKiD*ORb18Vd?2<^mD%9*Y`ti%BjNNsw2l?^WM7 zd6CG1=n*YLRC~hvGu4@1EFzjzJw<`FG=5q1uS-Pb|HuZa=MvH539akVSgB$z6+_=w zr3wP;KGBj6`TYYe`H-*f(b5bV+E-8X2V76#68b)asjB9AkX2h~4wB?Dk^3RX?54X? zwSI+Y`5#e7c!lVJJWVlb#Gfb9nz__fB%3H^zDWI;r4ws*3q|H9EIKP#BnlxqD_A6| zA&)=6@0LZP8S)IyeUZr8&h^~XC(V$H()gIE)HfVc+9!EGvUH?#cCkooha5jsOWaQ! z^DDjI)y~*OqOyZ!@P}OU5)rwR<@Wcrtbsg>>r62}b4*5`%z~`!lN!i3({(*rzjCQ} zafC}mErd37d#}Y35w@FS8gPV5L1X?g{(6rt;$SBlVe&#Oe}x@WcsUH4orLf1X77NP5&*ND)y$Q%*67P&%%u0^gC zp=*)XimboXnHI^<=(+oOI*VMf2J$n>%bs*V&Oe!Z+Et<#vWP^LUnLUub3K1H@cZyO zkp>Ch%DvWgA{UbT4fp)3MG52f<{j=R%$$KB<- z<4SyY+}*xA?jGMAcdrQDX;3OccN*O1yDQiE?#lapcjbEDUHO10#nmWo=l9qKQ3ZL3 zq>ird2GOd8u9$jed{A^lo*_}A=Yt|fsMmtN`Hj}mzNOcqOe8|yBx(1g!joX0uu-&m z61*=qiUSZmPqI-&7+mwKmAq$Qqi>#MqliU}o+o+8_YQwZBzrNzJMLlMJjugiE@Jfh zd%0-D9jDjd%SAR~^vwSz-yOF}6zX~=^ZNTEzPsQNQSQYAXZ|1c-35<|T8`M2LRMenF%|^i%c=Vm;(@%4F(nTGJKPkPZ?`(nz*L z^nFnyIwAVLs1eZ-d_12g@M!g-NPu*ZsNU*Dkpoeya9@zTB#I&1NL0*Aq8V}?o-bY& z9gszMzIa*0_2;%m&@8d4r&gpu#*?UeYDGTe#n~LQS(HHjRm4F?kf@kfMH)n2#-nhZmlLD5ef z^&-nF6@21&Q)C{Y>Ipt^yd|=a^u+r#Df+~FO* zRU{8&N$wLlh~@Y`Ng1ppxVE)btchWneFfh;TSdeWmg{pl6W%Hw8^N-bo;cLg`rG0q z$jf*JX%zL4{-ZgoY!nMda;YaNTRuqV)hJd$Hjsp0Oj(7!F0@Di#Ukd|1-psOo-n9^Nq-b=>0$6hzf|>{}W54 zz7=&4wf|>?CvBbt_y4qs9*Exm(4yA!Dc`x@3z@_PpTk#AJGq@0iyR2{U9R8 zam~f;oXPws;vl-m{!wH=^gg1WL=HsnBl<}+K=eMM4$%tH`-nP3)Oc=d^j5w;J4HNX z3W>TtJH=9n-fQ%;$cN~?Mn8*Yh}vs(4xQ;P(E(9=jb?iiJ%QWOdyP6p0z~gM>J*8| z9HaLd{UYiidauzhLQdouz1Qehkq6OxjeZq%5WUxEw`hgvy+*r5)FiIwsbt>Q)FsLx zTS?TurY_M55m)l4_nXK#lS>UJQP<};Q3fem!Qc7tyQqUylBiwxzl$D--q-YpSd+r_ z=zUFph$e{M*VHYNCUcD5*VHZYAbMZZpP~$+_ci?~S|EB~(;m?U(fgYAh?pr{v)rhTFjqW3lJ6Fm^UujwxlF_l}_`?MZkqOz{%g6JN$c21LqGJ9Ll@Prbt5?)R^j@r9(FM_avHlgtG;Uq*#rjty zLiAp&Ln0lb_hKCqYan_r)_-C>MDNA=Pc%aGUaWx82GM)50!GAiZe8!i3NvCMdM{R( zF&CouVuc&o5WN>G+$e|Wy;!uA1kro3gwX-fd$A0o7ozuK8AkjJJ|4Xn%QR9UdM}n~ zm8Wj-zMCKTE z5WRBk7(Jc@pU7Mz;w;tHyHd}AxJITY!6(FiMjk{zA@(y$P)a|M^)u#9p=zie{e8Lp zj7r4ld5H)k4>9`tawCj-FDCdz*53$S0q<|La7^D5*#M&^T^)1qiEMxo$Y9Y=WQQ3E z5dB0JY0QJ@74XB2QixswKf-8$%)EtnUL9!^Ud%P$Q@|2sR6+Eb_&{UsB^;xl;|3X( z5WOZo*oeB6WAt-ew6Or9*Sn80*06XxuQF&PI@+j$45u9F3X)@t7EgltYK)OSPt_dU zixp#(E@07nv0{uah~8%vV?-|G7`@NxSR)4Vb|zgNj0%W;iaf#Sgjgqp z1+Jk|CmPhW_r!57%?Ypi|0IPZpJZfT%>G#VolKH=Bd|yvbMQMuPBoG}3GS#r)mZXB zqE<#uHOf5+KBt^!v~Wyd?_7RTNHE4O_O3?Yrano7ocb1D)dVBYlY&6!tMuec$CF?@ z!7=h)D)k-Z$776_A&*1OFy4lATuYfC#f&vRha65%B}$TvpCAiXvWzqKLLPvOH^dTt zy{i6?VVvyW&C=nSMUfro>U_fqF=A+#(GFmBEN#ujb=#d zVlBp%T+h>|gas<;c%~cao)pO1qiAk}C6C&ATKGPI#HogczNHTIrO~#QjE&k+xC^eGezSThu&lj?o0!*eA2De1hqw9q!y;dQc)PDZEcW$>cNhtI>WURf-5=g*q(O9l zc&CvI(f#3FMhQgshj$tEkp36aj&XV)mKZINV@P&*LLY$j+B!U!d%wGlXvj$>yE3(4|HO^bU>z}p8Jhn$ZXVe zzY%vMAJ2uTXT6aES%iAl8#xfYYX5*ytYffh|A0{oX`nk-tz~a8njxQ&sN>mS^g{Hi z{ewo-8g5;$+CONdLUz$OsMaFOj7-RW5_RrnMlodc>HG?AG%6seBZBignito_hN!0>=V8b_6ef}F?xip^o_8UMi*jq zAO57T4}a1yZszNwpYfmajj&G{F zKVzH<(LMjOMjAvvcRyzodr}lweQubyQd8~g`Jeao{4e-=?Emxi*fqYM_C;S$`;xDx zec9L3)*3_aROeMBchOElb$@L(k{~@K>OH^N$b{(L_!T1;qI=_4j0%YEjbAnDAi6hx z)#!wjRnRAKs28m>0(Wui)g*sG6(Y#+RbCsLh?!a zdD0E3Y^3jOCV8F4N^Yx`B-)cGPl7o>y)ny^;2l?QEQPH7k?+cSqY|RunQs{N5Iy_! zhH=1?Mwxm9e?P#RM&#Y9_27N_rjY>A_vxEPswctw^iAJ=`lgZT#RTuKw|w{4TShKo z^nKCbyDu7y611iFmliU&Eh`hDW^CMhav#AqR{tDAhur@lkF4Z8SpufE+ZoqtqjG7Aoc+L#hc% zI-XY{y~adO==&id{~BqKt00GrxhOS;-iH@cJ^vXckaHmcb1O>G4|aJmVP-SrC`h>3 zic(=E93#xg$N6}Uf*9sBPm1J5x(ifWra24pBE&K?Q7Zfnjj+G|&v4SsG-9&MXZ!LuZzv&Cr>pqs-8mrK8QznWbaQ(3zzeGjwKY zh#5MwbgX#*XOTd=kJR{noEiB9-<4BH)cAg!nGD%{F~+5aK!-t#kkQYf*%y2Uka`bmxPpp{> z8BL;MV$Dj(M{OK)f>{sgBvCOZm|c)ZQO}8{@g%oihk8yl6CqKk=Oi;7aw_UM$y@{Z z<9lu^&Rh?X?c7$J*$An`bHT}G8{|zq7o2QHJjJcA!1Wnn#zOAG^%-H#g$(?H+Zt(R zL&lP*^BQTELngLxOuShOxq?K+#G4(EOp~wkDP}L^MiLcsiW&bjACGBp%&BH7B$hEZQ(CuLPIt-~=3vP6Br!)SiG}E2 zsv2u1L-a3IjWyFC`WLT~O#a2IccuQtt0Z%tj=79?S&TD7XE?{1d5F=^U*pZj$?Ez9 zzjbQ7S&A5)v&@W6uBU`XVI{N8Qpl||o+_DRHhEGI(3$7? zX5bf9Dwug*U?xK@o5305MP|=Ijv2Cmzen*Rv+f_3-{-Srm~p)U$Z(sQl$-6=VbC3RC{aF}aX==2FNU$b7R2 z^4$bJuLWjCfTo=2-1qcJ7ewdS3#ijmF}DWxCWm>yFtxxe^rRr5zMIgZzb!C(Ax|vg zzHWip5UxrU1;+l!Z7nqG1@=v{gNg0iBsIG3P<_dv&Q9y4JSb3|(ux+Ly^(P0J zUk0+$mw{aC%Rq9?YVQbxGYqTDMu?taSY=A-U9rCT-s{Yv5Iw_iotX~NGYqTEEQp?A zSZ%I{EUcjUJi3N?W;NtGk_u1SAp;+yPgjv#Zytc0MDn~RX$~JxFYU&xCAq#7f!&&qUL!p@s(K8IU znUxSdUKE)<5Iw_iyV-UG*P~|`ip`oMS@h^|hglfKqDPrK&7lKX^muWXnGDhQV2QZ~ zqQ{H-%$GbV2sBe4{xQ8b)|uZx-lslX$$GOJa$F3}E|6?6?Ln%of*rNXR$G%jIz+^mh}m_nKdc$P|4nzh4O z^i0K5W%)jVP4{Cvvnj(6ZNa3=$}uUsi(1gPbK!y z|DHA@PiKjy`%Cq`Pn%02V`&~zjSf$nQAr#V)4(xRW*1}>38lw@Dl=jn$J}+3mUu{b z4zCVWndy+*25QNMjGM1Zl|Y(l-v!rP4OudYM+d5BJhydX-|<`rxtUs5XHjKVKn`4^ zOML*jfm-L7zaa6{I?FKip?7-S-@>ksDsvWO9kmrn^G#J|jVC-_{7cvH88a$bm1+#= z_u&g>hbIMc3cc$jjYcnbG9c%^6xu2X0w?IIUF&sm`hPAvXEn5H7g(| zL+Z>gP^$4(j@e?iL%xH&W_F>}Ajs=x>?A&(k&t@xVo&IMFK^*`-Y~NuyCH9yIVd#; z$NZLA1z8MfFuy~ofsn0cC*)+vHnRt%?nUcwoAGDz@l-(?&H0`b$*GWc%xp*|_w>&G>>!`y+ zADOw3e<2^6`6%@Y$smgP#H@pS1lex>hEh3@Pt606+aaHs#$;}NBegz+>iOJEhP(i2 zF;{p(pV5GPVXlE(4f)b6Myb^_*Az?jd}TI3?uN9Q`%p^#HnNKO+6+ultry9&A>Yt* z93RgU^iCK_G2fc0kk=t?=JhCb3FJGo5V8`o!z@Lqzw_zaW2m0*%_hj<1uX66zbI9M zm>*0zm5-+h@}n8$NrBu&rN&V`Kbh%}Ly!)$0Hq#->@-Utb&#LUGL%xYbE=+Q=5~mh zom0|jnyK8nnw?Yfix~+~vvW#*HDf#}kOn;GRVelP(eynzRL_319r7jQfH`nFAI}WP-{w%r0?0vMZv2lgH}3V# zO#bVenLOm1nf%W;Ga0Z#XA8ru(AmOpD|EI{SfR6ph7~$nXj-AOg_adMTWDLMvxU+M zoh@{%(Ah%QipLeJzKFgHgsyWxD;3f}GS`zji2mG7gtZ;=P&+^GL|B0t{90TzHY{){ zmFjOrLza`w_aqq-hMCC$)?CODn3)`46+>=$n0EvnW>rAekqit_4`?+)c3jM}myuQ* zVa%o#4$%& z5odAD?~@nfM8yoY${_Rib3M^k4di+f z6%%c>Lb|@>n4_$2i1ii69A!nH$H((w3&$L7B|vtPsCtgJG9Z_K$1%rPIgnK(D&`og z405f@#~fqTK<*$>F)>yv#KgG|vAQ8caPC8_XzxpA=oh%!xvgWZ1V|={s^?fM1JZ)) zbDWg}*^TRSoK*%n9OpjNs)39oQS}V9S|NKs=eCZwx*`2>?#Elvv-$db{w>E0vl1Y` zlBjxySs9SW(bjM)2U3r=hFfKjt^2s1SgQu|HHoSx)@p^k_XWqCV0A-&AW<$ct4+P zbwd*Iem>cXKA(@LSI>uA36McF)2`|nVP!z_(bh;S2l5Eo8fle5{>0v%c&i2yf%i|m z)djhkc2%kUNT*oFTyFhg64llzRy?HW2R`>xtyD-QiHbSZ%7*+wcY&(sG^-HOzm;Q7 zv#KFa;{Hmo8X@oC{z|aAAZPu>^^CHN3;1}Jk*KytS@94(hd-q4V=&t$M`h`S~O(bbda`YVl%%dm+YIzPWCz3o(6j-Ii~z z+cGXvXBzxYl?j$_uG@-1jGpmGwtRElR-zXZobi}wl~19HsmJb{>$cK4rfL*OCfs3W3sg#qGvp&SgjB}<1y8$zJ_bodzMnIp{pSD zmQ%l6Jk3hVXVG)!)2*~Z7CkF6!%DxOMgQtkniY6}MbDF*W#vA}qMt_3wt66XR^&V@ z{wXgeES@shYiRVGWi>+nzLjORmG(5p2*@0(5|TpCO{&!SR$>*$t zs}u55KJ7Flxzvh(o=bg38GZ#xrd18uO=qg)GOOYRj_IbFm0WJczsT|{<0!HCD4p zw+EfO`2hW9DYcbj#o8=|Xltc4v_DHOeFRC>bFI~K1k0XnwEu@n0zuxLSf#sf*u)xpM*7a7# zNh~9?>6=HJFGNF7jlU^t$7f4569eT zl|o)x#7_ZtSyhlml7UpuT~-?;ZaN=NiPZy1CQ-*zVkMly#}oG(AJ5%Z8e|%YI-a|& zJjjF8y2=6Wu}UE?<9P0|8XyCZ+uUolLPnCPdhWI4soYjJ_7#*`Lm|b;e@d-co&?9- z`>Ya<=^H`rvr-bgdOT6zyl|gYJ6cI_Oj&1@jAPL~|NU0_cnBTL3-r(RRv|?9{0~?) z5Z&`{u<|BxDc#RMXvq{7JrH#Rx4Q#TOp2hOhSpjcdZRP{`NJWt|!k_u@&J}huJ$s^XKkYo@7DPD$KDYk6JfE zt|E!`q!6<8JetKKsjwb~w2++UNhM^(Z0Z3>9`#9d`Ay~Mk!fvfUap0$c0(KJ@RMm1MkiI;LrA!1&zDjy_StR#qwnAfaSPYPri&3)ZS^}KGafxHB%w_Zf4`H(lPddQ8CH?7c>*|)6F zmDvX0tkG8AtkE{#tkK)PS))eZtkFBZS)+G-vqtavW{sMBvqtaxW{p0unsBD-Hy3W9 z>+_-24pG0kQ0z(EJig9)4|%hd0?{kH%~m!Vp$Qzb-I@idCQ&iltz3w@2QN8_KFMa4K-4{W z4aIzFH9*$UovZqv&#YF+6C`R(`OGpFaO>Na^SJZ56$9BpqGCR`Dj**Y4h!5%SFFWq zfn0Y!muj)PAa|0eQY}{ULazA%$~O{;zOd#(o+Y8%f}|MoQz;+emsSPjAc?ByOREj? zMIOg|W%WRQAyF}3SqWL())T3GJgrt5q>e^VXXYtDuw9p7HhMrAo{z-+N>7HxQpob z(dasVXLUi&CwbVD?8SUMuid~`V~14;X(3T(y2EOK%tJ2mz10f25xK+|axf(GYRtDrg#B^B2keiT4?X)T&rO2apTHTO0r}26HY{_NZ*5@SZynePa zJqhM5yR0%#f^!ACta^yvpRmi?j(YU$!7ktI0f`qAeCqG?J@t25fh*PVyesun|1Z9$ z{$H$U#OPfXzxtl~f3*^HJ(Kw}yt{o*{kyF+FDCfZ-{pJi@3Q7`Okd9So0YR%9bqs- z`_1aTjzvH9|86C&X30gS}SNEncax88mu6L-MZ`d8?A5Kpw5*tEZboR^tDNdeLsT|6Yyj<_w<;i0uIA^a|EzXMHuc8uP*xeRV+*;huxNgE2-rFQBO|D%2(z$$T3UrXL_*7r6r;qoqaWrN_ZhCapPdf5eKGYmbngA^EXY+fFQFvDUIS^S z`G&Vh`r9>-zz1BB)8vL}i2fJV|*}UHRbW zyGPg=5SwqqeWLmO>pLv)6Ax?Kp-8QSS~GeqZOiFOA>=VOU>-SK*BdO|}g+%+vk#CCNZfk{}m-#5wI0dlqCli5fkp*d>sr6&y3wu7rF?qGG1n z?U2WR=R7mjJ^*=(MCF;Oc3c&={wQUqYJO~*odS6S`RX(~$CF@wINh%HB$yvgx3@!d zemLFkKs`D?oNjkcrY7l3^>@Wgw|l*qV178m4qX+RVMjfqjxd-XrrC{NJ;6^vq}lO^ z(fQ$7cIc|mS$3+f2l?UIcIc|m*>b8R>!RK!wc<SsU7#GSIWx|hm&O5Id3Tm=7*QrHUA^(-FumR0HX85%k9VpE~WFs%k4Ob&JQoQ zmqK)Yc!gcIvq4^X)&jvFO}yp&fWzNig?YWS4mo%>5SGJ)Q(}zeRS# zJE~McK<9po>_9Wicw~c%?0FxtbiBY>(;~YAG9P)}BD?!@j#0Uv8ig0xwJj`fA=6uI z%P&}TUbn~e_8{ghm3*F#k9H;UvcyBnf& zzvXt^m)yF}{g&JFSY#8;OirLu%k45q3*>71BTtIt6Oe1{R>=QBa(ubg3SX|Z(hmJ3 z>9uy~CrNYd&`*-CvO_;fdYvz4TkXr)@_ael^}d|#24Bv0qc3M$eVTdIv=~mPJ!rr>=ru*Qgl9zC-i#VY8OM+lcaf4 z1<7B^qfDXQ0J(=m-KT|iFJ#$19zkxiqguK3n@H3sbDNzCx%Lpp6xo@OViFZoWS2lv zPvp__cDoX?H<`Z=?RL8!5=i-D4Zy@T;T0P2yhP7MH)(~F$P&mC_P3B@ALf`R z?S2Qi)H@HcJZ&dKK7WJd8M_)Xa!Qz2^K*90-&`smrJlD-ATOqH%>UWFkoQo}i+27& zE;R)8ylfl)u&h8mo9$vqCF*(Aj_6e}!S$vszP@*hukU@$*Z02e>wD{ceeWB-zV}UE zfB2TKKWy;zhg*I9;WoSBUv(C=Dt#fnzv$I@+ir#2N3zkA*h3sMZWPagHrmOMb4gS` z)@bKIR$~SH9lIEE8&<&IvFjlt@QL_$?H0&Hd?Nl`JN7?rt9L8+neW-jkO8!>K(+Or zT?Scn79UTOT?5G_Q87(+8)O~bJHx5U_w63YCX#^^^S)gcFzNq`q<%vDz^;MlC&Ulz zHi-V-)DP_*i2mNx5AC60s-9pk+H7Zf66{5r?L3I?MVsvsPlCN@v#%Fzwkr{%d(n@4 zz34}F9b$AZ`mwJU{n&2yV(2LVJ=-U~p6wI61NG>hZM&~$+iv%AOkdCTsa+qg&OMmD ze`-&WEV@Vf%%1B>@OuJ3w_6+)QxIsOSx1Zh^|>AAvb=bLmOww2$1kO9h@S2~w=-B| z-jG0`g5H^5+NF>?AYa+| zavh1f2Y<24AmVMV=U2N1as-L0=U2M}vXA~-J!S8MftbB^F62d8303Q-J$4D?Z4ydZNg5%!dHh=Jv)drIlBjFA&yGBt z+lox(>-?7;2N_DDV*aw{Lgd$cJp1iz$Y2t6%=_(fNY?3G&jGs@l1HNIIbe4}q9gdV z_}dN~!L5%ZQT6<7CqTB*l~=FDK|2ld1zwATb}nQc&g&n$1o9Nl>mR!Tl7RE-wOb+6 za9+K3#F5QAbEWcLSM|#qTIX&VpP)qTW&TMRXALDH8RrGi4=2 zeTqcIn6e$>EZ`VR9)KK4qGBvrF^F3~Y<3v^dNwUv$vVgo67}&=TXsO&e&F+xvKO+O zM4gwE@q@XZw6XjScVsH$5)yS)9hnEwzk2D)Qi%T5OIJ2}5*+dS$w0KKIXL3?ld%vz z;`ftDo)k*`4AM{XJX>M#*Bs<5FD953M99#2zX-V$F*+;gFGHWL`pY$l(OJO&8TxEB zK$dzj!K~mg89JwTn5;rQIxC2jp>ukXvVmjzvVy~9;xXRU=zHEdT-KlBN!b1v`sM+8 zuO1;gJqcz7N6O|?RZM~0xQg~YQOuFjIF03bNR%AsNs-Ki43w#m9LOL!3#Fn@q8&_B z&tO>$83~D&Z=lqU6FKH6*#!9$ao=QlpJj;_Jc_!op zITw-vIZ=kL$DJfY*W==3=z84AGITv|gbZDe8!1EAKnhaf! zOOT=Kaie7DdfaF^4`-@#q|;>{MCVAS%W8<8+ews-5S=3>${vVbYa1gYMyu;wBp+($ zo@9(nhGd)*2yCO*{R}x5vY4dFlVZq)H*jw=R#rfkkf`2ftZaikdn3mr$sWk-Bq}CJ zCZ5i%7vIM*<77HyBZ-O`CyOEPEamZHysUtHMWSNH%brB8XVinVFN}_Gf=nI5GKJ&| zPf8$D=WtJ(EGr>%NmNgpEVo1EALO2PqU?mMAW=Q-L>YYs*W7_!)01QZq!+uUC&_t` zhX?Rzb*9XNyiB6%Ia5|aF2s(Y6xje-jvdG;vKvw!$@NT@axAz0GKs2ZvP^;$cknS! zk+UF=lc<;}G9OakkL#H#%OGEpsF#)uaD?yR$AlCEbm?<_jUH_DtNXL&Kf zm7{duD3dOia!lVSGgHb5>Ij3+o-?JJ!lGA>&Xpq|dgbUmIUAx^j%LX#A$sL#wk(0@ zm7_Uw{ba6L&)1zVv!}4=`MS9>ekzNeox4CTO+~52JcD*~F%Neqa zCG2(@L4Kt7#>KJ`V$=Bb3&|z28*&0-E|oFUy?Vly(|Dm`GG&@4Z;M>&`ITHIb3G{v zypkOj=q9;bZimdH9$-Jo6*6*$s;3~Z8fz}|WXFXpJ856{A&QwNmtMs3-bUIZb2)t$ zMkdc^soNF^sLy&VlR5t*>hmC1$p#kr&E2$@gi0-!2Ov8kSIbitsCtTI9poCB1bG{h z;~T$L_{Oi5(znJTeQO-jx5goTYaG6DaJ6q7%=3+d*Zao78+_y7jlOYkjc**h$u|zJ z^^Jo!`^Le1nTjj6n3CtAbe#)iCgd8D6Fn)0Tu-~eP9eEPRzQkLPWPl4(m98pPj8hS zkbNWr>2 zFOsN!wMe!>49p+iE_)zHVE*uS8Joq&b0MC9ie)ln5uSjGWws~5?EMZ|xoy~Eej z-XR;jm|*{Wr|f{}zV}Xfz>{G1ey6YRy;DXm;v>}A`(3{5{Vo}c7@fVB__FsBndHR; zS4Qsk_2GBRS%}dqBlr0F@O$J^#OOZ!USA)6ugur=pbszg_2H$m%!>*3;rIFa@cU#9 z$Mp5#>ty3nbv1&0_&OPv!=iiI`(@M$7TwdXmpPCn=vN<*H4xqRZjdjn%=yp7r%?&-r?`YG2Rxysu|_!Pm3>pRZ@D@%3yk`g*pPWH+vu>e*(~ z6?<9A)#}O@N!7DmHmqca4wK5-~XD>I)GKikN+$>uldIs+m*#*%v zc(2H~JZ@dj;JqqSAbJMxRhbRBbT9X8b+Qn0Es5&c>SQfM&+=`N%@94yw?+0szTeLE zye6Zr=hnMOR6VcBRLHpN`AOk*nF%?IM4kKVvJ^6a{#(ta*2^kLEQzY8UbaH?oXi`t z8=~iA-jHcGaO-+b=1n;dqUU7ZlqC>7C-au9gy=b$w`7Ya!QQw*M&77u4)(MSG9IFP z+6I~8NwBAF@b$C}G6ONXr`_u7X}8L3#OR)Oo3E$cCiA_RU{CwDucv)mmLW#>w2i)= zwo%p~M)$Pu_rt>)Af_^=zN{dbZDfJzI;fXZym}vwi97*}n4iY^}bY?Q37p_KmM+`_|X9 zwfTCs?|ePm4qwmqy{yL-Q+tWC>58?>7KqwQJaMv;z#ZzfD3U*3%RSo=tsNV+Rurc#d62-$mlSYV4M2Ot*3yyZ!}s*d`oKd?sTIH{0- zu}0=Ng^*Wi_EN11xlTExiG&h4k~YZlc<$@^IX#fuNK`-8&xwDK+ZqtgnM{O}3K>SC zGMNY`7xMa#oHg}#N+8=wR7`)T9UY+}5NBZtE~7266$3s^>5# z9dbv1j)`=#Adix$m`Gy8RDct^v?VtPCiQMZ>T=jsf6gU=~$-@rS!OS ztP{G5cdXNl7(MPB=Y+1}9p|)rF~M5`-p}+p(}>NofI!7n4QKtp(}>5P6o&HjXNhe<&S#Txi33C!O5**(NFXz zIyo=0=%@aZoF^c9HZ{(v^CY;cc(T(}t4b9GR?v(78NGi_c6v6m+>^*p^dp?ySCkY4 z>fY2+2hn>bM>zR!c`@>lW9d`TRL=;f4)QW&r1P66Me=e;ymJ6@E#wr(XyAHA4h;l$ zQaz_S$&jg#)0`EaP^L$pV^uK;&Kk%;$S5at6>qc?x{7zY6FLi;=!DLKj&VX~LCb-)p zispaRu8&DhJfxmP^;(mhHpmtl_0-*crqcs?k3`+wXF9RlxSqSQl9l2lLmtLTR*I7i z`Qa4qAtyV9kUvONTa%p{$Q78GoZ>V=R$^vyigN%Gy@Zc>suTG(w|*Lls%NUx0Qnm$ zeW^|>F2!oW|}h zdXLR;>LIU;3iHP08BPo20}?eZ&u{|osJ4Pn>uFB1C&4^C&B=i1zAnwl_9WP6ra7Uz z8q%CX#OVI;EMI?kmQ#ip-5;Lq>krR%s=b)tu7-1bebhNlBkIw)ak{UMN_W~grmv5h z>GZs-&OMkL&vXhuV9}o*I@jrdoP0E|_?+jYe(1%7-9lq)1LH2H*eeMqgV zA4a>-34e~|JIF=8o+QK9lU(eC?gzNU3EdBHsjrvF^z{;#`Fe@VeZ9mLPCd>-ufNZ8 zS|AU#^PM}-F+Nh)r%38Oiu0Wqh~A?(-^qZ~;CXq0lLOg?=j8=XE#$mhzEc)D&5%VT z>P}hcM1IU|jktmHpDZU1GM+@mWI0)o_(wQqk+TLegG9wFa_S(1&f}QH&UVNM5*4%9 zN&SS|lC;jIdbTA_Cgd0r)k`dK>L3@Po~6!qNH*$O>ZESxder)|P4Ay&PM#;hJ9n8= z>q+p=UFNhx^qsrR=|VlPR&xHc%qgs;gP<$FjpSVFSC=`)r`(oaalX=bcVFqmcrn2& zzvIH zoyn|rwnOx~aGsO?qgN^{i|+3J^qOAp%t9AZHI~}3|vR~s`_SzHBMkB z%L%zGYn|qwS-$;0mV75_7t0jH+~UmL%~Fke3Y|7jg5ObAqQ^*^`d3IUUZ|g9%rg%6o=9EdB~}Ts2RmLPud~H?VKY$ z>>PmTp7voU?k~RbGq97V+)06CVJAom$8w5_MjcPAB9}%FtBL|D+Q*$Te>wQ9b{YPCR4|K9l~GlM1;SpGkkp$%V|^ z#jnNFP6^~n67^a(AmT`xz$=@*1A9pK-DvPh+j^ zS!WI8Rjjo=>(oKc-Ob1IoUmfh=#>exbQw=#tqK@Z9rw#Ho?v$6D9>||K)0dpsLwr2nWB%u5CmHe= z=6_yxvLXLrKC0F!gbc>qPOVexNpQs9>~wn)9Pu|hk^iZ-8l@ibH#@PO1atMxzR`TM zlkCL=NAp*Fqxmb&T*T-(hgW@b4zD`dh|zQ1b-p==I;T+AGnw~~ZSiFVTbyz)COGHt znlCGO&8g*>zO3MNCpz3x=iWEx@Vb+H42#YR>YZwc&I;aeIv_eLc+-iB;Ziy)c*{wJ z=&Yc@i5to>`WpkbI&&d92iWEmYN5A^`kvCaorvSPl-~K!=p;k*caXm0BoF5pon5@^ z`~uOr#Cwhr>&1lapwV*z-8)TA0;HP8!6_u~JDHvo1bSxh*!_W14#^`qi()=-N={Ps z6a;F{3k%F5`Ot|U!6KK11-?9vRs)?v$hT+Hw{B9*$4+8A$NUNT%;`LZMXexYQOuW4 z#A%+$?}rBhD@eX}QX$=tZ=CBrp}FPbIp$lZ5E2;1(&n4-_|7-uvBNjx@x5=xqun>+ z|KJ<(fAo#`Klw)d4&R8s(>LP(>>KfS`9}Os--!Q)*nvJC~iyj>bKDmb~}|2{arfUPCZ0_mrl3S2}xPUXYr>K7|r#} zCQ&v2=_Eq*4&*&fIz;b4-s7x+=pD#=o%ImC19`902$}N}_v$@P8{{ey)vNb75vOzO z-~Y=o`bPj6HYQIwpd51*B>~}gKzhgW- z;PgWJBOg29#3%Cc{PiQZ^|zA>8H8j0+sTEz{|m<)bV?wdB&w~0PCeu%oYy~23*=Fp z*FTOihTBTVG50z#kmWe$UMC%*cSQf|WI^cd+uNMfn38nOUf#G&S^tf!ey(p#U#|$@g zy})oIlla{A{Fv#6t{0eYtQQj;yDc|#y})vl5u?X$+YMbWu-&jjQm=*0xbZr2T6FCgKVzOlQX+b~|8X>jcB=f+KA(c@r*8#{w#$zq<1>+jBl z=#g=NyA-0IvJZ1BSiJM8j}+-Pdr}lAyNu^#4tFEyXCTx#xH*l-%ER4s$YV5C zuA@?iySZm`%wyR+G9KYJL%ye;b|b|c={BWv%=nAx+o?$gx%D$yzNcsE=Shxo*Pf>& z_&ozLZj~nm^8Uerz!r*$aoZtJL58>kXQ@*3TXm3Q-Jy_d$Z>Ay3c^q~bOqsfcO**P zHI(NMhq-4!Dj>t%(7C}_H*{|B1UK}__e3}J$@e5Tbd@2_4P9k8*$rKhAK`|s$d7bW zafBPs4g?zL`oz1LkS9pq^`sP%jVH2G+$u;up2$vdJ0J(o|@CO{gcyO@zFTdXn61 z$bOf5<8f{wWI#XejmNpQkc~Lz@oqEZ1swBuw-?gU!N)wojkyxSok_C8UEy)icp;fviP6liV&y8S0tj#$3p)@5Q;F=_W!BLp^7@ z*^qnite4^zLY~0hgA}*cli)}++3ofu_^dbCjkrj)6@1p4><;xLI5tgoL)T>{yGdS5 za4*&r_dLj2$}ZHIPI2c!^yi7D`o@&0ZXROvc#-NGFH+r7#ON8|X}tgTR`=0e?xK)?3=y}>ScWEZeJq7&yb(XsgqMzE%cE5(`G36Y$ z8={{X(_QB>t|xafk2^EnVG#Yyc&ji;|={z=_??x|Ud373nlRA|;-%ZPAnO;ik%On@OS<6{2n!+)c zxgFQAESekUm0IYgtYBHPl~%H-)H3(hl}dtR)75T;C&72i)ovX`zgw<$J3T3qCI9ig zbB#+sA4B!fH=B{Dchog*0_5m7x$n(!(;%mjs0=^H&4t{6m=$gbq!ckL+&W0&!(7iw zcROSziK=I%+Y9;TA&$A$jmqWY*+ZgYu60u&L-+GB=eik?u_Wr4bKPRdrC)N)Dz^fX zOQK>{x!WP1AK;kl+)l`^Br4`QH+mJfe#TcEv)WC7oJXQ!R=e{c51vC$QuF9}&&`8W zlS~<)q!RMaz1+`V@76;i=yg~9{Pk`pWZP2S33h`^Khr~hp_Mg~a+7{H$4!7-yO3ul zZ*35)eZqA;X}#ne<17OR%RB3Yy+OJOK2 ztxT3yN~2*ICeiwVVhHiBe4p2KJ)Y;}b-sUm{&?Sb-#xGEI_Em)dYaBbv@+KNIfJM zGCLCcX2_gK?3*EvMPlC!c{~#PX2=tPxnD_O?l(6Qcrp?RJQ)eh59bBuhffFQhw}sT z!)F5X!_vU~a6zOAy}@sxJR3O(;kQtpjU+xIj*kB=o#!HH5Pr(=TqGC5-$`B=DTMHM zk{3qGA$#voYaq`@sv%;mq+5|_-Or-WM`C~Z`+Ou*#`t%diz1^T zd>6SWQUu|<$VHJ-DKo-+7r7{K7r7`>ff&AvTpYNITpX#9G5%d-S>TFa7HLEb-$lL< zxQl!t(t;SC6)XwN3YJ8|(^YTqtl-7Ktl-5+qKxrp1?7QRL3xC_G*lRxoA^YS{st61 z;92U)c#;JqFGbQ+Jzh>&9?6*@TK99p^2p}dO8C0`a-ARc^7$Z4n5!e4EDEt2|}sAoo~@15$4^shwFq?%ukEQjo%J5BLb z|2HE0AwQFd@7TW)Nqt<^^BJ9oB4$OT0OFwL6_GkA(?VZ9NN>u;)6SrXML{cCrBw~Dh5*ZD-u}RhQX=Ey-fJD^u zX`}*j(^$354Ut;NJtShA8zL!)M=@UuuNguh<(c_a(MU$6Q+G8OXC zt?C){7m<08oh0HJ^cRsD$Zz}9HaA8ZA@P_sHAccOsn!$jS2NfzBZ-hC60z@JMzSFM z-2AJ^Xb4}?zKYC)+=3a}*O3ayy=d#}NE2l3ZEBmFA_pP-+`K8$ZJF90es2CvBoo5V z&A*9Eh48P3c0}eu_}4=_A_JF;di<-*w~-u3TdZb$8!3_E&+B$ZRzUcww=+^J#lO$p z8Mx2g8EHZcUm3p(Tp7QMv>=ABjNb>YjNeD%Usl`9SF2rttJSVZCmG{kt(pT@tL8|m zit(;QyCb!)h?@N?(eB8oRZ95%!#$C52)}>0H?m)e{Qb_&IrLq=NQX*M%D-p)A#zxX z`juZU#rzOST`gj!g+=zB!SQU6A^Kwd_U`ZsbAqB&~CETrjc zRH;)*M6L^I>5zE5OB|;S;~2b49H&)6R)+B$M5}{*L?Y^GrFE-PHMd7hYb_IUK4MyH z<&dip6R%Z6?m2Tx%PE%qslp*6@DKO>o1 z>{A$1+pl80jAUuK@5o;DR@E$R%0?wTH@3Ao5S|-5+Q3>FBQw%eI$o|;AZ1$Uk^yR7 z7uANnFJh*Jy0xOOj8IHetAtz#IYCR>qGCovPST1Xhgz#rr)r_CD&`KF&x(3Z*NP!c zDAh%a|3JkYfOOU7K+Yg3p;Fzo!;p!PRIPNIDixucMNDtau2V7kSUNs+CfNb3KgY>Xhk2XQn`?8wSACY?NrPtZNzpJv+MG>&|)fevu4*T zx$Aklw;;Jq3x6zRM)*8hxTq$%Q%i(okh~`)6Y}x}Do5pMqaf8JB1h$E#Srnvub69% z)5;*?nWl&tr`2)H9co4BF0GkkNW_ZJU0Tv7YI`ouQ!#gI>5wZ)M9kgVR7f0FpYpYN z5DTkM`C1iZQl^^w-J{h*W|D~Qxkoz)>AIZWcFCc2KTZEswVqD0T}le%hivs+c!D+% z@)wDCE<8cYgLJ`stUxP*^dS-Xut2MT@Gr~m)oLO9%d&g5{SY4A6SepTwLLr0)%bWQo3`e%xk^MxmilyazCnfxA2YMJ!GD|Ckv^`PDquPg3W`tKFX13M{*$kPZ#XiA&OpASj z`M4Il()ENEyV6yn#jbSC)nZq=p44KWaz3TSKINRJ#XjYHT8n+kIbVx?%K3~I`;@a( zi+#$uK#P6K`K;EA-l$Dezi@m`I}EuJ?=e27C44WBSNI0J$M~F<28p|do>5cJFVwOj zQIZp+6hJD5(qDEad0v|XSx=HAWd&sQ29*I8Xw7!C0ad%?{1c8p=Qy# zzpD147Q3qUqSgU1JSxir*W7X~MaKBEi=|qg6n}QHR4az?>|&|5P>MghSQ?mJEY&Iz z!?TN*0<(*kv@M9?*~PNJ>|&YLBxC&9#qz-HV!3t@F+6j4IWTj0S<`o`9^-qNR{}GK zSF|J<F-u5^yQre#Z+Ay@sye|uf4 z{6YMa{wn%1HBWe5(|=U5z>}$vynEG((CgYfNS}^sUF-EgPFNAh2`d9R;mtr!SQW@W zm4W=TI*>Qs3gnG7ft*kk$O&r$IbmHOC%mmC{3Lo~M!44)mFKIqZjj4JM4qqKMnFEe zO#RC59W5WyL_z~R^p3U=G8HlFwMxk2h*_`gg!H3#K|iBX?`nr2*OG_~@UE7$Uv1BE zXQ`MPEgf52 zo297r1R>kCJcw9N5KugzSoi=Uy_J% z`n{G9xee4+1gvlD(rO_)FjsHZnji--S8vuj{HfY{hE^TLtYEj60(qH4jQ8DI z4&<@p)a+u9HW^YzB4YMv%OPtpyV$GMK(=9au~%z>@RyGEY2m+A>-?poeOfAn*D8O| zvLL)x`GZy|#m_B2YAsUy-14KQ9}+eDZ{Yl>B}(yU1wRI|#E)7UVmM3u6vz@kX<3Nj zEU`b3CH8AMGRDsm2Lf5*fHoO1oF#q^WQm`(612rx;+H^{_(fZ;V!SNTqJ{pE`|hn3 zv}lKpD&f`3U$yLimGJ82Z`v{luP6MjRV$IJ2LouN9Mtwn@z*o|&wxzKoucQO~#0vmoD+ z43#n&!gtVZ^%4l*LATYbA$$kjPH%wl9dtWAzO`z782y?_WPq^V2{IPHZwl*Kkjx9! zU${F?9}O8wBL2eNae9dqe^f^FIw}6BjOhCzf0e7>I7jsOc+tB5Y(1iPg7ADkqNhml zpQK0h*paWNSC+QO*(TiD1rOXH?^`R$* zbRM3hzY6I=vWU)xlk_Sj-ZppA6LnGZjIfnK-?XMuo%C$TDI{a06e#gZovc52jEI<% z^%5zyAv-rNw2s<3MPC7#LT_=uPjafBWXQI>dJ^>%DVxK!8`U)~Q6B**>&a568q`zw9@o3-~B^UDP5|%WP~W7kZ53 z96jucZJrxOz}!pL$+gFr0ETiXT6yHkON*!{0VBC2YcJx2~z5{l?vhUm8Oq^@c5!_hV1a# zngi+T?L|4{9IxhT2xq@Ey&1yUFHP4ws4e7Nm!_veIM>nkKn@{qr0GSFSCBW-^a{u| z-o7^|@iJtZeh@L7vD5TUC#u#tk5TIo&SPnM7KHOynm!uBc`Qwz3gJAKrq6?L9-}RU zoah~kTF7Xx$C@C$k?UxiA%|%Wpw7BZ9o07T^&(AAhxEUkV@5-+_m3B3zt>}xkdj2t2r4`_8!L!gq-NLl?$o!+A4+=cx^3*LkzF2Ly*cP+*V>I zwLPP~ng>GKdo|}n_!^g{7en|Om!_9N_!^g{S3&q1m!{V%@vi1+dW#hQDw7tt%B1P> zC#x;gkEic&QvT_!hfWnT!^>>F^)xB9A&WA$m^Jm*!-*oMHuMC&7q^Y1kKPHA=Bjnk zzWQLus{U#o)mJZoa5nC%r*;cOi33Z(?UaUP%F0==^4pNKBTi(Y)^(h>}(~y z`zz_E=XMjaIkYE>-YcXY%habr&bp2MuHZ%Vg*1IicU7uYp{jYHJ`2(Ta)n+BS@MvI z$q(H_ zw7Bsg9kWqh%wp<8Avfyt5K}Q$Nsd0OhpML=of|gw%PsoyUP?}}=$aEpU%1lmy+DY6 zM%|{DOY!^gHoXeMeK{63ta*GTdEaE9Ih;Xa(H@48gg!+rRu{u_k*aE=}~K*ew$KCask z?!yxOR0#Lsllr+3?!$Tdg%Iw;`Fa+F`><3W3E@6`R=)$neYj9Bfp8x#@?y9T%k)l{ zscq&yT%splu7vxrT<3IrTBfgOg{wSK3uLRT&?OEbCMbB&<3Qfu`1>qN}7PzBu&iv6kz)U#Gkxc6V5vG6Lq}M^jTK60D-!|zvx5=2$ z@AMw^`&4R^z8dl&%`@9l%=>!1lxd+?Fb3b(^)aH>ir%iF zE7~@_5z>>Suar=(imAI=#nkB?Am5OPm^wWJ(&NIo&}k+;UD8KD`jd2_m=E=blz4Nb zkMs(}Z0}8H0&UqxdM%`p)Zun%Q`&-98r zW$U49?^bij&-JQtN-n;DWzJn{3zsITb&1dQa>z=O_Ov~p>kW|At<<|KU+DWG?~#aE z$`^XV-Kw7cv@PP-?u~jkNH&RxY1D^7a_NE84|FWP)bk*dNq&)10^wu&mA;%~a7@3_ z>mYn?e62S__}uuK7Gc%)ocWVFI!$^Kqz{RB-qfULLH2y3V!qKwL;fKVG2iHOAoG7! zF+22f$jc-mW`|w}8St%&`Bra+Tt^~ezSZ@6!nn+sHnEzgHJKnEZjP6}>ZKpMI_;YlGST@Hs(RDIHrFJ7` zbKDmsF3Da`J|syb`6*D(elJGU(}iMw_C(avoutJRuIFH&oMu`3J(rUF z?FrX&Bv8*$FGkceluCsR`d_GZNbT21l2)E@J#CH7$Mo3k6w}Vgl(HwTknXl7B+&B< zqZATeM{hM!OxS2pa$JX@DknsYgOCYb)Yyp_;R)hc>^W{6nC_?3SGlMj-8d}eySU>ahS9A+wiUM{Pt|N1qacH> zi3?H1AB z*{~<6nuk!z5=Zb9BN;N1MD))oMk*wduAXF_YGgqYNW_z@Q;j(g9^HvXIfO@dqEQFo z9M#!qhH#GRY$Q)s+cUvbYdfbI8IYMIBDb7o6hSygoo+0IaE?0N*a?|vt9p`*Ly%b{ zqMjrp{XW&!sAiSN&M<~S#*>JcGmKJ5iKgl~(^vs{iA2PlX&i*`7dg5Z`V>_&f03h$ zkqzOmWF#B85dKO=vQeSLn-!d8jJjXeBSnndvkZNzl+ZoB)H?s!Mh7J_uh!G{bTv{S ze0At*jDSo^R%5xFkq?1zt~))9QplYo;=0qrD2Jre_Pa)+hKOtUp{?# zk+#0C@fTzuiMS){YlI3_|L|U<8(|3VMY`cYIJaDAoCx9Ea-ne=WYa`?+m81ABI9hx zrzD%D^x%3XshEq6zK{+iBIaTv6H<9?T&RvD!^ncvkbExX8pu_{<3it&Tw>e+8AY;R zN^H;fGje6j=Hp(cE76qR^vxNg5K>JtlX|0{F$Z!aUwt2`zflfpbB|j4>Thg;JWkJQ z#r!$b*a;~m5o0IQI1Cv}zh4$Hml^}7$$s|EgiDP(0#c|XT(gjV*)T$sDu!$)xr(mM zml|^+i%1U9o(?b;K;9rZB4r8WT)M`!zLoywg7FF@gT#4xe#z2U1p4y(P zi~`8v4eAc)YGV$>d{5m0U2W7r__~~JG(z~goNa`PRO=gGrngyW3kMq=AYYISm68tO zZ&400hC%pSltYZkkd=7LeW+0ac^7ZF4>hVFd(Tq)HO#1o{6ix8d6;n+@;E)M5c__O zkuY6t;UW?dbB&P(x$Jv&br^1BLxz)xtHW@kR7t3T&V;rk*BUL5m2}*dRL_t#d*}1D za!xCr`JPXs;CkA3Urr$zO)}Dp=}&Sy$tX__kD_1LkmPtWw?BQ!hU8{X7T+8fdX=*F zEk^!KwO?~7C)`glw;08cMILlqr9#d0Z6C20w;CBzriHrD*m{ym z-D;%F5;1$?#Ba?+%orn6N^R(Vn$s$otVG7Nmodwv_$yRn1J{eO##R~gNN6P;hy~Qv zSmR46{5+0dT&vwhddGYjO$6JdBXKf57aZmixKtIQK@22L_G~8 zk9xxOJRYd$2`@&}^F5WC>xro6N0O&J;d-7i-aV$r4pB_0(JaNk_grA4JuZ56PaNNS zE-(s|c=w*q8S@}~@A;gu9K!dW&l%OIhwnX~GY&~n_n!8(^zOSc>Iv1>fEqR8o;UKO z%n0$l=krFH6#w3Hkx`FQeDAq9aPL`Wgi2)1-o57%BLTwqo=c2mC2@T3xx~0hin{j{ z{qv%6H)8nSv)m|DG4kH?Uy503ltaWks_kfcU&N@F;@^8NH(DTk@A+Ir2%g;bLyNSOoSyV}={atPnmzHV%R zJW2B(@oT|1jGd50BqGz8h zD~)*&zB_)?sDSX@@ta0Hgs;M@jC~Nk3a>Kkd1`z3?zqxOhVb2SrI8BZ8SH8!3&Jzl z)kZ!f`zbXmc*`h;Tu(wNG4z&E0pUC7HAXFj@1WNh`ysClP*>q9BmQZ%g&RmjJyk|B zB>NrJ)>U{pi4XQ*>^o6!K-Mcgh$-xhQ3I(&Li$~BLl)CS=zMGBK=|lfU?%DatZ2p{F$#wZ9MyJMN$oXiAiV0h*VqTir}uwE zCfR3%%2n(4k%&yP&q#sr%H$8mKnSl){$R|3@XF+mMmdC6CVw;U3?8&Y|nlp9kPZ*Y|nlp55lXL2aF;JuU;N7sv*33`Lodg;nmBZjqppV zEndC+#Ylwk>g6xSFbJ<+witO3UcGEF${@UY`KwU{;nmAujarCUy}X6;;crG0M66!s zO4+Bx8&T_RE)H=6ojF>{j40exe$=nwbZAfJBTG z&D;k${E>>$&CqMA9(TKn(aj`CJG5n(>5vX2qMr@35RyZ0@;pF$YMP~x3s%#rf|M1I zD@bNZX@JyMsu;`M57|W`Vl2~sU2V^B#MovsWGrHAGYc{uF^)MJQi>SIEQa(TDWRHO zvka0!GG9t9M7&cWwmE7xLC(N7N6pY1YJ2!>NiaJ=_-siqvy^yeOMA0Pjiz$n9X}L3rezXucqYem#V7+R?0l@W?&Mtb*_v)yb@f@EO&~?DVGEW*!A6 zo2d{U1t*)MAbedu#VmmEb@>#t62fxt~S#k{LJoZa}anQQ7*9k!Cy?ZN!u8~tmfCljTh5@Eab`Cu{<`s9 zW+8;vjqft6m3ZsM`DPPjLKl^L^UW3ruN&u^@#{oC@A2MQ$~QBlsCDD6)cQSUJz@sb zsCDDbK&6e7TTqIx?}cVPgs<;~W)q|z{eDGUo2HouA;U?;^=q2hVZGWOUU7ZcOoZ@?>%-<* z5bI6#9gj!M^B|{@&?O`Eh}j2nBR$>~nXSm|2gxH5nXSmY64HU*M(9a0-5d%zheW)o zJKY?mM4n^f>Dvr54>976g-fV^W|##K(PN^YX9ULJO!I-5QZvozF{Ne(N)?-r$CN5I z=f{*P4wRaOk>clG7B${4qivq;jV3X^t|ocR6CPi41NA)V#fWiw1C^TRiKyo`lKGx+ zJ3xu0aQCtS~q=3=$)@>tBGm~yjPia*|$n)bWm{PCX?Ej6>0 zc;kJUnFrzVzRWCy@OWQl&O<%?oM@R@FGY>_C#d!1=7<{A)_@u{-d{GiNb#Q&y=)$q z;*a-N%x)W0DSl4$YGAxqn4?sTH{M@2^C3LmUpI?T50CfP&3Y;7InjJN58p7e-cxPy zcwb>wOPL|Z`+VAqmFBk)arQn>@}{Y86s7#}UTK~U;qkuO93^E&n8*7XvjD>5eT`WP z;qhK&u7L1(uQD4TJl@xu`yo8u*P02nVtZzU3#p&Qd(`X9Zjf0dHvPAC=4i-OG;&4E z+vZfra1s&owpkA0yisjdLpX0#n>!&--lg)!JLVzCLK2ZT-Z2w5sqLAct={loZx%v0 z+pITBA)Ia2n>COMlzP`Zd9$p?%PsGk*C>%kXDJHD`fgyn*O+5sO4XQm z#gwWEl-giUiYc|hd?=>WhCr$JZy5dl!jr}H3kVUj)sxxcy$kA%56ohk0ASw`w$VApC~Fm*y4-zaj9I znYvY#8e66Q0@v4O=mRDE7m%CGBFI-`Rm?YL(KZ#sf1_uIIj~L%zgO_Bsc#oDBQ$Ee z$~HUAOexbsc_g*eKReB|dJ*$ll@f9QGB>fjQ(R~lNsGBk)}yXFB0nEAo0WLm{D+zIvD}OB zncHZdNilzzlOZW2ze-sM8A<2+A(B7MO2{1~N2N4ECY7kWt-s6`$V?J(xAm8q@QG|o zo-HrX{vR^am4sGrRcn=hV=vTOLv83ikAFPjw}y^-!fy@z>j}R#)Y_s3Lt@q+y?2%(RamqV-Vw*#5}4SNf%GJp03ub$86zF8d2S>EmHh>)HznCFU4N?^Qd#I5lXyy zRCjAKWI`8p-_+fj1L1j8cdHEb@I0!!)g(pDqx#Smrda7;skR2xsLXbrwMB|Qk2=pf zEXAKkoo{vfT9x8?R1YimzA4ojrDD8!R4*$Z!tSv=_atw;|$6J&>f2RVT%tN2OaoLU9U#0i zaIuvRdHWaj+$zHw2H8$R7n)FpH5GF9rRtvO5^EmhViIvrbct05S(~Y1`dQ78k4QvJ zKdaLYwLQ0?p8i%U^X%#_+kcc@_rd0viig{!t=w+tb9m{rQQG>Xca>;Nksn)v{pd=xRYjZ z*V1Z_wFMHU_bSB{?{cdJ(usaUCGHuou);gl_N0=C{kp{nTd->EHp3H^Mvl?HhS{d~2R1F4Is{mQl`L-vq}{mQn=AY;x^-_#v!RY4vg5!*c2 zYJ%k6s;;?1tb>pTNyIgGh}G?TwLK@(yCS#J77n#CA-zd%my!$Fj6NJ@6+*s39}ct1 zA#JZxeRz#k4LOxWY|k~;PDrP-)l;hB)*(nQ60tqQtxmht_H?7S!9OFp)=Gu+ClN8% zS|cDobyYDVtb9l-#Eh`!DeKw+6Up8@ZHvky{Z(?g!8S?J|#R8zQ-B?`D(11 z36HnJ`&A6jgeO=vKP%yxaDkQIBE+8w-)k+G;?IQdmHU3|HFqLJU2~tH-k9u(xK=(x zGQ|_VRz4W0=OHgfTyvLFscD{wdR`-W#1pP(rnT@_vCaNUaK zDz(THQO_qNWu9<7<$-#ZdNHCN@wMV*o``z(k-Y2)*YlcHgMH^Ukk_p(5MBd$J0F2WaOtKYe- zw2~oLlH5%(E3HwGljyGP$BwkxV--MBNLr*6LT>D+VpdtDkntoUW|dVA>9bw6RcUR2 zWRi%sDy;^{gMC%ZYU@|X91;<;+KNA@wz1v0ralsgT~u^vjMD>F+aI zgCPS+L_KS)(U808x4@!TtE_2|LK0C=l{F7?E$Ufot%Qt4J!`F6$Z1J&p`)~?>#Qco zxg_x?3E88>yB54{b^b%{g_J+(YFxRH`} zW{dSZL|ji@lC4(!A+d%2jCz}O8iZ%mbyk{`8DaemHFNmL%7&asB4!RBS;dg0^=d}F z-715;K_X_1+pYJNct^S3BL2@aO%|2MI?@(?f*5rlcN$59C!9AL1ND6A#fbcqLZ!a; zMC6||l5afWdcF(P^Su`%>KQ<#nmrNqTt%|S6RzjSKs`TsF`}MPRO)~yqMp$tzj(s+ z{BG?zrpLxp%t7mDjQnXO{@spxaYlGW&$!T3iaBJZLEa^KSjuE2vgbQoPfr%DGY`vB zQbf)FSOb-K^&GZxAY9L3YwPsU> ztpdnVTD_zbCUn%Qmog*V!=^WjXbX>8_EEXb;rAT6zDXGYY4D^Bvf7hOD-pi!K&L!gPhmI+=jAG*Kna7lRO-gL3R(8oTr79_=m0fyFsdZ9fOSPsW z`QP!*qQ?6MD%A!tYP@eHY3B)#3oTHO?!}1l^#zqOJrU#UTN2w7t|uW-PkS#$)N_DJ zo#2V6=MRz-J>hyz4%Bms7bEIvof`@zdLru4NKW&F>p3$}PZuvn)N>-0I?EGLPiK;@ zo^UYSHZ^nEIIgWYg^n9gzf+YQJYH`?|IO5CW*Bsbbw5Ph-AHaFUH zAWfdsL3Vnj!W~pSn_R9Z6VkHjWIpJhg&md2-At!n=2l9$n^A^ZdPvTEe^^|(slL`68iz$R?Wqc;o zKrZk~g-%uVRCqm>0r_Q!y6)U)PldeiNfo5hlY@}2JV{AZH9zM`o)Yi+b)&uf3>8!L zF1@>vOJ5VU8zCD>W=m;?+_Qw9R*>9eC!DEDJxEe2B@uEZ$zqZmI~#Hx$xNyBTe#LP{S{F}K-SkR>D{<~Dl->IsOtc#z$%vU`hr6on>5G_2b^_!##7wp`A@SIr z$#(2q{XRPzG2E;7*|`wz)%)xc$UAG*J@piOIi!xHJss02b|r+LGTd+1LHH@d{q{k~ zZ3%Iqoz#a@ZM~b?izy^~rKCX05c7aN5b_pc9oC<*XkQOGn?(HTvd|t4NzYTGdzw8Jl0_oU@M(6L z60h}#?P|n`nl-BDVf*-VRa>HFS4tv;YktH|gK*7{*rSwqH5b|Wh!Hh+q@g)2Hn%kX7^O?@m*x`Swo8W|HwzepKS^=`(g>54Am__4_F1 z8M_oBS}&BcM2T0b)UG(DR58Vr+DWOZ9#QHEDY2y%*eQtN@Q*Q5soP?Nidq1QnVwTz|X{z?X)$x^|10<#u9k)z;%AB4)YW4N`!5Ubgc&2KBrgxZ=NJ zPely(*emut2=~}4b~S|0)mQBX2%oF3+B+e99#+_gAbcKH*ol4AHus{jBd++b*=dl= zNW>NYHG33vkz*D1E(QCGGng_6o=?Bx|HJDDlqu74~n4;VoQY{{!JI zTw%wqS*^5N_f^|0R@K&1%`0sUB39LErNowc(@r?1)HaHF)9!RksgI?^mRe<>aZIU3 zidki!b4;lnQesP0+Px6NS)$Uu2*O#S(!LDB`@Y(~8p8X&IB$BvNZh%z0L|=BN+`GZP4e}0& zxSDUU?}B8~s1;u$dC#5*8B8L+w(*|*5QP7N;G^v%L<&zw_N}Z-nr7`QEp;LHN6T@7oQKjbqgJ3bxoykdH{j z-OUzzH{|JZ^&EDqeE{+j$=wvQ)&3K5*7GXn1N$iCLJ|@4f!*#xb=()y8#v-Q>^9qi zyg?#jw%HvZ9kW$Tot+5jMj~SB?6V*fust8z=Ru0FJs;YAAaU59kL-Ss_Sl|}>?s;r~N8W&(~gzSnuscrM~e*)N>KZx1Ml4yX?7Y zPvywXqL^lTg%tm(^lm%;B5_Rp_dIvo8A`mT(tGV32tSqHYZpNHJJonnQ zQq)uFq15_5d-TPstpPRasq_!_VJZH5o#2>O?G`EOsr2=M%E>T;^Po-Pz1}W-2&zmXcSNjk| zTu*aJezUXs$!+$&>3z`7gYZ-7KkQm5{_kb}vYQ~B6aKQ(`-^&JggLhyvWG!9w;Zyk zLijf|f7|mQ{F|D;?JCIp47K9%k6jOWfkfnle{3sLw&i8@|JkWZ!Y|#W-V*$uoerrc z5p&xA*_T2-LCj%$5ab8M9JYr;=8seL9IVpo=0Ij@ru|aJb$KBCB@J4U7UR=#qaYcJF$8GET_XjS+ket zyE@$Eq-fM&!(c)MI^|0*J_&|44ZNB66mP>FZ2~h@2^6`Z|w8IA^9i^C6rw)15LU zUe3JGsf37}8AosVUl`cJi=1yz59iE_oZS%4nHM=fLpWz%?EDGgoO!YHFGS?bFttU0 zxA;nRwuqc*O0gmLQHE?!a*5LcB68+QQetyvKc_QdIA`{A&Vq2x?B|>h5jpcTs;9rx z2O`c@afbH~WVTGFe@xAp&XqAWXF9_mB4>)DbEz{5B66lUI+q4&9uVl~0nTl*l%F#P z1ajSFULF&CnJ_v8ZdoMYI>!czYrCYXHf$p74H+ zbe5^MjqGf9b;pYL&&B1Wuz ziTr$z^BP2~eTn>hPvGnwA2`QY)Hybp_N%}bc*G5o7RiD)oRT zqMrFA4|&4%JmS1{%zl+qOp((d#Xnc4JIUGV{NcBqr#qvSc<1U&rwGF5>P)8;!sqHt zrvmlxxjNI?Cqf??+M77T6>f=s-DQdp)8ExSc&Yg(i`9_H|PsPY{^)HH<>#Tu@bM;l~ z)hC?>DgL=S&-o3)=jzi=!ccW)inZlcRO%V08$_%vua%Mw;rT|XlMCVbMyXQ*;qQGd zaF#>(dtVEjdI*2Z^jT*ggui9_tYZ&T+r!@kd(KIQ@HfGpbFv})Ez^ZgE`+~jy3i?s z@V88#ca}rOH>>wfpLgmZ{4LW(&OQi#%XE=rU!%5%zh%1ENrv#ZOcy)Z5dM~FnUf3Q zZ<&@kC6MDabvOEgvmBB{BJM_CaOxr3sMp1B43{|jAdMuow8FW>v4^YenSy#=bdn*D zqMjF>Y)IEhbTu18Pf(m(NGgf=U1Yg4M~RnPmO5>(RW*xQ!FD>MmO3V6I-d0}b&gje zOV!XeEp>Xulv?Io6jN%MGa#navOp$z*~=0llWd`yU-d*}l6sQYJmE~T(zy|BCE*_b zO=k?`eB9%|>D&#e!hP;4XA)!+?sHc;g^&m6H{hbjDxG3T5sB!rN@p%)9n~zp_Oseq z!1a)bul=lcmO#Y3ZU=4iTh1#GF|TWuvI^32oBGno8s}}uKO|xqZcSjGQ03Gj=Kd?x zyrs&igUlci^Oh>-Gl;l4h;Nvzb-sa!tAnU{ZQ$y#E^sVZ)Yai9+U9Dn=f$!3on*Zy zd@SB`_8il?xHfHcemLijmipZWQyC^FBmeQ+kkm?KDgAuPNU+ ztwxIN`R+KrrtEN%r1-y}+3BQ1c>c4~DS+_&=R0Q(gy%osIjfX-IqG}oJH+t(=X>V| z2+x1M51eDWoZpVAr!VcrF2^4A-*cnc84clcquD7_;+-3NoEiw98+)7v2%j5!oPDT= z&y77!(hdH((T`f+>)a~EKR5O{a}dMl#y+P;ihpkW;IyC=pBq00&W)d(#2f#6ZX9q@ zA$)Eea0V*z&W!`kLsHbaaXD?_&(1Q$@VW7eQ?Fv=xsgpVEl#_e;E`EA%@54|D1%I)$!tE@jqvv6#rNpb|y>lpD7#(9E+pQ zauwr^(~w&Y;bReU>roHS{X%ZLTU6^p#?ThVx!tAs_bIL15h_L=i*Xdw+I<2djzs}U zyjvy3KNfA>&mnv)+PU$!%C@{?ah#hd#XlAiw*bP&BI2%4;*AU4t%vZj(A{PT9}C?* zgnD>f=x*w0wWmU+(l#6JNGblfFx@=F@Ubx6GAaJCu-tl-;&EZSvFm=08@f%jwZ}Ua zQ8xj?$0F(`EAhrf)EzBFjf+QU3lrP|#PGOi?-r>Tc`P2KnB(1L5OFN#lAPdHN%4=x ziSFkRJ{BF_*p-}4?taw6v#(C>LC8~h)3TF$1k!@v0-x-*86$f&d=$S0J~>eHDXxi_ zjvuL+%qi~ikh4g{Oy(5#R7l?WY9;Vgw+rNc5^*&@)lGr)=^iJa4kWs1kjqKL(}Bc5 z>z&<85W}r^b}xr;>z&;p5N`c6_j(AoewuqL?=`9?1u^RPajQwr_k`zuy#n=I;Khi$iH%fB z{Q5_;?^ng@?n2>KZNsPe>apX z`q2Lsc7HcPiFa-4?`BI;*QTA+dZzmbVg}TxIpn2o8DcmeUg|bT@$=yTH~x0nmiH^{ z%L4gupqr{S>d!*3hnSpOT{T;a=LpE8RB`!}&1Fty3{FAO1`+ zgWO*rA|L)ia+Ry!A-2%ZhuQAg5YC5#-7G0H!s2V#;%;K7I}Bowh><(gy#aC#Vurc5 zL3$u&Sm3O?#=Q$MPttv!_;SuQ?nKD*B;ro$8aMWd;c)k%m{P;tnK7k?2TENVI5Sz) z8GeL%<2vs=6n8gm=#F%xCwyk!jo4ihpL_?1t`C$DPm2o85FJ-kEu; zI|{;Q=B;i%gs;@Mx<#mmuhh4?HB!`>*^ycw?Iz@@wg%LwGxIh#JWhzeVs@LGF2z4H z$GCY?{8`i3z?qrrE>tnznR$o10>WqJ9d0e^;WP6Nx8g30h4Oj7GDQ{5KGSQ4?`GSy9(ptffSeHrEgIyw)y-5_H~ zE|iiD;j8e2ZZ3qc!VkKo5dI6c54jBx{tLDbxrZRU@>b~D1*&ykc`J0&ApADnG&dW< zZ_`b4Cqq{KqkirFuv-GzNK!>34TF584l5ZZV`7F|*tXB{Gk-rBaW&gD0uB#HwQ^9n(kM>mXuOin07? zAg|62CJnt4t@$>T{w+_Pjd663y6C;`x@Lg@0n+)OnT;`@jI6s%U*-E^bLzz2AiptLq zQ0p(a8B=7<-s;m5ca#)AKQD1hr1<&yMYjf}_)e-kke`>jEh@&#&&%BS`_*1>eqQEw zP~zQ5Epv0EV1?l(dVAlUiWtt%FT15GM&{=t+KX4*YAJp;eihr}uQgS;U#U`F&%f>- zLd}J4Txdc9y)Ex%PF20ZJ^zMVsKo2}m2Me?dw!)`3E`e!>25(id}Une#y=oxRy{wP zw)su>N-6$5>?$`GF+68m`0s{=j%mU~#mcs*a`+7JG>=d0W#C0@^0 zxg({ho_~_IaIHHDG2HX(+<7WS_WS~hdD~qB5o557q}pwe;vb9k?r#vjGQR63JS2O= z8{He+dL?20%VHbceGvZ3VjEn$P?icm{Fs`Lz2_!FN=U?f>^(OZ!s~t;-4aL-S~Hic z&F*qYCW%~ab}J!2(_ar4Grd~34$>NH=Cy7kB$?iC5v%%}+!n|MB;xLGliOjM+QR*~ zL)`49K>o%Z;%0XQg#TXK`))pj|6besZY6~O7TXrL4#IznZHsF^tlGK@zq8xwCPSv+ zcXnIdY{;$y>MHYrn+y4eL|kP)a4R5R?olz@+*-)5BqC;;8-7H!^{uJCds*iuLjEKX zF?H@}$iKRZ`OuvTIl)jdAG+(MJQ6Cdqvyus=nEI_7RWU?7Teu~BH31G)U7o7DW=}t zKV8X7kWbv)S!#Ruxp{+I2;p_(2Db{r>&BnC^$=b+{>=SLiFY1;?w;|es##oRUZ>VS zch7-{GyHPONS_C;GGDm8VoH7CUKCU63->a}t0U-_fb{EyM)zvSyCjv=R%4*%F9X*d z7IpnvPo=*0t}^1fvzg=@Px!j?ojXFcCHJ&}V!n3^r1;mJUG5eLXTM!;{A|%1{&i=! zn*`zPx7$sFaQ55nW-0NmJG7e?iQE8g*Z=*VX5!qs-ZFubUyo&wl&d zd@25Y!4HA#_oG{;V!Z6P->ro3b!Wf31@-WK!G8B&Dad|wln=NkJtp_v`wJ#NyJ=F? z8`|H~Ui{*YgotzF2a*=ISc;$hesf=faQ6G%ZBnJYv+fUf#p80{y`%GoTl|C+?+xug z-7*NzSO0XIAwR58Px1b84@3SYq2-j&Uv5T;s)y&ahujemp3@$3OCcRGpa0uk0ZGDq z{%^Mt(!5_~iGSP{$YBzZ0se7Q=c=}zLzeiTn*~{gEb%|L1Ttios^_q~9C9a#sOPY| zAM))H6?4Rme^S-_4~d95;tqtI_M?h9>gGWDkcgP0ZaL&tnsx~le^T{?q8%Ux_A3+}1^M%P6%!XNfEV zzgkDTK^9}bT1WFCS=i?IXfb3QwmCjp2dP4)Z4+&Vd`u$RY7;&4Y1NjG!r8`(#;*I>(F@Qz|2-)? zdNG8*0%`}g#|dl?i`pLJE_&P9Yh7f&_9X2+;q5swIuLD%J8`iB+%cLB5qIKZq;w3l zeo~-y7S;Oc)Yi#fTcY)@B&T}9t)CvfPPHXRcW;VGicXf|=iW1-br8JM1D@sq3jl|UnJ}Cvhn#*d$Ej>bJ3m@(<9mgBF=EpdTKONil2>p zMQ?#{HohP_S(Wm#aqnn}6#wY-jy6O1==6>zmdWk$?hE=xGa!6)`bLLA_~`VF<|^@y zPTy#`6m@j2rfp7-ev6m^HR|YG7;QleUl}iqCcPk9_m9p+(P2{jE91q{*k@ZA(IOS& zT^ajDOCfwL`b8^H4__JkMR!S2SH|JAh5e(yBZlt_GNbWJ{9|zg#atTg0ujezG|7Ny zniT(742%wk@Ugf&nuk*SF8Y!dL3-Xd&e4kJKm_94&?1NFwfB21m;we5D=|t%mTGdPwyDv3D+TR#oNuU;CW7 z9l(SRBoGNz6Z%++2_4vXGpFy$;)1H5q5-lw{>{dH7P&WL&CHU&-U_?fB0HG zB0Jbi`eEI|T0J7Wua}HGS^JO^vIlv|fsk+?azb{3mxSMT9hsf%CE>SSM`mliB>V>9 zsO+g;5`KelR5tG=2crahk~J|~=OxEO!Y5f1vln~GTe#xU=IHDdUh)ZVb9DAvFB$CP z9Fx7tOZMUkT|IzCEx^}HLBDNz!xo>Q}*_4x^R^e1I^_mc1?&q=H0 z@N2839wbWr5u|lWOpB>6hUC;J38|lv9r>QrUmb)U^6b9vNqx#ulyqN5O#NY09qkovjVaXzg_hiipDGdsacegO&BEi+e3{ae}N%x1Rx<08DFgUH{? z7Tm^mpY8hLYXOwhWiRuRKVtHE9g_31WABvBS$p9-xF)&cK1rTE1;3-ms5?LVyqDa1 zI{tblBo}1+x6o#mn~9p(3X+D^`o<;M>9Xm61@_raJOn$g*?sS)m-@!J=q{IJCrRQe z_Q!ZfoJ+IAA21tt^BMTg#}P;)d!9*VxdXq0XVkEnmA%zVwt(cbCK>*q^7Hy7l6*IN znU~ytG~Qu=&E?taO>(}wbb|gC zu0~$wAkKrUrS(vZ!+ris5NBbOFs&;gc_d0g&HrSzv>yK_64uUp@3tO~ahMj%)fOe8 zTuY)Plxtb`HDB}L`y0Q=mb9{U&Myhy-}ptgua|@`)%-F$#7n}LYJQm=?j_+{RZnFP z@{;has;9COy(D~v=IQL|UJ|}S^K|wqN#d30nbpd^ZjztACr%^k`I+p|k6O86skdf@SaCDfbAz5c1yh1M$XE@7`&5 zv>glFUUn>WLvRdsjJyB!^iR8A>?e8agNo-Kl6?LU#wl>W8P8*(yKh&@i`>im$bMU_ zyHfaX6y~-R@@E^I$k&?WE9^aHyq)tTvH=g}JMDU7#oIk!JRftv2m z=se}-a|sH+7m!cJ{{r&Gdi(Kg9t+&ncEmS@%r1qetn!yVzAo58yEPx*!04vF&e|gt z+hL548;&8Ln~tilk9$3Y@%TZHEAaLp`&Bq@Z1wd)%eAh4U%yuUWXvSiL&`0~lc;|- z&N$CdzNTY{6UJ#6*WKrZFi!<}m=B&jTk#L{^G=vYzJYxp&Lij8vA`{}`M1y=_$k^K zxx?&;pDUe8yAt=!VU%ZFudP*%d#>jBs(E{D^%BYv>S1H+4;wl^p*}Wr-0ty0Iv@0S z?MSs}_qdzR)xS5^dibF2y(YgqdCR&U<2l5cdVu;*IKDH7aZ;}PdBqNjANrg7zU(yb zrQK^^k@9LOxntu})&L79#8{_{O9rl_bmQm*V^@k?y{TKB~Gv_a(}(+gV-0l zw+F0GenL9Iuf*+O<7D;q`ueuV`r7|u50*EyL)ulf@w~vDJc;EgbVr=Q^CI^E_Al{8 zDc29XMXdMRe#~Rak8kYQ`1`$0N7c`!dRV`DSlc|cHvKP7X8%mNi@wfd+HG&^;{sQN z_siIi`wmuqLY%Pf4(Dq+hU?5ewob+tT!lne2K zpX|c*HSMm#x28GH{<(fl@>PBzAHn|wKhDE>NKf)~w{${&Q*N3sZ?IRn({8sbRiE9< z7wYHz$CSGi``|23h$DSE%8N%*pK@Ux5$wV`qTbdI1?~!4KNPy3`E`VzUlhATY&}up zF1BOF?O?|q?rgK`>31i4x!vu2Gk1_3KjHQ?yUpDhcI@r`(wF(@<2JYR(B9fNV!sOc z&^o5juVYr9w>OP{*5jJ53t_yi>$vScUf1_Jx2Zk;b$k4`>nHSw4Ru`Gea~h7dJv9l z>remf`uVu0zpm}Rwsu`xobK~TcYEEx;@WHXu}R$DTlzI!kHb;dCEPEXUE1x3w-o-> zeD`s0zyDVG!t<5x&s9#h`^&_wt-aZvy?ZC_^Y~UE+b^{H+UA2`7xq0reIWhA`fc^~ zz}n)4e)Zp~#|@os7*`uQ?#31`lyiNLVIJ$=KR1^0t?#(%-oMYn8+{y4zqI?XlxsQQ zz2`w5j;rf8mU`Hf54GFIQV;7p&emoh#^IXmy7%ku=j&T9=i$vRUMCK*ea5sq$@ZTM z+(AEMJr}y8_SbdjF}`+z@$)s)r`#03Pu=~xCcBgyVf%DxAE&@QhouSQ9gla1{*&vH z?)m%8mMZUke*ABDDD#tYx7q$}+6DRg*5m)0{krzgb*-1~@fv*pT37!~b{l3~b#I66 z=O49t?w;^_RdB z_f$Wfhxfa#_0J2!{LuZl>?qlX{C!;KgHXP;9Y3n`|JwT1+Vo#IO7q0dkLY-k??)H< z>&dHYxt^@+IQqEHLz~L?zj3|U)Xp1MJFjhC5BhbT--CTPuIv1^q1Fi@-3@gN^Lscx z>-Rt3=ARP9eZoQbeG2arX4*WTxL}uGsCJh9s`u!^`r=<7Q|@2;rR?`NydMeAtuDmh zPT+ZX-=c9VtxxnEBD{x@c3l;;D{y`6J(fauti1TO56edJ@V&G-oq7` zeNT6|$$Pm^`{!vN)_7iO^}OnSYkk`@tjB_1=wG3J);Hg0*zbhGdqDWj8GcX6-zWX~ zbsh`dD|qI_`d{06VMFT=wf0)`dl~Cn&Q10lA0K{whJLxW;|HC0yT=Xvzq>pD`)%+G$BUa)ui^MrJ5RZKFAwwBFYW#IwA=e~+84xmj=v9NyM%a~`l;&U zqgD^y``?<*|I__`efxLl$Du!l^EDm2_xF!lyZxu~yQcooUEX~@)BKQfVI6eiAsQdO zrt-QR-m4Gy*{jT zLVJgHR=utH_a`4#J~qWw|NBqZLumhS{70$of)W1|O zYpaLQPHQ`^>poM66WWL0Az}NhEgzfo>sC*pe#0@;^QM0P!Rqh#__8(Eud2UQ->ccw zAJ?ruKdgER{d-Nv+5UI>A6EJw^|))Qx9;+fdO6pY|L)~o)A_otgSxMO)^}fHeeKs) zzD@f7?mQLhe@*?WyL?^yS$DrRorm?cjw$#2rK*qcp3eK%2l!6MWz-kA@jGd~y*B-( z>*L1Jzd}D-({WAxBgnhYTcO{Cexm!cRlnO_X1^Z~&jVJ;Pqq6n^c{OXxk?`H%hr^? zP4a)QABA@OcaLkDf5JR)b05wNY4?~N3*7Z~EOZasvB>?yj;rpsgT3qu)~H|Kc>k__ z$mhn^@4B~N*cS=MjV-_bt^BO%_jKLsulu}qDE?M7_Zzw&wXd{FzP{@)#Y?%J{CAeV zX5aV1?~VL-zBGPT#s6>B+s7r{?(N+D{Nqy2|5Q1;*I)N>6Xt*I*QMRh?ER|(mz$yM z*2hIZ{CbvWRryBSdEsj1++@dk`ta-Jaa&KWYLD*yZB6ZP+O^DIQEa#W)Hv#%j-F$r z+``FPH|aSlzPq$k^|$SNZhd~7;bJ$Ikyx?kr%?)4PP z|8Xzp2Q6QypS2x7X#9_gUnqZgk9S?4@4eq{)%(NU%iS>YpO44xc56F7)bBIA*}|)K z+MVg&2S37pS3P`3md7-n<7oa}^>+gL`tNjy`w4xYHgTccYf69ATJnD(-cRPd9`;W{ zyzcYO`kw3WLah1kL#%JSjoqH_d9xn7_p43yp!?WO_3**!A^d%nrzfy~g}<*-;D*`v zH1NKk?{|lMO7TNK>@M$q9_+izyPt=6VSed;-rYXLJ>cgW54V4w$5ec8Vr}C%q_d%p z`i}I5e{W+=aVLF|?SSti@22wq>+<3`#yPYraPmvsJp2`O&Lbb!IHBI&^xwnjzF!#j z^F#ZG^KcCN`#~R$@7IU@{%~B?|3Z3eiWB1fr;edM!uRwybh;t_hK~DDjkgqk9ggGk znCp2=yCaA5Sl~|ezh{vi{l?oBj*wmVzt8kJ`#UO$+tYs+J=BNnQ~vKcrQ_do3j0*y zI|6GvhIru^*12mthUX$5*ZE^ZmFq8GV7n%6W1EM*JXZ66X!noHabul_Hr9N7(01Qg z$`kUjrupiFmT!IiLO!~$!`3&>n(RaTP|h{kZ7BJNo!*9;Uqg8}bi5F^`*B01v$4eq z?Y*&Gr@Ghw2R+}|>U%@w=i}aP-P=3tUxvR|sPk0(d#gdNW6FJ4f5-4~+izI4pBv`o z4Rs9b>%;taG(tJw|94uu|J~L#ou{2UL+jA@$632PeD_>`&oS-#+k4~%@$Wf?dg$Ix z;rzr)lx{eN`<)GaUli_pLb_`@hJB?q-9N3#Z++!!ioc=8{f3J3zczoYZ#!;i`;BG( zTC#!WukQ2IhU%9aD$csLU-$IZ^}E;WW>@6*UyC>T{nvG^uYcF>qcZPw?-$+g@7{m@ zzqik>eWa8-&_9RiejfTs*l${sKKKXwwH-IL3)fZud;RU>+V1Py|JOD?HtBWW@o}k# z5Biy5`@w=hQy`kcK)aq|d{psJ8>%F9u3%}dze!ijV``^vyhR(-^iuY0L zM;mK?KdSla-mk-Ze&M*L>)!kI;XS}`+<4yy>|Wk*zM;m`hKjSX_NP!^YdZd~mw!$5 zva!fFRQqhGIRBk~zWO}%-^s_uGf#%{zrUZR+;#prw&dN<*Z$uBN4uY_y?y?9y{)}o z-e1of&VEDHcgWwy8ZXp)_xHBKx@2v~u&xPq-OqzO9K(J3`;Tky9~&xvAs^xR{(P)H zpS@qdDxaZUKdQ$MYoB9d?dPGLD$drvemMScHqTRT&VG`IzjxQsSHF+yXMZOs?Pgpj zz25&xxts0pSEt=D{Qc_Q_**#_<99;*UcjaP?=ZghMSVYja=yPGlOQxJyn^ z{BPU)QHfjEWB9v{8@k@#tWfzs`!MsBc3-LDd4bDct$c>RFZur8k*3}DR=)+V$n01D zooV-cuIW9ee=aZZ??Du<_8!EB?#~}qK0`lT)A2XH-)(30n09a2-{C57$NZV~Ug&xq z!geTfg(G+@c5e=)9DVO39?>cN-+wsU`dxuLAN{eX8|DV%zt7>{uJ|_`|3={7Uidc> z|MtPZGu`dUnQlJ*-IFx9`s6B{Uxo9laQ-0pLGXj%$H9+-9|!*ecE85?uW|lsoWBl! z9sD|YbaFfX&BwoclJVg2;PK!o;3?oK;FG{7flmUT13m|Q4)|N(Z-KuBt^?PB>%ixM z&jX(ao&}x-o&}x_o(-N2z7~8f_*(FF;OoHGfo}%i489pWA3WdwyC=B|d>8mG$TRLc z`0L56*FHu?paDibKsh50&!Le5X6=__g36Uln@uTWBQ8q2oj7T#hO-`7rE$Lyz zTuqB~gV8|9nv58Ekr8v+7HOH$4v;O6b}Nl`hHOHLY4E3@HAeKEVYFwIjgG`L>Z6@J zIDLv(f6GnF)H;oEWOPlhKod#= z{h^O@k3icNqs(`u_)YX;$mY9~K}$i)T=C}4J#F-vNYCKg`;twp#GAvWWqI2{x#S;c zpyejJ6yI>5HkbVNVCT9(gVIBfRIM#?f%+7cAT@s0VQBKu$ixjZ`t5_xsKWXNFJ?oN z5qk$MBhzk#X<4U3jre2Y5y|eKa&ENI_mJ*^Mu(Lq)>=ao=3Z&M2x31Nny?&_odA-I zC6{b7kYua_$#(U!0jW?215%-0##vs@MY_4953axG8!ZG~Y7|O7E-6DZ&w;GPmH3t! zmkfdIdXuq@ZZ(glerOd?pQ7ImMjILRz0ny}Bq662Nyy)TqG!=Nm&0yA(W93-_Xnd) zzr?LDx(>gNe-kt-_Q^p-pSu}7Gle`CjRb8D8d`KUIssd7MA5=NQVy! zvgwhI85m@zMY=E2&m(OUqYRBS>?oCdauLV*Uy+x$6H-sS_THx;%plW>b{^r}K*%yS z!?FLhyHkGW+z`mx-8mr67VYkDM<;Hm$%>BA{MYWDJqYuz$zBBQVYKx$=k_(qfetV# z-OIV7jCKJ{HmaF`?;#r1flfD?|9nXIVUW^&7Hhegru`%60;8`W&sP|o2>L$gZEH)8 z_{7R_17xMKjoRJgW1YLxJjxD8TtBRP2PI+V$|a8=N-1RR?k4n{GNU*4bvB#59Y@OB zaiok$uE&hD1MEgvYCD78PX6BF+-@e@9Mi`hMq3mmR*n&=BezT3-jL;zdGM{GHVI>T zauMfjwo!ZP%jm_2nBBdnqfdb{sUMu?+zCcuw#dX81oI^9PO*6X(Cf}Iy7DH`0K3jG zf9>u*$j&$IGy6Dq2`HBggU97Yw?RuPjbp36XbB>-&2tI!axJtKmM&+rQWr*EySpFb z@)l^@-3iA>Li7C)vZ_@5UC!NO+Qpa;BzqFG#bb~ybG(K=0U8iTXuEr0ixA~uj7E!` zJdd&U3)uB3I&e4V{tr~@!U&yQRD~;Ik3#gVq8BiO;7@>h+7i@M)QTD(1R5NBL{lu= zS_+cgi0Heox0_b@v$@XAM&xOQzXM%kv|DYE?FXW4R;vAq5btFW z<5d)fQCm?M#?hP<*9VQ}!K-eOjp_CQnqOw6o*I<6`Ovnc=8Vy7+mdPop`nq3g{X0k znOUhYdS;~xw^z%|N{z)mNl{x{W z8d@!;NcPi z=KBg}sg*{lFW^dSbS$)g2en%o0MIR%EsBdtU0A<-0#sqE4364mj_aYPVYkdyjQyZp z=D32QY-q9&qh|nQnpFl_lrT$a?N}r2!I*Q5=2c--fEJ}Lo9*09^l*QxQ7dGu*EKsZ~=&ukfQ>pC}cMfDDl5b+x`!*?6I}CF+?TUg&E;%3C%OPubQz}*W z>OB$CLEa zXb+aWPr)7NVWcGeNR-{^Ws{3ID_8WO_K7VLcOWQJ9ImUGVy@kp*9M7qJ7g_V|^;(%&+VI3(#^cpg!3Hc72K;$30?y zkjDA8pds;kIV{o;cP^sr0qvfSb#Q=DsDoiqJ1S~Nxu6{oNB1K4x&5#vgm1h1Wn4WJ zqm6VW`AVdxQCBMY|4mEW_3#)Q^D;KB0CYb%t`~a=@3J_4HHS@yOnvBlP`g{{c@iqZWFs82zd9mhMa`QJ9}D~BiUAE5DZ zEj2!_md3{#Ixg1Gaj}NRyU`0ZTTG34X?Js`hB5P}*b_Sk2HD)GEsCS;@BYf(?%wfs zQ)6VTP__(LL|&~p_NTgV-!nDV%hZ_rsWJDXT3*u$5O5D+gu>6i+6|b?>q24FV;c33+s*Z zVtbqy%hB#m!aXeG%}Q;523j9c+T8)CXxF9P9R?Z=ZM)n2n`$kr^uLd}1!J|vHR8Ik z0NRUVYRh8&mZeWR$hniDtw=aWl=WtmKcWBeI@2Co;o{gbD~q1PtjGCzauH`eYy*Pc zcv7id9CKe$aLZ>B_Zw(+Z?FSq0n~jJ<^%NDi{DeWVS_>s8x<+kGgkV(p8MFfj5Xfw zUabk&-x-%+eV)a7FP5l}tp&;;Yj?Y1-e5h?FYH9!?*iF~;?WD$?`PQF7qu0|VP2~! z4)>BHirGe=x5(_fdl`k*W*?h@XF!%q?!>C#mqrJoZ?uEjQ}<(yU(eHNEl@99&l$GT`Sc_J93Xz?$4e3VqdOW z*n*=#eTo`zeX9bs$MxU1V$P?hK{m@RJPi9App4zAf74`lqK44y=r6aR%@%-$T8}71 zS^5->n~bL|MyDRCJsypUUqROH!ahh#vh%~L-Ik>39JT7K)HzFV)j)0biMx#xig|@V zSHl&H^?a;p!#XTycAN=^MjBze3tUIcN@e{@YgX!l6Se+ZWWVm;3=U4exce z2XIz@Qkb8$!}kJYBa$c4<{Y&nlD)p++#gN$jR}%1OCN!ecjN%(U^cXOgC-XZIa}+4 zT=JW1oZ|{Km#hRGf+&-VO0jZ#5O#CoU1ht~5NlFpdloZpMZu-xv34}NG15z?IWOyT zdZ1%Z4RmFsTQP^pcVVRDQ0$Oeye#N7qr#`Uw)6!u@HZAV+k4Sn=!5X`ieTe(T?TD-^*m6?w7}VO4&`vJ;J37l$&@#8# z=E{NAC8t6*$L@;037VGXc)Jp`JY9T)b2o!#*=Xc=>r7vSRZ9zGxEJzcYff?7e$Fj4 z*(b4D(mI=WJM7srV;#&a=>G-Gb+FT&W*2B?Y~L!Iy-P46JJXy`d1rlvjau$}Ug6$4 zPBngoJxkzPPbJzL9?N50%_;ulsagX!rMDe{egJJ#`l%th^J+@7PjalzDccr)2}FU3Fqg2kYD2_jZAC@e6G>wAe)ii9V7G$pxfdV?CwYp zM9L-CV^we@>>h|$&buQmvNg>xwD}@iQE+s(xVm$~{K9Jm?{!zEw%lI3c`fd0wA%u+ z`^&X~E}1OS6;?CNbmW;dAiXcH2BKEvh4a;b^ys~D4-2}+9S6JXk%N}vE6#AXCs<$f z6Qny8Yr93oLr{~`Ky!+}?RQ~k+P>MPCOZhdgrlO}9od531X;V=={`g?x*UC6bjAsy zImN>s8i0$kH&uRXzT~`3-*QfX{0v4;J4Vd5>4wD zs0ZpmvhQKGAgSk^fykn>EsbjQu*Z$I8n^Sxr#t|w5<>gB2T;SxQF3gkJ zK}`1<)XS?zyz_e9==*2|(M6sfbw^^g&b~X}M#UGlxJ_?O78hL&t z=4Grq2IF^!a@1Er;a9by=q#9YfM{&2tCwPpzZ7L}#9X}_NvoS3klGtD2XDk&y&GlA z(t94KJBQAKgOMu?aO7Zn$k-F#jj6r+p452l;e7u_l)dZ1Gp~1J8Y7as;#|zV&DJ5j z`h}URBH{IoGiF5+o^y^!xc9&uyd8Vf+Xde^N-L-l$(z?WSNR!gSFO?*@9U5yg{*t_ ztAb<~jJ%s5%N6I)OL*U%EB^MOqNH#<_FwLSc5J+dEl9X?azA7R@u@;V!czW*QIa=L zPu$3zNneKS%b?R^J)a(H=&UHy8tzosofWm(IXUXHtb?-;#B(sT%!uTONAaY_WOscw zao+$bjdM)qa0TP@nM`3bcAm7W@mJW9w2r_ehxsKuV^+GnU+5Lf(f2(R+O4mZ*Pe$a zVXe|Dmbce?WTO{qg!W1v#@_J6p`1_o{9`I8SNwHQ9jG+<8^$zeOzkml{kcHpAU!+b ztT(xcy9T>MrdfGUv*WXT-p8wkeh%4)q;7)J9USvAIOZ9bs_Vj)^N`B|&7LgMvo`Kp z`Tb{HP1Ng70kylZmr)VN*0OZy?aR`CITX95yP-}C!?VST!mo}Ad&3tE4EH40d#Z|0 zAFAH-^nuS(IhzeCtp0*?Jx7qfhyV9C3jK6Y;g;B=_?pR<<63sQ(POydd)j<|h#q^U z$sWR9-?^ZQ686*cK~*IO)X1)?WHan@afd+rf0sb3mD?3Yd=mEq(4ay-Y2`DtL517; zXW+}+$;c_Mk`*PP9}Fsd*6*oSlyJseXueBvr*6+lTzJN}EIsPynl~mF@#)t)C~1qk zAN@e9o3CQ^K+=5__oOQdPr6IJxS}u*VhvRk?gHPXdyqzgo-tZHNqxMc@Hvp|LamJ} z33F^k;jRzk9tR#1-Xr@uJYIrqnd3E{SL}*H&gg%KY+T`)SL$wOT;VIYCi8huMPaxj zm{1s=@J=WUd;b-MU?(3m zGx~}aKvrMafWN4T1s$}#(W*a&Y?}3Q>SB<4cp$_Ip-|}kxJQh^?wNGs6mO|cX@(MPmWEygCE9`Et*17}KRygph z&ix3~?hZa)^Uxf(|8UjXv{Vk-x1gOCpB2qH` zlI?KaXHRS^9EtJ4U9gpfqYf3#DLE5ke<3{Pl-%+pY(Om~k6|WU3R)g(Ba=+WdgD_S zOzlRr+dxnsdvl=NWPjMrxm}DVA>QXf%VT*vBdv6`w>q~Mv@6|LQ0fG^TImk-)aiJC zK8o5nOJRo|`%?QsmLx3Ek)XFr_{IXM#dRXjoI5LQU+-MVh8i`1W~9UZ-;6YS#FLOE z8P17VykTEp^g{KaX=z?-xkHdKE&J89G-veDMpK9DPH9>?yn&c0ehF8Sm54Vi&P{zX zJM5Ua9O}AH<}A#Fp9Kxbe8%^tCcC5O3T#m3G^ED2sfNY*Z>qhk!6zK;ZbZFvUxQty zfI0XMaxg0up5x3)g(o#5iukmk3L_&|z}h$m)Rdl!f^mmnSQ4H&42v`7P_t`>-LNFA z?<;Iq_g9cDOMd~^D6V6drO(0qFS;0XGID?wJg%$k&&$$%K#9=^lvj59f@F6x_Qz#+ zE=YEVN4pce-CXMt=R!T#?#fRdh26l|OCE?T!L#BD`R*vYEy^B<9xd)2T({T{u8EOv zi`v_wZzhhiOyND>)u@;#;9lm4UQ}L z!SUW;aLm=7u~ij?wXtVx1+Cm>?~8sO?FOX6T7Fct8x^mEdnVyNZ)_5t3XV;}bH7nh zJ3ea1M{P|kZ!UA*DR?6Q>E<#eCy556_Q&kl3Rz9z3s{Z(%!uRT7oY*Dqh~w!9B5)f zZE+PwUUA)I=e7Xpol4%XzFi#dFy1b{{b=WQgm$8pZM0D(dM8_YVl2_bSjve>xEGq3 zj9#eGI57$1O;I=+OI$D4fM_KcxtHSD3-4e5#*TyhaXWv^`QvBoSc3Q2X;mePwRYU!>&Lkp?YuO(!t4enbL==Oxz3LJCXIF+o7`&0gOc0rI6k?{jz@UE ziOIcoKFRBkOCGTEDaj%`PECGd$5WCg?09;z6vsk0J$c%WXC=>?{M@A7ju)qxPNBOj zCH)mC>90yj|9nd2dok5v_Ahz)%PGb!aj&Faw&QE5SMB(gw}02$yR_mIq-9@{mVNKE z;`U7|Zhx~&xfz8@zqDBTfyL5~D*2Pef5RV7@A;;kPw&ZkPr0vd#{8GKm-;4F&oB2a zvg0d#d)o1hzOsL-Z*Mz)x3BWmw_iUy@854rJC^oSIs^NC+Rg{}8?57}l%E|xrTh%} zl>CQz`EW14&7a@t&+qf+5BT#({rOM*`4S)JDKCG{%b)l17eA$Xd&}$J^?J93uh%Vn zy>6j;?X`v4q4yR!%Xi-`cD7^xEq1kI=@!H7IAjZzXO}Hho>%<&YySK#fBvpNcm0)K zNq_nE>My_EUf$o!OTB!sKi|=xpWc5jOLuzzz3q5b|1aC|-2P+jcwYZ;I2O7K`yXb< zi~Ap8$IJR3Y5LoIygPlo`~3L>cK%5>XG`YmlkQqOqF?&sYg;OxZ~60g{khx9*WXsY z{y?(mapX<-h^XC_qYCgKSRP)hg zrJ4_}@NsS}ov8j$I@ykQnth48+v}H<9&hrc{`gd>#_w~b8t2cKYJ9&~dZO9ARC|2@cWd?E{#&d6mTs;7J8*0D-@#j} z|Bl*P^}6rYs@H@3`FMXm(VtK9=TrRoRDXWT)@p}Wy!P~{#uQ03m&pO5wD2Mts` zj320aIAWms@x+1Z$CCzXzC3QA=F2GqHD690sQL1gfx5n*KJc5?AEpmH&yMH%bk6hX zTEW&o#pM$^>%Og^SAuD+rjta9hARb{=Bz8@9)n`{rOyf zeycyfZ3pG|&K;EB`@H@EuV3i(k9z%(9hKfLJ1V_lJIa6fj`APr^`pFgU#}nQ^|yNc zZC-z;*Wc~+PkH@wUjMw;zv%TZ?Wp=ZE~k7<$tfRGbIQl*UOwH+&+_u~y!=8hzu3z! z%PHSi

+Vx4YHb-R;ls^XCtEzlGlKr(VCr>z8`{Q(phP*T3lXFM0jTUSC?Satth2 zIR=-j9J_e=FfX6z&nNlwm(b+$$h#ryy6yAy-)Px~tv9Cg+e@ z$i82P-{3`AEvVJvk*;>bzTsS**|9_oQA?7xIm$?qwSwy058y$%$gw_2mm4hxDGic5 zx}uCESsHifjg}Wu-YrKwY;=2HlI+T(j3iklDDSpA6D0@Db0a-1aEE(pbSHYc-%SIJ ziBU+3Qf*Q0g0?nlNz&Gt_Gi#GL@i0$M$^6lZFAI;q-_N$2c*2~mq)ok^W0}Zi$T7I zK=N1)QvH#ha1*EFDLqJ0NO`v}d`a`%L{J+0dD4>d?szYo=g#u9z+C|9VcLi4@YKd= zHe{7XKLm|2dIs8RqlJ*w89fJTF#0RBjYh9R)@oFE7Rq7N|GdO?7;Ohx7f59zsch+V z%qb}E_JSQ{^W5>ClvB#G$thlTziS5dfK2g7idP0w$w_&)5_Y6{Zu7H63*0uI?suO9 zl|!p2Bt@wNDGDj?PJ|t4p8K{Z-b+o(#d^Z zrg&YDDIQ7j(uE<kskV0;F_F>EsYEQ@Z>m zsnR7W-7=8MK~gz#M!$qFN%2VOBmX zfT~P;+8rXLMp-(U<7G;13}i};q|~ZG$~`IX{vYDi81=nVq z8BLxqQWVP4$t7N@T}cb%Y4vm1jbB*i18lM}tH!)=2{KwV~c9_K_nI#3#5`Q04Url_N|%&(UqZShm6x=@9qnaGx5?~QAYGEu zB`IB!(rpGQU6RsW6sZ-YbV+$vgEUA=m!x_oDcv@++u}zUTOg%NQo1CiyBMT&NlLc^ zq|``xcOFtBDK(N(BPq2`v#UgEB&9}DY9yuB1yX7xrIs!Zsgd&T8l*;==kE2SG%}|B zI?^C14U*CzDUBW=r9n~}WgwM^ly^@cGD-b~w7_+EnNrJ{-7QFs^p0!slunj->Tut@ z7b6NQ)EYoajil5XK}wC3cheD>G|$cUw7}g6YBKF+EuweaFi)@BePc7UicC`ER*)i- z^6nl)X*1d%z9dB<^-QKg)&Y_SDesoSgQSv^RC3b&?oZHmn%$Z3B`F?Bx#}|QLSAP| zLSz!wdgr5dKpIgbwIE4#nlZb%h)hysQaX7OvNDizO3J%2h(}U9lH!pRFK2e6e~kVN zN+;7jDKcehqjIx*4SB8vDGgHI9g8$b^IYE30@nblGVSY#M^ZdeI@t-g5hO*f1}PpX z@2-R|X`Zc5NekSaUgmqT+08|i8jvEB(#i8)=6kW(_5C(h^&q7|%DbN+9!dA{^(H&? z0rXRl;*nGvB;QX#zMq1wwq2J-kRp@v?l*``QjL>T<0R$2$?TXKNvV<2$yr{e)cE^7 z-*-VutreuyNSIZST3fUu{nBv+x!BQ2Baum(T*fLmkB!uQA%0X4slGKaGm>tJQwbAA9AjzW!q`Z)n zZk^fP2|JSP>Z2V=b`567UfgK(1U#Ce9Z7brru_r7ZBa{-cCl$kp~@2 zx}uCES-OYSDLgVDU#B2xdqf#YvN90%1mTf0dL6xlq}4E~)#kc#BkoF)Bc@A|ZygBtGw`i9%EOnW`Hv*u zM$-Hy_k1AIF{>EtE& zlCTdv9jkwk+JhvIG~Tw)yF1{K0ck!U<=s~v!df0A50X5}O#2)>az>v(jgwZmY49K^ zf8|EjS|IsWg7U6+16syt{>37BP=?Xng#9a!(k02a+B|lIZ%x#aG#}JP8A%>>pu9T- z9t}}TlD5&b--5O&YDv?zn)8rfc&(T)$Ju0TB#?o*F3*;}xyF&YCcsb_LJ zsMciJ^KmsbV(%pR{R5Mo4ZC_!&tw6p(PRr@N0MEW$sT}~lunj`noTwgkz0+Hz@yD* z>_U<3I!yK|w4EUJ5|Vmimpl+9{R!6ECoVw^f&2&ssqV{6%bAeh)s&VbZF!WDB;$82 zWJi*0Oq7u%s|MxW7ZJH8YDv=8Mj1)6I#AwCghzeUlB8{jGLmGCpuGDAJes1GByDq) zktA!2GLmGAql_e3XOxj7>xwdxWSPxFZIC4E5oILFav=2sQr=BQTb4&VlI$u$J0X^k`nGPMjz@v6=4sPCW^K*|9r?*=SFF9ykjB#%1N zo&XP$@6VugvNJsDO*_w%UkO5{C=DP*xdEgxP12K}Mo`|Jfyhmubn@q&b3wG!SnwNKr_NvK*u+Bt_`}Vb2^+B zQMy2iLQ<5ZcZfn#lr$*so=21nD4ooOFDdUn-6~SqdO)UlB*o*GQ}V9Qr5J-C`I7Rk z622t)mV@L=l5eHi4TooU5Cb6p?GUVtnE>Y4CKFe&fefk&Cq|3RArrIXDb6Xo57o_sx< z-2%j`G}`Pk)G0_kjFfj*!=u`0CunPoIA%zw1FTDGP4)t!)ESM1UA+;XRh($tF$yHl5ZDCz9jjkvti~Z z<=rvpFBy=YV39B`+ayyw$`r2$NbyLDS7sikAW9CT5|Q$5XG9?>3Q1AQL5f0BluA(E zorNeQT@9*0{)vuhCmv#S-zU#&ptq!Cf-O}ouvk>XLNcnu)MBPm{^d0dF{k`%8Aq}hUmSsC$2ibqns zW{~2M6t5MOcl?qKN%7jE9Z56h;wU4@w*!=SH^Y}C->zs!l3ltl?e2#iNp=~K@KaRtC~FITy7gY0IOGBv~aW@18+wRZ&Zlw%W9BKwA^FBx!3+`)!Q)I-~xx&@$1E zB)dk_j)1l)YDv;IoAwSwX*D_$c5Ts)B)bmNo&#;C5oi7`qjvbF`>`CnMwJ=OhF#9+ z1hj9t(cfTKY4l@gtBfv!w%X_=$ZCvu$6RYP=t7ju=v`>*jqZR)qfy`QqC`fEAZs?- z4<4;X+e6!C^gOg3Mt03JdIPd9qp!mw^C{-O*AvLS(HG&HGa3w8xzQZhRT>=&ZI#g& zXlo<`)fzp>JR5NxQEzk(w2elmGtWlfhpgFXIrD6E74r=8I}RrM5$rmQ?u51zgqX{q~Y6NK&PQp4H>5{YxZvy!}8Pit7quJWQO1b#JxNh|fE0zKD1$)CA4yTlKzYZu%z^wHJtpI|n=(ZqA@X$e(sEJyVw6#%2lB^DtcZFA?PNSA2 zZ9|liBx?la-PZ7EidvGi%~3{@tQCakVDM;*T9UMjql_e32Pp5p43AEugE5jxetdvb zYh56Dq_?66=kbiuaquAZOl*#gvYg4zfVSLZ-$FfC8GREnl4jOwkVY*j?%1H8P1>qhC9*d)vByERj zAA`0tYDv;|MHxx5bSdM#0FMmF_gIj$J)(>xSs4g-r0~c^ElJw)C?iQ$6=fvJYNCuJ zSuH5#U;5s4$^0f<+wnvnaBr5}H9g&M#lC`n{nDP-Qik{Hab+UyXZs~2v??Mm1}Pp% z@j5|T6_E070qnY>9Z7cSZKypNIn97pxF=voQtS5sDKbeOWv0CZ9yyTqBS_f0UW&U< zqkEwx=^m#Fq&*{&_KZkcL5(rlqZkX5L8@_*YP=fcXDPF5LuAVQECteRR%6;Nk%L;0 z@=Q{m>rDF>_|}88-$cs0&%vVsBoC528cnfdDBT!i(|Kx!Xmdw>*~gw-KD zNb)E%*|V_AnccUbB_V&FWLIvoFClWJ(W~&NG7rA%Ldv_rzZA)13}oshB(*}d*=4T6 zTnAFFNO`v(d`a@H1<98r-#WAVG<@qp+Oa0#eLeV+_)@44J2O@+6cZR`7Q>@mn7c~vpWI4ognR1k+2s8Uy^*gK=LKY zH$8}U_3+Jr(#Z+%AmO(`p5$9*vfE*oGdq@zlz07~7Rj#MWK-FKM$6z)Wggt~CE-mI zc#z~V2Bch(l&fm9(-FlGrnn`*0UHFpZ+W?X; zNxqF{x7i%D7DzQo!ZjYgB>6Uj%pbk@TcyF-Yl>lx~M5&2X>#xbU2Su6g zw1LvebFd@j-MC+2jRcYhNgf@hrAH@7J%WU*5Inj-@*v40y&bjt!6O60Z#ZB_%DaMJ zWAuRJL6S$AX^)3T4&~hhLB)jq`BS}^X%Dc1SQ5Cf$X~#qvNwR8C-ZjIc2BdyP%DWwZ zjrs#AeOm{qNcfVpTh;(l6q2Ic08$i^qBMfgbFM+%gI2i9 z5rw23v}TZ^kQ8MRNKr_N(hADEp@`B3TH$_=D5SjOUSEgN!O(Vs{On`0FFubxZp63I z(mT-OEZAj0e$Fx3v9Rj_QeH^POIehW@D2uib0GPWv|CHkd{quo6q2G;n%!dfR)KmZ zS0Xi1-d*SE9rqMy3}o^p$+z0tV9P=HiNLbUZwAAiYUR z(wqIHylaFnNxtP~XK!YLe7n&u;qT)sN$woPs{*ByMerqI#Q#>LQc|XPV?e$wLB1_P z>e)3Qe?153dQO>qYeBv(LGrB!>55ItyRRZ$(mU=Opazg{L6AI}K>ivJ!u!Cmqf8#n zAbF7F(F)RD0V(e;LwQNsD`*30B}2-)YY~s6c#A=bM^d~Fv%3{hIzhgDO~&gqW%5nu z81Kih%YZark+8RfG)S`RVY1=qIb}xA!6OIqD*%)2@S3w^-T7L zF9|CEPpC=IV#wr6l5dCE(YF(X{@f%&UxNo_^6di2mn7eGIn%fpz8R2Okc2fMe9J%@ zDY>X6;mtE>%Z(xE+3n7BtyhPnwIzK&Es_O1B2&uZZUH1Ux8v$Nd#l3z7#( z9(5p%3X(& zHZtN^$bnP`q`VsrZMo5zXroFa_Vy}JIvE2kDeqc6sl3%Ddl+^#pcU?EXi0j?Q)|R{ zbwv1ry&iJO4$RX)JXEkncXX}Bgw8j+L2^e3Bp}D(yfYGlC)!@j3ik# zDDOV?1Jq>HlBBIO?at8FM=eR(2Gib&8gDcj4ZEgjN0ME0l#wKB1?AmI@Mw!#lC+DX zj3iknNPFBQ?QxS-8(kpZJ3;bDe>mH;iWoCCX zd~-(Mfd@$|ymF8{Nb;yOyNBRW6}2Rdyh$LUL7HDkdDo7} zB$cBHBoC52nxl*)*&>i%HG}-B8HDevAYL0tQAqMw9AzZQUIZyh2MF)sU5_~;+L2_} z6=fvJ_(>)Cra^gE4&Mw&>5^pEBg#mUm4R>%3y)mXlB6wkqbh1i(vFET zl4O%W%3n>?lBBJTGLmHHg5)vtedO+vmevi~h zxQ76Bf#ge)ulsE9O@s38=kU#ddM3qx6yX<3pdOIPmn7dZ^H>g#oO$dHI}-N(LFFKM zkmONib|*ng!drTvG0~1ByK2+EjmR}1e=lUR@4}-Nq{t+B)R}hc8_-4|-8qo*?q~35 z0LgEd$EC zrKp1*Af-W)?;w!oVv>BzKK_l2C+Vp)Ns&p4Owv>74iI*uu0*?mR3Z}YPF7&< zG};d7rgx=`Z%$>5#z0F_?nz36q%=s%eHlpaQ00tHgD*+>BgvN}Uy|}y4#Lh3>a^16 zCbkhsIVI_-evJ{I<&%^vk|L87nWS9Rf)u&lh|ls#$`whzB>9q*t45GofrKx`Ay*`| zLK8?&xk-AePttg61^E^2$U}3Vszm!aNl_uk!V3pZ1T@t>niMAxkuG(Z* zz^=yZPHGilUV|NFva2(@+hA93c1)L)cfW%jNp?-9-Rv=p6w?;HB9gWhGGCLXeH8I1 z^EC{~dN=0kudvI2)G{Q!e?XF5naKv< zgjzE@dme8xzH304?5a%55|Q*a0ZH0wlkJTtHDVKTlYK$+~?Ov^U{NO~iHByESuW+O_c*)jJdJ^d%iF7tWT5TlUv ze4iw38Az=~%DZ169;w51fpQ={qbKS4K1sfnAo-H;&f?8jH<`8_R0WbRNzeC5@~t-6 z+*?qSAkF+FzcMoIkD#ps&2vwJ8coLXHW~2=eydSCv>iq(K24UY3@oJ)$ByF8(zXWYP$gjdpb|gmyNUH)8e#rn?tF-WF11Wzb zJZ*ut!)Q9RouC!&Q?H8hZWbs#oOYK%n*nLIC1J-O+CdLwCI1R7gFB+1KJw%*y2wj{Nm7) zJnBt*7i6To`^@ViX`3MPfMK7)~*`urtlkq*@dXp9XS)})On;_GiNXolW(2~^0+f2)ukfb*11f`RS zu*+1Co@P9dAD19s@+fPHvbHEA`I1LjXOw034)I97Z-7)oIS}sY{(`v}74AxCYs`*sD$a~{B-z!2@U9T-NO)%WrbzwjhUh_(N0WKX zfE_9C-tZ)kMbU#KkGAMR!rk^;sBw@ymV;DEk~}&=>4a&J(B|+U$s?%@9wd2WK=L5r z8+7m>$zu>mX^`ZR1ErIC*paZ}d0QlpD$}y{Nq8R^T9ULire*#}_*xINBx&nS%RWTP zyD89;q-`?ocOWC-O7~Zhv~8vx1{n!+gePe`P5UdzNO^bUJ0fW_qgbNzAtRwg?~0_& znU;41q`dnqv?OV3K>j)nQlG2`X$9J3v$LtY^B^AJcQAhS=9 zktEAS8A-CLC?iQ$6J;dH>Om{q2}q6P$7R$uMHxvRZBa&&tTW0;l4VARcqGYkQAU!i zD#}Qb)kGOdvic|^sZN_f{yGEFOxR{Jj%kv=vV;7U-DLcAb>_<~c^67f$~(S6JP@Rw zoipuDe@CmDmhT9UjM^&Go(L@oU+Rap2Bg`MguM)CNysU#tM#Vk>_}4XuLmi$CXnXI zg;CaKGLD&n`v$v_k*YvyEt0RbD65IG`Y0pG?s||KivNMy1^M^6Kz>#>**IvcqKt$VgsdjYNccTAWc4OvtCFxw z3|SKht?CjZe8UvfX0irP`28xV6EeSRWxkmNzjhxJa|%+uP=>!j0c{SHPR4o4yCt4f z$|}?HzMGVHuR=@mW8bu;DSYM2wAXl&w%)Y1mtopv&{8Jt|L5*K;4CYu_TAdkGu?B@ zs6+`p4(Ui9G7@@V2xrJS2-rhD-hxhoBs1 z$RH@`K5wn6wXgGU5dFB{y}vs@7W?UUt*TvByLRo`@ie1X>lIOYydv|qqIYZuwT#}& z6PdRiz3MNbzVIMkk$Eeds79}%iMTQ`(#X8k=#BM_-b?UGGjA<=l~%+Z9lRp*)}!}h zG*MqTX_S$98_^r<8@)fmE6u#k=$-vOwq^7_i&tdcR`gansc-b2k;uI5=vA3TeSGKH z$h?(J^A;5Kh2P^9nRg77j$lwafOEK9~h%7}Trnr|l5hKlLBTF&GQ-~}@Gp10Bi}>mbDMXfHDrEH# zS&A0aQJh4ah$~r%EX6cWA+i+hm|~?0EgnhZT@$5oe2cu^3S?T< zHIZpG*F>h(T@#tsfYP-zi0kNs>|2n1H&4XXvZPsSv^<5#zKqw7DVCecHj3I06IqJN zmdfv8G?9J3PGsIHl#ZOytFO`3AS;!~zAaaW?C31w%JDBbnnIRK!@VN=7M#eu&FDRl z6e9cDo5;Ma=+&qqVm8ciUu51klxC_>nwxEv+ph&p56jO%FNW+%$~I&*64@-Rvb9RD zqk+iIS4FmtYV_)RZX&xwDKc*jviwAS;b_)YkDBHTB70}00qtL0jaSqcegrikdm=#8 z7lu^QsKxh~qxQu)*`uH|kBHiiNwXPVWgF$9@0p8uwgPVz8e80zh`Z)cEygKl5u+4Z zJ!%WhWyCLbL5--L`Vcdo7`F*p6S8&|aZe7d1*PjlQ9B>44cRq85m(BSW^Gm3R^H#C ziRf!{8>M!R-aXN((K{WgLDTuZn^9lb4yvQgS{#*#<37}g+P4#N=Lc#=O>l_7n!#az3T0vzM$UTgr7!S@y&k>l?V?nA_co$eyrm%YC+TaHkT3SQJ2$8&}Ju8B;mxh68L?wZK7 z24s7H$o8lvWP6mzjz=P^Q45+LcA=J{zHkN9hGs4Fe4U7+3tD9tygfc8txUPQOdP8WOb|TnsX7ER&`BeTFo_)X?52`rZrp> znbveoWLnELk!fwno>vxi6ql+sc9Zs8BKuxiHEIhiKx;s=7Ar!vsI8gE-sY%BZBsPS ztc8AOv=OzF(L|;-qc(shN@Hi#ZbfUk){fePXrfsQefO>M4R1fl+PUtUD7A}g4cD5k ziBh|`)^cqcWc^-b^XIn5i7ai=o8v?lSAncXBI~|8N{rhCtrg=m_YrX~3#|>M=ggzlmozIuWs*t|XG;)Y zrN&!@EQN@>T1iV~j$U2;s6}rJugJW0$Vw&R83()#$krj^*F4agF;3UvMEsiImnl7D zvt|)bH6_h*Zb$DrXrjJwXQEV(-L($gy{<&UJ zdgor4EdyE3ZTE`$!dSc_^A>yN{jvh3eF5U>O5(=2w+fAo_t{0<7s6YM+BXt$l!WRY zC*o`ZtpRlu{fX#JP%~=roGHf5v50ADd!X4dv=zN$@wTI;*^-ERXlRwae0+h@_yTnl zyW?%RS7f6=(=|~VRa|SiHVsOn3Y10_k868ev3HIWrBMY+M_9<#QH88^MK;pZAnxo@ zQc=3g2&Enoy_$E{qgU69Mdocl)5DgFQp@Q5ZX$bXw~1y?MToenfw$$Fh(B|89-#-R`e=o5!b>=D>838dX-kh3?8q@yp?@b(qE#9 zm}Pv$$h_6)Ra#MB=*25CZ!LP`w_c+6RJ_v6TaR9SeO_eWDi)cy0ohDnWbf37(moBP z_p<7_bt_QnO|Dg4tGOn!xVmd1(;BXcOl!I(GOYzo57$v65ob>Wv|rR-MHBI6`&im) zzdUw|7+KM(Pg=RfgWTk4y6dI94ePJ(Bh%7~Ae`yW08f0ljshwS`yVh_` zWN}j<8&yO$S~NXQl-l04mTPU-L>5;$AeTjCTGcg?X*FnixI(3ecmih%tqY~I_o%&s zw-L3E6Y*7$#c8#u>G&(^3*Bff$VM}f%>~*J=Qxkjeo-4ooG7*5f%5K!R)K7$ATntRcpW+@tY?Pw+985_LKm_kP(5yua-R@8P$ z#1nLhESEN3+tQ-ccMr;14YJm)yCyQN;hM;_rfVY8TCRyqYr7^gtvEQg3rD{SWTg_B zx9Xb6v>G%$yiJWnT%liz7J_Ci&Pv2Jc&HJzW+Hxl18Sn#Td<<^G!>M#dDMPITpO}> z7V+&Ow8|k`@2iP;)3(aCM1$ycA{*gqkhOCYvKoo3^exv!rnOxYnN~S8rxlr2bxmYi z%{7r}b=O3uO@?d_71>NU5M|P3bcgW+~kX@${F{`4j zDu=24c2C4FM_);+MeS;}B*b@~(0U+STMgi4sj>suQJiCgw3Uw5RCF%<^5?P8`Oc9@)iYXRYmeND^ z&bNr)^+0PtcD^9uT3XUlJ)$?>tBl?Q@iw7U4`_Ng3#}Es4?}IpuEU8q&qJ#mnUB*V zo?b+&LLJ4d%Ng~B(-Wnf@mgh(ToajAcTHqk!!?m< zO(^YyknMvlDD8Ps)3sb_R{Az%=XoODIiqfsqm|;vi8xj)&v_4;^>&es0@WC|30@KJ zTtMSJPGoU4$krj^m_pnnj}uv39kMZ2M88_02$MZdltv%O@@vGn#fY2YaUzRrLTumP z(X(URdc?ILj=G7sQUtYQoUXHq`oiDQDzuW#MMae5DvmQy+Jcac0##^ip))=aNAVTe zFFj5~9RF{+CbF&7a!q7f+clACm1BLqkZD!dM5fgsyXGOX>+&Mo(sd}!ZlYIj5jUcy zw}VCYc5pLldjD5s@Bg-UqNev|>yh*}s>oWm0a=TStR-8niLB<+AnTnX+xl&f6Q!2y%lTEH)RL}MU8}h! zvbefyBGVes^zd7@xrp~fuBO!>8>K|H6+~&Yh~9<9(G#Qh(nM)*j9!h@?dW{~ugJWW z2 zy=}-^T$Fy#3*vcOQb@BD;iR0R0(BGz;1zLiERn@k(JVia)kDM+bgR=NAd9QTI9+iS z*?7I*01ZAMLZ&P2=!(OOZ{T|rS__!U|^YVoRH)SgGHOwK(_L>%Lg$a+{6 z;@Pq_Xvye31FAvk3^Hmrpw*$YA3+_(BT3`Qnl;U9TcHuXx{57gpTR3KZxgayL>sWR*DK=rFuWqpYu7TexT?pA z(u_OC9YLHli>rB@$l^qNqmej~#nnAdWaSg_GzM`Zi)(nC$VLkhPxP!!`*~c`<3#C5 z663ZePMYP{ie8O5BEF=9S7hEcWP7}*FKCaioTB{hBu>QL^>wIk)HG`r@g^o(Eo%Bo zsff2O(dv=ThZ;~iCPTIlPJ?Ve64{7UoSHR}X%#5#M^M_2T&ucPb4_G%b=O3uHCz*! z)^tr|TFW(&X>Hd;rd3YUzIqF_6!9w5np!0D>83AdgEDT^xlG3nt2=U74cONydv{9-78|Qf>&hT zR`kv_o?1rlS&7Wsj$W--#0&th$h?(rsz&jxUx;}pUTNm7Mz8h?5#Le5D>82_dX=+? zqsw~K*S&T3inv3GS7d1$(W{(A_Aau>yiLe@w#fF1${AS`Sr4naCNiz&n#i=eYa-Jo zL$-ZIwtX8OC$hLH9w)N6rpJjat`)WTc0<(EPo?p#SZXfnD0H1)WVLKZEj}k5;|?cI znt3Y?r9B%>l=hjZO+l-=R*Tw?(L@$kkJ@k0M5Z+$dvadX7l!bPQj14#$NKcE=shKo zd0Ww|EiK}A3h|0kJ>1)l-WFa_s>hic1!kaCAZEi8D1D?xB0Ha{MNMTEbrjd*tw(L4 z4U8xgn)@ugJWWvvLZN z^~oBPN)Oo;f;wc!BavO36IlrwkbPlN#NB4r)`U`TkKVH%p!Cr@ZX-$xr89!4>CJm- zHXCU}mR6MZl(T(pka-)B)uZW}DD_>}TCTNS6QwpdC+AmzOdA8GaS}@7q{me~uI8G^ z($*n++Cjv)wg6idO0(;z?Lr$gV_dvP5Va%JE*>Z1x-x0ou8I1>xx`hzrEPwFBF>nv zV>CnSDBeI5^@Y7Rrq@As-BH9>&Cu!|C$f9${g9Qu0i}{g?@go_aBmZ`uak>-Qw47; zYFe+TFT9A>hQ<~jC*qz+jWVCBv>Gi$eW4qz3fWt_BKwu&8f5hlrM?!m)k#s0+6_K!;;+n3BOl!F& zGOZ2S`MHSumz1UQZPizAC5yPWlr-D7s%W-7MBFu+$X1Oh;YZ07;!P>_PBd#> zk?qqB*F>o$U2D45a!r(4(zUj0mG9(rh%Bz^n#i=8Ya-L?u8B-*xF(t&UZF-Jo)w}- zO~|elh&XrIgw}}K9&a(4MQtKl8|o-_O4JvA163}N_Cg|_QQwq(0WDnxgJ^rS8Z>Kh zN+OP&P#tZ0xIB@45u+c?#;XQo&k%^XdP&@Xdz;a#`MrqeEb+FY7LS8b({H!7qo(=2 z$i6&R`L4Gvlv>xds%tgZM5%RMt3!5|Tg1q)8Ep!sF(+#Cp*5lDVUA#;BA&%zZ7s-Bh-{y!em`p>%cbU; zD7Cn2b=M|CX?6%%EgK#uvb0UtM5eV|6Pea_O=OyWQ;9Fx-OXqQrT!eXC(x?U*kT4$ zi`qMhOshw2se5QYD9!MqHW956H9axdjM@o_(lbv{y9=!abrg?6?Wk=!Xk=RDqTGHW zYtx!*BCAK;HIZoz*F>f@T@#tsa!q7f+clACm5aSBkZD!dM5fgszWPUx5b<@fEg1zM zYh4j>tQv>o@@~DJ$<|)TW_z&)nlB>C*tY?aUzSG>~W&hVH#C5Kv*pDE)<1S(pB}E&ueM^-3!KGQNLDu$l*F>f@ToakrbWLPh z%QcZ{ZP!GmRW4JFbj~EQZ6vZ9RiS6>E@SlSeq#-q9tPB=QJbU5J_Fg@Ok^W}BWm$^ zpQvfPmzLTJO4s3HTs*^waXJPxJ+9?(qBL)haWAMPqgPj4Md`?Xd2Y!Dlv>EOrfV(N zM5%>bYr9stBIhTvxT}uxCL2?wre8ODp%(?k!e-eM5fhT6PZ?b zO=McbHIZpe*F>hZToakrc1>hjg|kwthsd<5Ya-L?u8B-*xF#~K>6*y2mTMx@D%bjY zA=9d^iA<}xCNiz=n#i<f@ToakrbWLPh z%QcZ{)$8**M5fhT6PZ?bO=McbHIZpe*F-758`O)xxHY3FWFuESYHOm2(r6a7eb5@N zHKTSRn#fv1l-A~Ptr&MDaiX+Wc$_p_M?1#dPMpa0JP}^T_R5Va>HT;`<`tQ@8okfp z6{Wq~y|w6l9j}Pl(tXUnJWllGLZd}J#*NyBnnQN%7Nt?Z;~Ft;LE=QS7GF(dandZm zW{g`2uPC(;lv)U~nzv%y`oxJ+3wfNh)Iu?Cd*a%V9pgo|UXiW0a+BKXAmT)Jt|78G zk;PSG+&766S)9n?L>5haf9oJ;vQhoXFxt7ALZ}MvQxeIFZGPEKX!` z%@{XCoXEC^$jT>5?F`xRyajQ8e_L7-vTw|dmBK9^nx@pWUoqSR_oYBeae8pLx(+tF%} z9m|?g+W<{uTd)f49)Gi*^fUFOR?Cy=op3o3k3X$d9gzVags4pC@c5!bD>L`|*N^3;#4-;7~(o)Zk zac7aX9pg5=mllF7PL%rdZOTvQ_7x~SzX4gCG>fZ7Z`TgA8kAZMO05Q^R&#F+;%N+K z9U_YpSzJAOkNOrpBGP>1+>G>fw3bsl(kgf>w=2JmRDwv`LA6NxK)q0!cSh|bw0_qb zQM(MS8R_RxE7D&@cPQt1b~Li5a-^lb46@R?b(dlv1p?7#wL{N5xw8X z+k&16S3&KlZOVE@)59HTm7k~{`b~x^WLI%Se3@rwN)K5HYEjd>r6RjlRgc;ii4$1~ z8d1~xrlNFJ2(nSC8NDl#qJ5{`MEAf6*5g(%e$O0|SiEo0oZ#MM1c zlZk6lMepT!Mdq!$SH$m);T4&;;a(BnG{!43Z_~Y^ zzVMY@skwVwQTyJv8O@;SVI#aEYe|u{q{v#b4e?Y2aUzQoS)9n?Dt9UFXXGrJ9_}ZF z$Wn+bg~(D=A)aa5jdt-kk;REDt_ICoY(Si-FKnL3jsbPF>0uI@i0?oqGH(OT_A(Jq zC*T#Cw+Y#OVi8Zl;T4&;6}93Uv=C%hNJZvtNAE&-MRrUUnYZ!_m1;G-BAy0HWZo*8 z?OP(AEyF7^?|8`iuE@^vYmlW7aj%jTB1LzY%# zX&aDTLl)U@j!*G8k;OG3+j~T8LDnI%oLi9fArWt#Kfrc#ZyU1yBC`G>vb2?ZRC+yw zA>xe@(u&Mmjo!D_lF=LI_fTq6kE_KvT`LuFomDe^j}uvb^%!^XBw8rO#W}ynNwc^{ zj8lH1H2e2BX%^Rvamr7`@2oJ>7g_m47T1b#@qS*6i)RELC$Gh|V_bZaJjTUy1CNu} z;ws!fv28B0H*!U`UXjIBqc@%}KsLroOJgUL#!kqN`!%R9{EZrkESEZDBbUg|CPe0K zKz24Eva<=1l|^K6O~}qBM0PeIva<|8@+-U{ay zcCI1f?lAusr51uLt_pP&I@b`{SJy-qC$hL&jMKS>$j&uH7ALZ}Nl@BDp|poW{0h$+tfN?-v?80|i&E=Csdb}QC8$DH0#Rzy=vD8mLAExL ztxaTWtH-#T$wg%M_eGXVBYJ;@SCo!S?rlcz^LRz64cyy`-pU@d0mOB)M3!?qdRIad zrPhGVTluAGzA;`=sZnO;j@9Vx#Vaze$h@`aJqEAHydv|~qxU?#BJ+yO+lbzq@rukV zGH)|_b=^^9UXgiQkR9Jdw%tUw-9(mRD015m{S_ zEUkzV97DT6X-)&BUvz?a7gTKpS$?&s#VdS}ozF;1y#z|V1hSm#P)G5ES`FfCc26U# zn>5S05xuI1DD@ZjHltVd5ZT&9wlXH>MOGPiuhV1DMS`m zVPvs5k;RF4&y_fl#Z{xG-*FdNyNIl$A}gsVwK!yHYmm*VL_8@*&Z0Did0ail#g>e5 zu_ZlDUdyi$y}Az4jHK%ztw@LHtUS^iD*gRhTgP5(-$-A8YLOO)>XFuh8j&`Knvrz9 zq!np*&TGdrGqC%xlOkP2Z>mSqui@1>;@i|7WNF*(6`5CL-U@Ssw0}V6m6o;^#Ql%&aGY_fm&A3H zR7)t;65`B3rH|fNOZQ4kwTyAGmQboClxhj3TE@6oOZT?iE8-}`+S=|FSy~a_Ji}Yz zIfqnBDAf|;j!E*S`g&Z|<3v2ONSw&xY91%D{6sw2zc;1 z*OJ#tQ1v*G#fkdDO~i>TuI6zfixV;DCr)H>b&nHSoTx86O`OQ$8ZjnIjX-o9{VB3oPAQ-~~ui0}IlC$hN8!`^C;#Yy8$ zYT`r|SM@lN#ff;DlsJ*a)jUpQaUy=#qfV=NT;1bD7AN8hSHy`dzlO(&EKbCmiNuL4 zuIX_iixctHA>u?9*YY@##fj`WUlF4ZDMXf{4cVw7vMVAYzEVJ3Z`$nulMuU;mv z9;eBNAnzAWOMW}u8B+=@0uu`2SE0_uT7^`B#r#-NawTO%43SV zK9QZZRipM(G|~RW-=JF5-c2+;%(*{p5VbQCO%GQ>ji@brfYJWNI#4ren!?9?{1BzB3el#FozoyY+Ywm{ z)t<=XpNQYLBELG6?wUvKA7~9|dRXvaBd*gxP1i(>)aQmU6|!}RY#qfPvL-TZjB6s( z#=9m;<%9T&2Wy+;UXgk0(R(r8$?g@Iw-LQJ5<#-hbj9?_QC4 zYtg&FVf1YGip*P&-VO0icCX01jp*G6?-cin%-eMDRQHO^+k&Qt3rH*COUBSNj}uv3 zJ9*Ag2UQuf2=-m}>JCbs#yr8m(s*%(#wMfUH)g!508c>?K zMJ+xV66qr1T9Iyo+L3+y8${B2TalJ0t{rItRQap&lU9u+Z7O72Rb*Rcd^>9*(lhy&H>j#juF>njUV#E3#`^x$og~D<3zS)YOaY=JG)ko zT5M<68c~bw>{>HwYUh?~BA!lA`?)5X9uA^>B5Tvi>t1@uTCy4`wqK;!ey%klsr{Of z^mX@EBt6m7Hm~T7Jhv6u+_v(j=C=Btn~1LwA4IQ>?Z_txAivioWxOIwH12p7Gh z`lv5tE!1$Ys4pypS7hF%dqsSu0I$frE%%D}_6c5*dD~I@23qlsyuUbxJv7pxXk#Kh zg;tHExbcu}eUWYHTJ$Q#B=?F^KlrLeFC>yeWZSJ9vRYO>PQ>%Tq!n3QkH^)bcWJzJ zDD}0d^(4(wG~6rVn~Hcv<{f}i>qhS(cn4i;MeQuKcBC5;S=!16%I`rmk!jsfsz>xr z$6Ix8k9%v;TRDL~)xh&MT{kQ z2i@C>+R13`NCQy!N4^fH0jEKyHk6K0kX@sd#%}jP3?!4+Rsx| zJ%y+*yi5v_rRaeyMGdkNi26b}k=FINx_d>8Ie0~>o!#4r-qrDn%-eLYi1SsvBJ;M~ zE8^}tUXgj*?iJaUKoMU;AWmd)l~AP8i+BeWugJVr_lo$s`*#_`+*^xYUHuiMV^550 zkxSjZBJOFv%)BIe_4H>WdgGmt=+!k}X}q6IT9K8Y8RO!$^%$owAxPsl3W#gDS7cY- zMZEEU618-%$a<%Ua|5ot>la4t8mP#wyo>D0`xwZ!uPBYckfo?XcGXm5S53!5mO_+9 zbSU+W7^kcDHOT5V39=L-OHqf?r~>i*Z0aG+QcQ*{g~(DgAWI?QS~Dp`mSPHIDMXf{ z30VpeSDi^AvJ|bT>1t@R!{Z>EKTESGB}6GjjMFx1LFsvr7`Kf#cP@yldz{GPL>4FF=@{Y~ zF;3+Z*$hg=)42WSwfRQVy&`+&L}cC;WbG`nwTV)zL49E<@@qr34v~EwP-MAOMtNI7 z7AMWV2`I9-s(VHDB|wpRYml|L$Z`?cmjFc;SBKL4AbNF;wgIL2LDV#lZASXwDz>>( zJJLF;QD+_xM0{l(tQC~PEX)lCXf5`SlOW)Fq-uNv&$l9+KwJD?!rL7gc+D3KA zY9vZu)q|`?4UZF9oG5)?&*PdNC$czE`o5mWwLDH_aia8nJ&$X9oXFxt>HB&fR~enR zjL70d>HB(6+P)rF^*9k<%vy^*#p7xoC$juR>HB&fSNAxP#fj4Q^*pZOaUzQorSI!` zT+`!37ANWp@%wrn*K)6j^U$>!$KBhG+VfX4GF0T%_tz@3YLAbj1;jlT`au<%9{!Yw zZ^B&5Q7CGQO{SN`xanwh$VL?rztf7h5jA}!T*U89B+dF&6U~lgB70Y%1*LHM?E|;zSlFvN(~&HDa9BE3!C|#fdDg38glL>@2GV*uB4TtrpKu9b@H8u#QcQ(Y68Hh#fe7LjR_Toai# z*)@@AQ(P07Hq|weY13R2nO3mZ+e}Mj+8EbFrj2(^WZERxM5ax4O=Q{>*F>gGbxma2 zG}lC?6$^R!Ak)UUCNgcjYa-Joxh67gvTGvKrnn|Dt$)$H-T|j6|3Vfw)isf6(_9mo z7P@nO#lMhwyImXeFJ#{Fu8B;WQ(Y68HqAAWX~hy=KFGAmOJz-z@~dWTDwOhb zZJKN2m(Fn_i<`7;)lK+c#x;>?<6RS(Hpw-SX_H+OnKs2Wk!e$1 z6PY&6HIZq>YF<9bv@x!UOdIc-$h1kWiBjAeIlu8xigRs}Ym;3QS=gn#i<)^>W;xQ?WtTL>4y{;!4pmJXsT|a%>32hSC;=#za~L8XsvB zXcA;SR%E%1XI5sKDCJzsn!cN9+BDZhrWF%&oXE5>u8B+=@0!T8Nv?@Zo9dd#v}vx1 zlD27H?=&dow^`OEK}p-fHORE_TV+jTTJP3swY@oK64`ur2(otJari`oy*W;l;-C~a zDO0agztfOY*xlot`kjWH!X7zp=%7sD;7t8TXBu$o?$26}Q}=grnMGFSLCDHHX;CWF_q_>4n@Hy^!VH4_VxRQ~#T;IrWDTInJqf^ax7&TlE~s@(bg0 zT(?t?Q?Jv2)1XsW&(k{fI`umZIt@96^*yaqk5jKxzte!zpwp03nBe(2^*Hr94Q`O* zhMdBNS?hM{aq4v%+AGI}y)*SX^*aqYg?(~d{{fi>oca%P&8g?mto1teI}JDuIfcV= ziXNw4rvaxyr*L>q(e2dZ)ax|hH0U(s6prv*oO+zXk?wUGIx1`7=uG{6nFgG~@mcG3 z>T&9I>USD&8gv?R>OLXo*W=XhG~hJk6i&=3hEB~CPRrEe)ax|hH0acOc23dnGz8h6 zC)%UIc~ryd@F0+P6HQZZP2Oz@~jOw4LOA?vUhMG(~wj5l&tkQg&VWh?bPGc z>onjr=oD`9v`)QF{Z0c9=eR+q@JQCWoqC=6od%tToVp*)X?vV{o%)@^V>zzdsn@CB zX~1dFDLn3JoqC*loqC?galKCcP6JMZPD4)N_c?91Q;$=xQ@_)I)1cFkQ}~1D=hWlW z>(uWw;56to2ysmH0;so!b9Y0zoNDGYgjPCZWjP6JMZPD4&%n&;v);56toUHXO8gLqP3Nt(xryi$Xrvaxyry-~CO3o#`nyK5V*QwuWz-iEF=*^rqyp?I- zpP2@o!uwh4b{cXDAGp`4$Enw;-)X>U&}qmieCYW(^*HrA4LA)t4LJ>blyez$8XD1& z=B%M3)4;5m2AzhS!fe^wm*?ly>(pP;mvY>I)1cFkQ};YMuE(k0X}~Eg zn&Y~ida50qf6UD_fZj;UK>d+6llIk|qTgxIX~-!oo#VQl2A1o{v#N2~8&=9Ru$tc+@id6WfV^ zy|Fv7yRnC{r!Y=N!^hbCBSKgR8-uNZt&44r?S}1z9fX~a-HuJg7)HbE*x#|x5yB{p zjupO)ErC(_upPE9)`xuyyA%8Q$Pk{!-ocg{6~boNuGk(}9XkX&1-lOW3HA%@_t@*$ zQdE5fY&C2HY*TDM>=-9b}e=* z_H*pF*q^aCu#Q={uZ}H)4ia zgs=m)E4BwVVovIh&4n$1jm1{MHo|to_Qwvzj=@gCPRGu{F2JtFmZFQTh;4@LgdL0> zkDY>@jh&DE0J{OZ7kdPoj{O}QH8*v^=EIi7Ho$hmcE|R^PQxz3eu&+P{TgdyZ(!jI z{D*a8>tVZKr(#cHA7gWWF@$-srLYaLEwD-0KG=cS;n*qI2Uy3K*ml?!*e+NDy9B!t zy9c`u`wjLOHp@Kh16UPX1zR7Rh}E$pv9qx6VwYk+!2X84gLTbI`(jIDt72tP#X z+hMz4b?k8LBY4Zp3cG9>6}tzPK=X zV#{M|Vl`|RY%lC+tbtvE-H6?W{R|t#_F5!_%dnqe)3LX(53rs^X?tuN>}c!+>=dkl zU4{J=`!)6~HUrzdn|8uZ!@h?-jfFAv2W)<<8ykmBz_!Qs#g4#^Ihd$5PFr?EG&uEp3FuobWg*mc-1 zu=}ycv8S+k7N?(JOJJL0yI_Z7XJWTwzsBCgDocbg2R1LZ5H=1w2KyfNAXZtD@eNxO z+ZfvlI~qFyI|chDb`JJq>>2EJ>_cpkrRaOuudoNP7qRKs$SUi?mco|9R>3yIF2`=d z?#3R%p2phP9A9O8#KvJ8V>@F9W0SG(Vn4#}!5+Y-VSmN`fz7%!V*)lmwg|Q=b|Q8* zb`f?Lc0cwQ_5wC)8Tv7{Jhmm)i|vn{iCv0aiTxIP9-DVr#sF+LtPi^vdmQ@yU_Zy!8^;)f?SmbN9gZD`-Gu!Kdmeikdky68#9f6?+gH z!oIXJ{RdkeTNgVDI|Dlx`ziJ~_B{3)_93>&D#T-7!^UGfW4mJ)VAo)GVs~TrVGm*b ztD;mjs z?6+7O`xqOw2Kx@SD0VaU0QMyI680`uS(9TUwkftfwmWt>b`o|ec0G10_8K<&YxEhc z8=H)M2fGNn4*LmqH})&+L2NoU%UZ-^8)J2>51WjA6T1-m8Fnw$#@@$fS)1*PeFNJI zI|#cFy8-(h_IvCZ>>pU?Iw5=&8;@;*ZG}z3j>68t?!q3y+SqGYu`X?lEro549gLlf zU5DL@{So^!HUs+zo4toI85@V~gzbeLiJgI6g58My9(x6QADewV+X9<}?SmbMU4UJT z4PZaU?!xZHp1_{QhOp__-?5Le%6cKpiOqwpf^CNFg&mEZf;F&nvF~D+U{kPbu^X{_ zu=}vzV2@&dz@Eom#@@#MiFK?`8(?3?mchnjn_)X*yJ3f5r(+jlw_~8Eq z>=Eoq>; z7iNT&!W&`b@LpIYj4oCUUno`!3l*z}C5kn|vc;NV)#7Vm?P9I4QL%Q|lHGB~qKEqm zf0uvGZ<8_BuAh{zw%-dC&j%xmQf4; zV`-`Fpfhc42Q4dSG6J#uOT(5kmoJxR=IyC`xr`L^)l&I#xhUqV<@!r9dt!O#61L3S zZRYlzIp4qc7GY1)O-sv}%QJKOPb#0vqbmifrkgzx~g# z?NFR#%jUL4Se*7c=?K!Y{NrJ^oPM({A7cN|Rf%iU^8B%kTKv67T7FVHGT`^z920(PRlvd@^0efZ=~gRXV9 zw!dFF%a&u+@9@t^{+ai$nYZ`WX&lJq|E%qm<7ck#B+Ahg~(RSC4cXg zmiL}aU*+#}({g^swH^8UrG8tELf?hIpFr2Ln{-;LeYMnYLTmYE($(JjTkWmoehYE7 z!E)`ie0ISQ_T=xY(=zwBnYT-B&wtnc6UQ=6jN)u6Eq}`Tzr^1sr)AFnKgn<7l%JN$ zZ_|{Ymj7vf&&=G*QKm?|Frz9>25!g89eD4X*q65 zW@7xUGi@z5Px_K+*<8Z(Q`1t%S;gr%t7TsAXRY51`qM+Cdps?3`v11Q)DAC`pV~po z&m+ILQ+`_hPxJe4>!mA5Yjtw=l$H~jKlSkUd};Yf<(j#l=s315>2w^^a^~Y<-flCe zQ@b8OyxLXE7umlLVX3QRTITiV^#5)@*75!V(rF%{<$v2QIu2h)dL4(g%;mT?%`bC# zKIwR@a@Mz zjP7DC%=}c#f0y4UwbRVy&iUkW3|EhC)~EVwnd4{9=abTZQry3*?{;Z^wN6_0AI@=& z_3xFIThmYU_Zn$AbNtMIzrPP>gCjV%NXt8Z%9V8fzBnxxxXbq1 zHw-V2+$g+1a^vv9$XfVt^y3> z@byuWDtqt4`x+jqj}Cqb>>$jJh~H zKkAb3_NYrk(Ro>zz4P)gcjpyh(awReSm%_mOy`whxz4M?@|{<6XYL1K#m;NON}WFn zt9IVbUAjBM*E)Z}xO#V3zw@3@>l_RdJEw+CIv?Q9-LJzoovpBI=YwIl&fkP@bUqw< zJ0A^`I-dx8c0LpK>iiSq;IrZM&S~MBoiBznI$sKBcm5@u)A@S%R_7bx+|D<{d7W>C zOFG{US9X3BuI>!Q4?0H{*K~Fkw{~_Fw|9;%?&z!(Kki(x_(|uNi|0BQDqingxcEos zBE`p@ixwlgx{HxrV~WnM#fsUw7BA-RTB4Y*Ysq5%uBD0vx|S{$?pmf8)3t0-?OLu_ zzH9kng{~Ef6}wg}#&wM=R_a=%Sfy*#V%4tIiq*T;Dc0=jDc0)Ru-LL|qhg1yjf<~$ z)r#G_CKh{jZBo>`HZAt=+O{~bYrEozuI-DX`O$>qx^^s1=-R26+_iIYO4shiXpHb~sO$9N@vd(czwbJuc&e*WJll0<@nYAvi%wA=(U%o-j=sE@ck~s-!lMU@rAJRGmK}X%vE1luiWNp*TdX$v zx?-czHxwI>zPYH4{!uY;^sU8Kqi-vA9DRFn;OIMwgGc|oICS*g#bKj=SsXsPRU9$; zcg2yTpDT_U%~knzxzcxV;NKd*;)+0|-|obf*+{)hG8>8X(W0-2Psc^Nz~-U2$ZlOI-W5 zYu7s+?A|-j{v6A<1)9;ruD#~8ynE+#I?Z!A&S~*SIA4hQ{beH8<|19Zd=XxYG^2;> z;gQZ*EYlnBay>h0d;LDsHKU58z4Onk9r0+Uu})_{p0x>1i;T}XU&i&84`R-v#}#43 zA=;`}{v)T@%4ro}$1AR_@K}y}(AV~gYv(y#xM_@*t&!_{@ctpp7IWG5ogBAlZ*KeVZJpOK$6?%A zh;b{g&Dmn4Z_+y#iL~ZWPCI>k5f+Qu$*kk6k&fG!x8q}*uDdPQE2H+PZ%ZyVChtDC zWLnv^J3I1Lo%e&hj%S+O4T-s&bZ`;Yid5F<=bLc$8?{NBaxNQbS>mh&vpYR;YhK$S zuKnfe+!|Z#mubcYIqs=3Mc6#%SJEatVq!UOeLOSZ=pF0y^(}HATC$qym}_#}i%;bm zUE@^Nquercds*J7=Tep1<2G8?`sttU&Lu6k;BedHw_nXE?wpZJ@Mqp>v|O&5p0zpN z%=GKMaxHr{%yIgfp!KVtc-->OW$o-gXDVw{mTJFg**p6V%%5VbE!D^K8TYA5!y;|h{qW6I;?WW#pVf!K+65~GfUOZ*LoXeAk z=6=7!Yq@-L&6)FC`>m|~Zmz5izL>SQ`No5_#;BLGHg5K;m2FUN)jr=pUSRuLNk{x3 z?`7roEn984ZTZZRoGZr~m3{J!1&VNd)CPU*EZel)&nLc~OWO2WzUy^6)xG0 z{_^&EnO1V`hpuf#&-rFdyA9*oIg#F&i~E_8)UPgzq*lBl(w*}a;RlgEeY*{}wT9ap zhZ`}=t@`O>=W^fSiJ@4QNxpyV%3Fq3^MT`Xt9AMK{61rtjntn{>9_bo5pIbkD9c

N)M|zQ-T$-iO_Lkb9qdA@{m3_hNmdUmrLC{+*q>eJ9!=3dfX}>X06=jW!n!omJBxzefqZC zbVu%M#x~vQdamb28p$!#j(K`I!TRJEd~BcBduKUP-*RY<(>VTg%;lD^IHgYcUG}G3D$NOJ ziE$b?=8Ckq_sMdbms_opc;5PT-&*VV9{TI8axdBB@=VKZk!jIgbBiD1TDcFd zv0nD7XLrw3bB+8QVcwM}rN$C;sbkVV#)EXFV?5 zw^lxCEa~&a>kiFxpU?ZKF~*M?+xb!B4}R2`;m4WZe~|nA|No9Nd!Nr8$+(Tmo;}Or zMc6oM^KHjHq)1DAFZcGV7c0WHQBztw3JtAYgq@>S?t{b4N`H23?qR=LCvWK=ZIkzu z)9AaFUpZQo`3<*EfBFbgjy|7t@BV=D^~QSqf^(d`BVETChK)33smd{Ixbh8G^8>c$ z&P&X1X&(>1&;EN@)CQP$TFu{ZdcHHybJo}+k9C{))rIX`tGiZ?*?;h}qH@fB-{Z9iO_-ZH?maIyV%<0y1ur0=rb zPL1^VuXt)KQn`)F(wAFsW1n$m%NF|d zIoxn(S;HO0PdJBX_F~P;t10CbmamFK`^waysarBK#<9e5-Z(JE^5zcF`i}Wq} z#!ZpR{K}et-hHEcN1l_9Yb$38hptwHpG9q6?=RoGB#$(2de6D@uB`3Bb{mW-9^5O_ z)_d?2bJYH}RgOFAjl6yD|9hqree0j_Zq{abGE>|8%dy_;&Y30mmoc78ulK*#Jiq1t zkaL;ab9wcdtPQ&N*>|$`lK0c^_;sJ%pUU2K{EE`*UXKO+>eiL+oy*I2g^!chP0P8= z?fJF5z6W|ehTAKK+k48sQH~7d5ofqP;6Lxr|8HF#e1LOcq;F2nVq@|>jXP5*h%(N<7;o@VqTdwKnD zxUKN-+x|;4wf%7I{GYV$f}dmSF6gyEHur;R^eLM`{qohkji&n6`hRXK z4A=G-Zo@fPEZ_P2=2A`e@o$`8Q{8Hb++RA^&a>gqTGHW;wf}h^x@LQx?T97a+Rt3~ zSSI(~@jgTO!o9g3$JDZSmwocyUG|9bjNpG#kKyK5!?m;evu*S8ynD?FSvzje+`9An zHOpQGR=Of);{R-b~yXUmm`JI~eSIPCA@_g=Lb2&Z0*ksq{?(wnd8$LE| z2}^4nnzekHIFd*gVPwF^N;bm?Y3HO)AAb6r*GeK233x5!}ZwDx~0p}Y(M63tH)aE z3*@%-@9E2Q*|#&z@cVQdexEmJVu~I8I_8o8%n|1Zw*2&-UDo`6qrN&~?-J|#E^~hCyKnoxRi5vc`)XPG^%<#mk7;$)VBbjpyIbqi zN8qO^-$Aid$Fn_-i1ZWYllHX3@|5|wsJ+W=-Xs1Uiw#}{a5c{u&3E!W@2c5z+$uiSt?T>rtA4#i-*&e>{yB~THeVaz<8Hs-bKTPS{eL{n z+aa-}XRe=1ddS4Qmwm;rzm#Xp<)}AYzxsUkp5eB~;NE!@_>J!sSNK@>*0Q<2NBJnQ zk{`wAJwNX~NBdQw1^sAs4O{E{*ap92reNFXf3o)sH}aRGe0e1Qw{m^G4|F_w?_xtjgTpp+Qq4ZbBbsX!o zp5N)3GA?h`!+hp@&|h;2R`H&FxA)zj`)K>C={asLFR9w<`na}bU(4R7J-_lgVR?1% zBR__|FDa!M~ z?at3>hnp1~?02O<`Y^Z4I)BTg-?_3;Wp3a43wnwf?HqTNr#;kDl(UDjb@%ZrxQqJu za=Oo7>OMA=ZTi1E`shB>U9tUs<2`XUKcg>u*pJ*>?jPIjmhb3n;8fmcD)0W+KFY1O z`b(Maajkqdpu8)ywa1nB@?ZAztxMheMb|#-Q$uC%ERVWnKP~6G!;KMTifetnE8U&@ z+67KqU6QrGU!3V{@8+5x^M_2YzL#m6Co|o$NfGXi+oQaL|0HLhcKkiVkACO)(^>0y zpFDg`p5KURuU&(u4kDHPsyu=Xcf={L;!O8DcG|a|m?@XC4a$C6=3LG(Kc8b`d1m;Y z9}&xAN_oEe%I-dPa!uiBYXjfkR`z+xF@6pH$bE8(C4Fx!&*Wa*BhOz(d+QGOq}{RZ z9d5iYXMJT48?LR&J~>>g4c8O(opl=>*YRWgjb5X%ekMHDy^oE~?sbc1`-e z)r&AR(>DLl%Uss?v)&Jwz&z(KalL~+lUBP}EqB^4?*UsJkm-xQFP!D)*geEZUbaz84|GTgpe?oprKOUf4i^f9b_@^)yWJpVi2>HnKg-s%`N@^D=t zEk}Xj+H?)SYVa)E(&n~D`=0WK_mUfZuf5v$kB5D04R_Y|`D~ft_T+NzSe}WzFu+qe zvA)Cg;{AOdw!_+=cD1p5qOlyQ%ic8HNK^KqvQPe--oz1Su2|BOdU$##(yy5p+YIVz zuCy6_%SWUY+}poI_Fm)KT32Q5yW=vQ`;9zuUCb=Q@;lV&k$ZF8dA_zIoOW`$&vTx8 z{hVUnl`=hfWu`OM%e1POVB)!1n`6CPf|nN0V?^0Pn|N!K+8n>g`I++p5ED z%MZMrZ}N8D$;(o1>9XhiPqy2_UblU{q-*=O48ASP{p@9>hI_RG9w zmhlu<-C9U)82VyPP?zCSin3P30akgJc81Q?f-Ik&)8m)sr;l%gE{SO;u-yhC-OXL@>myyl(crd7 z*DssX{&~xMhy0$2e2X!9%lf4HG%eh7QmfwHZW1ooml|6Q~P5A}YsJ+IWi)oR{UVP;txwor7|229yS~>UU z&)Tz(_)gyA%Rc^99~t)NxN0@uZh)_m9->>NTaJ!HYWaeV-7F5^RMiudmo>-YT3ieJ+zD~ zOFGAfdAm(!q_MKh`*5a(d?ehHIqR%(ZJTpcn>*59Z_l*9)1^)mp!tqa`E(q#6rWTU zI|`LstK7@V7BRna%aljw$6w1wy7f26+vBkb znI^lo{j7N#edMHHcH2JYTyE8k{Z8R*TwB^DdRLz$<-6>$j8ia5kMgb+dy2|*-C zkf&ADt&8D>3f(L!-(}qX4e`u4L z$S1w08}}`iw%Pi>W5*wL2SUisZNd%x|`IZd0M z*R3u4Yg_i`Han)xy0+P*HoLLSe%1C99MSgO-fR1PzihJ?+P)Q7D=eF4|+w7e- zd$7&knC=tvE?obY`Ozaj9e0Br!=B$@kFj5Du-)0OH`oon;*||{*~^>i=(Q_0*^&C< zja}b@$|k$~giVij>%GY?X#3h%+P-#Z+tqz}8?yGV-O;0q zH)Myjt+Li<@BN2t)xTx!uhRY#w4b?X|5@6mS29Lf!^@_gH_LHn!JtNl+mJo;SG zr|oaB3s`i~`oH=5=WU$h+rQflX32QNqw9a>!Uk*qZm-?xQ>xk?-Mr1V-eB$DxBd0j z|MVM=i1wd8eWf07!&i)R_Fst=X|uJ5Z~AX8I_NU~=fA#adpFka#0=i>%BLLWv++0B`s~OJwz;n0xDB?A z3O#9q&3N3k;u~zZ-IVA`hEGFO})yRHhX%+ zrff`GRy}u9HnMG(^E&ZuG;&Y|L)y*cEfjTe>eV92erOd zH@*k|-S?REZ{K76Xz}X}S^F{BzS8_ZvuC+oTNmEFt(U*GE&KhbP2K@PR1qyE#%zkQ9} zz6bE`C7b%IzhAb=Zf>*n6<>Gp`cdG&d)G1>zP5c7{qJ6-@!wvh{XEHIw``iH+sBQg z+D2s`9r-^y6MfBA8~1a*Zaa$G&&9N#fw{7+2mXJ1rRRSdU)H~Cts8#kcAI&G&$RpB zcqhC3+k4P{M11}Hrm?gA*cj7x)cyZ;edqe$e8&wxbNdeD`kL7|s{D7y!7l&y9{hK& z()Zt9rM;(Fe-+I>8y;PMmF<2Tta#|As@U24{O>D~6OF7J_rBWS`}S%ayS2Tb4X<)R z+bBBgWuw%FZ0EDw6KI1yrUo~TT(!3EF|2J~{ZBpSnflI+qi9o`^>4HPbWE;)?>Byr z^?#Y;H+91aL|k^?ac zm5`Dg6zU~|F$&et;2Pl;jKjhHmE1!nmbbdkOdJjg8OczLLe1wD$Kg<)SX>IjF!H&? zdC6fuzqk~JW8_nci<0mA-=%Q4f06srG)gLoCjYC7k-OBCB`t|&Nh?O~SyPeJ5>?4& z7`cN@i)8aetK>Tvg)M#mICMyCCfNd`u$Au?hmJlKxfHg>dd zj*=0HEhXn*6t?koaX2@zwd6dEd{|{C$;iYulJhZgpPbH;3liH(F2pEw@&Ds+QDQsE z#TdDdPFKmO#P*UOV&s2!lU$P6L2@ZZ?z7Wfa#>kV%Mi0pqiJc@@V&pzNJtbEq zc9vX?k+10`xhAoTNJ0Lj2;AIWzy3P*&2j*ufU4uhia z%D;zE_(2#XKMLcpZ}dI+ei((L!@lxkFb?}i`^gW$C>-mkOt>r2{_+E(1LOx`6pnXn zCc+6Ahr!W7@`Eu7Cpto1ae#3c5*;i*1fy`WBQz0C*>Ic=jSi6?ijmLJ9x6W#<1j2b zRDKvn?te5)eg?*2cyyTj`xu2Y9kYpW7RKT5X#FvJ1V-+abhvy3#^K252>A~%3g>ta z65(8o!%@)>C8t z@$$c56fX82B*G|+!;H? zKf=iUqt2CIk8xOSST4D%&w276dk+#}G^+08`SMnb!VTVoM7R;vc=AH|W*CK^cn=cc zCRFLki{;<+z`%g108 z?(iNY!dQ&MZOJR;w__CU^d2O_IE=#`$*bjKF$#Bi4-(;SjKiJDAIZmI6z=gJB*MKI zhr5#3$?wJ}{M37pa5w1d<@Y3iEWZ~c9||{Gem}kcn=ccL5#zF$)CvY z$0$7HJxGLyF%AzTZz zJtV&zqwsUTcOpzeqhj47@+&b4zxBH&!Ynj4);%V_8l&(#ziT4QMk8e1R-i5P|7`&|=Z9>(E`x}V9P#K`^7o{`VTI6PJN zto&(=!XNyuKFb2*@Uyz-<3~H5=K7Vf3oD~b-$EM!pQyDruf=L7`w~#ujGp{3V#k$<%=;6f2sSmdWQETVmw?a&sk*rhYGZ z45N@w%#%z=y)Jni&FP8xzIJPj-8uUY@?WBPJh4E&4aQ+g>J9m?(A@3*atU{+TPUBJ z`lI~UXueLoDc=rb_X2oJ{u?w$C*GECk8xO#`jh+(G%qI>$#=jwEKL1b{zo(yCl*fn<9zA^`MVf}K8cm`-OxDiav9@1Mq&5FD)}C0oKJlue;=dJH?dm2 zCmQEdf0ciLk$d;8k?)1Z`PAR!A7T{xC)UdM#yD(M|9AP;7=;0ekLCMd96HtiL%t10 zVNhb7{CgOO&h`J4Z;O%p0)8Uj5983K{!{sO7=`^4pUDrvICQQ5T)sU<;lRWf@`ErA z-Ri%T?|@MlocKz9Fvg*K{lDZpViblXzLpXgg;KZ-Blp!v$&bJ|T<#tWrEmpC?mFKf{{hC~ zSMJGB3R5u(M~67>D1~=j78d3fCv{@*iXD&M^h~42;6)L{WYN z#^IIvl6)pc;l@Ox{3jTP-_|$DXJO>die>rD7>D20H_K;Z6mCgWr6Q!^K zqcASfQGOT3;f?w&{2BVJVs` z6W!&HVI1DA-%-8{qc9=SL;g6%;l28umj4Xn@L~O~@>LjxXA*tn&te=ts^3k%8l&)BVt4uT7>B>s?;&4b@VwRgBzIW`FrKG_KmrF|J}1 zev>#*J{^s#?h9gE#VEX-7%ZQGahTq4u>56=!WW4l@-HzCGa3$&zk-qS94eXFaH!J*#QKCyc`!cOxl<*U7wI9C1#w04V*lXpWiMZ@v(H_&=5 zIziqY%@po@Vx~ZAwCE&x4>VIWoGgC}qp(wSio7S9DH=|d{|U_t(P{EtXufdg6!QgI ze?@1=d!t#yom9*k7=>MVT>0^6)^G=wVMKI={2YwKT6cyig}-AI z&W)~;pNDbyxZ!H~KQIa-qif{nV;t7GdrT?(6QgiJbgleCjKe4HCQ}NZViYclu9sho zI%Id4(II0LMn$9LKSUj}JI?5kF$$MNH%h*8?-{)@T4zN!Nxp8lS@I1=;j-u!$+r!+ zNcHil6s87Rna&}LwuJcMr*O?Zb>@6 zN0PxPToc_Z$;LmG3}hLzI3*oBy_WAYSQmqiogw_qIV(~rv=(7G&|C?A7y zh|^EV(`c@Vo|NB?amb{fl4sGnEP7f#7UPgh|4g1o>$2z>`8bS2A^ohph*4M*Jtw&- z{k-I6jKbfd7d&$<#^ILqi}G7Ba#z`xu8qz8`P6$ekX6mD0~~umWSkQ zc`fs*d^0qDCg;c_)RSjklYa-JkW9{%*P)&~^LzOg7==`Fp1dCQisf*kZ+AqNGBJ_GpP5=ydmEPqmWH5l;=?Im-(Z7Thz%X-;@_n@0WQ?z8&i4lW)tn z#yFgo`IG!~)Xygu$+y8coRRsn{7lr(Cl|}NMf-S}zsS!<{d{tXd^@z8mw88i4(jKV zOXb_6J-y7k^7BwXpIj#20sZYV@5%2${d{t{d`I*b%)BrEDeC8wE95(&zhmYD`F*IL zPp*{jjQ)<959JS_9zMBBz6-|T!OTbUhfoinTrJ-f2J@`L%pMblhgY zkylY~pZr#S06K27A#&WJ-aeU#^!Dhu%|`OgP;Z}1$`3}zZMIJS9n{+=Q}RR5aht7| zZ-ILIWP|)rblhfR`Ie}+Pp0LEq2o52k#CK9`(#%BeRSMrbMkFaZ=cM|k3h$5wjkdY z_4di4{0C?+H(Qeb5cT%SM)}cbA0yi&zZA{3$+G-dw2zT(mS2u$+hj$4Jle;|R^?Zs z**4iCKN0O?WLxD|quDlDlb?+CF|wP?j$X-BNM`+SN>M<(X$;9B#~RE&mDH)l7Dhk3egd>^AagXje1YS$-~Bvt+lG zPe;3&$u5$Yv)f5#pqV$>Rq{%9d&x|+!

nYcD|Sl?NOw)-2gwpTko*d|zzd-ev`>wozQJ9<@B>yF<$K3biC5*z9 zp?b{iCvUB)chsXzD6lNxe%72S-*e7?Wd>}?)R&tp9cNmB7<_?n&!YIs64wrl{ z_kGE}Xy+|?xMaWF5t98e3UiW2N*>7lK=L5kg-aeKc_??Z1Z&b))2E)Nkj0DE|nf&|G(kyn=DqI)ACW6FRR~cbU8eDihSIfJi^LKUE$U9&hw$J}a-VL3ztGia-5#z8!{yKSg zjKY?6*UPuUIP94JvAhRHVe7il@=h3so$@!xd!qGP-Hr0j7>AwnKauxB>$SR@R?w0pLGk*Ra`9o;ER(G$wH=6PDKb1d%)@ya+ z<$chMpTAH37)D{Yy8Gq3qn*$E1Mo9Vs_$TFq&=^>F zN?wnVySzRv-xrO6g`de|jND278A-bEtR#a`xVG*&&%6%JO@-&>KSsM=buY+&jAp39 zi}D-Lu2gQ{=az zZolv=`E6*|t8S|NHq`AGel5QP?R3>mlZ-9=Msg=wiPTN^%(3WLD!eSe3#~-zX2{2( zW2x|p{2p|MsBWhGZgeaaek=beIzv=9OMWlf6D#~qz7U-us+%nzkM_h0ugc#+H(x#(?THosAYX!Z zd+HX*r=UHt!W;6XXt$?sp?oUF;XB1Y$~&Olp1L(JZn^wbG{O|$mv=|=OWg|jYiNWiejx9G=9IdX^53KLcf}9ofR}==@#rBl+FvJV@PY`7(6=uJ~8^z34nh-5U9FbpEdRH~DyU9;9xqd<8mxSNyyD zesmtB?qm5%H0u@rA%75^2dP^pUxntr;y>jNV-!BB`$WDP&3(mB<&UECBXyt2*Pywt z__=%nTJ6?-AzzD*qT-kGH_>Xh?koAn=qM`wOa3-m?bdxQUx$vO;y3a|Xti7St^5;o z6ct0#QG`~wb+*F8XXq#@M)Dh*o^5 zM)~#_hf=9Y-iTIwsj_?rj6+kYSzbmfzEnlNBf5H_RF!`Zt@u(c@}1Dt3#C^1erUy) zs>ydoS1*({lOKRqe5uXlyP&HVO5c$mgjRg14)R^m)eEI9gH+1zvX-oMb zXvLS>O1=liVQ6V<`JrgVm+B7RP9pt;A6DG zpPz_Ua4Bota57r8r3Uj;(Ml~fgrAO9XQ`q5Otk-*8ph8?d!DJ`{2a8;nL3=GhgMjr zBl-DgKQna{zYy(VrjFqkqkYTNar}p9uQGK4zZC6BrcUCQqrJz}Df~*b$Cx?|uTGsI zxd!bYrq1HmqCLaZ2!1`LPv<+5=3D;N5TmIx~{G0;i|0lDv#&gw!?s6*LQ^uI0Z)BY*08{yQ|5r5^O?=V&xb zJSyp>(FjvN zlkbK`mHJt@NBwL`U(`3&&*A-0uUJ2q_s1ygT|bWxKs{mod_EBMf%OacAk_QSFXa28 zey{#bzCT9peE&8-5TkHV{USaXqi}HjVm<_;a7g_UJ`|&HX#G+?45M&Z{W3lrqwxLu z<@|7Tby@uiek8i0tbQdw3Y|->U&W6>SB}-M#^dVO;PLfq{a1Vh+5@TonxBhy>FdAcSD~t@Pt>UzR5kTU zel4n+`V_w&RZV>ZAC0P}KFx1LRa2kkH=(Mj&*LriMaiwGN3CzMiR#^6_Z5p?)j;TYV?VT2vABo%zS8BI>*Fb*Lih zyYf#^MbvlWpP{+FzB~T{&FS?$_*WQ(f7SQoUt<)$sqe+V#VCY^-aLU(h#LCvBu1gG zVRxRwDAYIfox$MG&`)!A?Y?}}EM4JYw#Xm#0e3h$0qlntlx9_UDJI0H{>I7@OmnhP36 z@H5d|&~Pq48_fj`Bl$UKE@-%bpNHmxhKu<5Xf9|N#VVjQRw=>hAa3b z=v-C9Rd`v$HF$Z$wRlCt^&Y(v%>@mk`PJyWQp1h>M`#7ta1*}{?Nr3K@B-SMh{x~} zMximjoj0MsMLd=_qrXKwj#ts&BEFlqqN|1Dd--N)OpC|!@1U!Hy@>-bSgC-k?7C-BbbZxK)AUC`emev)@Ze~b8O-VOaN;%9hw^tXtg<2}%dK7N7s zM63AtCEg3I+~Y~SH(IU7lX)MsLXW5L-O-2|Pvw2lh#F7h{m_USPv`y7h#Jq}1JH;X z&*THqh#Jr0gV2Z?&*uB05jCE}_eUdYJeMDcM$~v7AB;xScs?J3M$~u#ABslQcp)E# zM%4ICJ{*mx@!R}xG@{0f_>t&1j2H8x(1;o@;m4p6HD1b(LnCUujGur;)Oa~R35}@n z3OprViKoV^N8h^p3pjB%86`zV$rt#N&8d`zI-}33`dV|O>``CN1zV4Uak(6xVY5#Ng&CCkx@FD~;HXq6XN_)4_0i(B|Aw3>@+ zd^K9Z#hddrXaq}l;EiYmOLydD)Cr`w;uSQ4r91H!G=il&^BNk#(p~uGXaq}lHT?MR5j@Xc|TM&>A}1| zs+#l=J^)osdMF==swO>*4?3J_-*?AA^I_$9eQ%w6aK_ zzz;#IiS$YQP_%+bpTZAAtA_Mx{QGF7kUoPSfvz%2pT!?SR~Ds5@JGVeZ2@F!3YoW6)Zg?ixhDE>2aMNs+@{w%r*D18||pT0u!0y?LVUVo>!m(Y2H z^fi1E+S^HA%O|7iNMFyVpz27E=2KC1q;KTYP<5nl;?q%eq;KIfP<5oo@R_JO(zo+j zs5;VP`D|1j>2Z7xs*d#Cd@ibv^u2r@s*dz{J|A5To4%hfKv%$~ALI+sRj=uX`J3oU z*YuBvXw{#Y&UZpRc4h|O8THtinS2-2 zV`paJu9?}AKIqua%)#9=b8(N%JnWm9@6kQc3O%!c?}b+7nT33Bv=Yy}$@f94@66l$ zyJ*FoS;W7GR@s@wd_T0Z&Me^vpxHmOl%J1g|I9LeA)5U&%lXAM`-rXe2mv+*5UP;Pw>Z?&pbLB^|YBU_>HKi z&3wggLOpHfYkmv50wnV-AA_nRlc-l6s5&x9{sgLyOo~5+sw30De}<|fljhH&>d0jI z^XR&`OrF1pu7%4K`Oi_Wn`z{~Kxfl3W&TTa1}#(Jzd~otGA;bqXeTpM`(#+=k zWwa*Ebl|U`HEE_J|1DaRX13zLLu=AZC;lp0lV&>e*U(O5rVIZ)I%AdT%3nuksWRR8 zAJCbpOn3eUIvbVg!T*R+cr(+JzlE;-&h+Ac!YC}t^yYs?)sgAL|AML`vpatWRY#^T zzMJVMS%zk-On<%{%~qKKdTVl7ER-)0w0AztCzra}56mt)?@_ z@sK@^C$cB-2+dI0llXS1inFKi?NJqHPvbkFD$cIIm(-4^inC|&olq5LNAR6d6=%=o zyPzu0j^w+dm2&n1z8k9I>_vPJRK?j*d{0!x*-Q9dsEV_f@x4(MXRqM=-;Wd%I*9>g%#& z`Eb;!%%y0SMrk>7=`=FL9I??G4aW}oIiMOW=+pTYaG&q?k_=Pa@>;Dgzh@S*G^ z`NJ56N3xUoqv-s8b_$<>&go~T@`>m?es&sv5}muxPUlaf^Yz&o{26qPK0A{?hvuE^ zEWQBEJK5QMA)0rxbNHKR-pS78Z=-o9JC83y^G;k?7ogK(7 zP-SJ`=F3rKWf$=ksIsz)`ASq-*(H1xs;ul%T%BEpf6Xq(HQ5y&{ToJMZFVL9JKCqp zuHyf|D6Gq_=Kn;Mm0iO>MU|CZ%RfhzmHn81i7G3*j{gg-ymFuLDq4BvKI5%u<(2z_ zZ-!Q0xv%(l(8??KHQxfQymH_2Ez!y=muRqKk9x?QOKrk7xs;?cT6yIfuuCqD+vT$I zu4v_z%kyq%<&`V)?x=^%HS!*)hs>3EPt-%^D!do!A#*LfH=1X2HQopHb-B&?fvB&` zb>M?h)#N(zA!s#}+lmiGRg>$)hoP#;b>_oS)#SS1;kmAOM6Meind|P+AE2GyTn~OU z+Ud>p(9?d ztNYvlehymQ=LYig(EOeo#Lq|bdv0HTA)4QF`}2#@{GL0I{}9dZxxxHWG{5JD@XOKs zo*T-qMDu%Y7{40L@44alquk+=Ytj6kI})$Y9fd#69U~u&=J(uj{6;jt=T6`^q4_;` z62Aq_@3~X>7<5%S=SM_%zhh<}TsWQBRw@jL$$lZSD#_6ZN#YtN1L`)8?+h*|}>aucBEy zcRjwA8;x^wH{$PeH+gg(>S=Sg@cC$L$&KL)(Abi@oi9XVOKvQG6IFL^9RDk-?%dt{ zZ>YL+_wv7^>duYl|3KB9yPy9PRd?<|{wb>N+{65HRNc8p`Io4=a})T#(7c(Oh~MO% z#BXy?W5_>)iTrb(6QNz`{0qDe?Ly~Y;`QjNmHZ?gqbpVNlX(W!T7C-egL>NhRK7dv zY4g)~U$kD!Pv`y6dM!VL_ebls{7gOot=ICi_&~H?%g^S6(0VODhwqElYx%i+e^l4` zd3a!cJ|2``ARmnCI=_$)L3N#flMh98oqwATLv@{B#D}B0&M)SNqq@#7;YXs`Fu#-^ zg=WM2GJXu&<;X9`FXqdVmry0< zD|`~F#C!{%j4Cl-<5N&2<~Qe4Q6=U(@M)+L^BwtgREhbm_zYBu`A&Q$s>FO}J_}W1 zz6+m?R+ss%d=9F_d^bK9Rbsw7pNA?j--FLbm6-3z7obYa_u>mtCFXncH_55RZw1LaH6ET135m!Vlczb{{oX8HX7dQQ%E?mTSLfv&?6yF(j*M&>?E~vXMT!y5Yo7sm6`QAHQ-=VzjdEa{~?;G3(xRN(M(-cR_n zW#J_pUzjAn5B>LUg~|K@)I}Gj@Q2XuQ(-DTQkaI17N+B4g&7{5fV$|yOq^Jlg-;Y_ zXJ~vV%;V3Z@u4uEKaa+T!UFyxT3;6y@}Hyib>U6^3sfnExA`(u zDTPIRIjWSxV!i@ZN?{3Ki7KVAl&?aSQdq`Uqkg!soUcJE&B6-47OgZ3EBVK0rCC_T z*P)eWVKx5*tuza3_-E)WRbegv0-dEQe9XT>XQ>M7_}6I0EPTShMKfmcGoCq?V}d^@b9A;u(&%PiDtlJUw#3a0gL_kMQ8>r_UEI} z3|Jh%FF`Y4aUj18&49&0{0dYr#eMlz=xl6pe|`<>Y>Nl-Yf)!g9L%proo#UlAB{TO z;!u7g>THX{_)Vy@Ee_|mpgJlZjuVSVN}fPo9{s(g8~G|!#l@TWYE;F=TlgAO#lii;2OuTd2jALiepDlR?B6R5IE6L{*)S(VfxkS(?pvL9=IR4&N2co~5~b zH?%iZn#cD*dsC(Pd{0zyr3L&jRB@$+{QGEyTY8fpf#%K9+x!P;-YhNRN27VOw3r`@ z=FQR)emt5tOH1*@(lR`$v>Z<^t-w=CEAiCQD$hI(o$o8H=4YVueWf-0EOfrFw3d%R z=le<@^K;QSP+G@FqH&<~3BLfE7= zx3m@hwA2a5mpbEpr7n1XsjE9AK7i)pQaAn(nu|-_`6Fl+F7@CO(CAU>$tR*&xYUb3 ziMsAmZ~hYMx=VfdBs30`cIUrDm0s$L(@XvEl9_x(NSL8ih+rm*6|4%W!Gw3VgS86)r1X zgYT8D#pR{z@%_?hTv56aKPcUVD@(WFhov#Ns&qSkR2qw`OXKjbrMq!W>0bO>X*{ki z-H(4SJ%}Hd9>#x^9>sN~3HZ;_MEs=mBz{_Y8b2#NgP)h4^FDupMwrqIcwpm8IJj{V z9@{t>Pj8%pXEsj7vm2-3IgQhCWaA7xzi}pxYMkYDeu(lzp0^^I?O^vCFEZ+x5IfR6UYMf@k|Xm4E1Z$?LZ;}U)= zI<^~^^0DaHZd}I4p<}yoIlmhn+l?#uz3A9(T*=3yW4mz`zaQ<^Hm>FmqTSlYHT+@J zXEv_okD?>I@nb##&5Vuf_!DSmZ2W{jg^t_C&+z5OFK|ZVS2(BfYkaNoTYSCIM_`2c z=-6va@&)MFYfSNl=-6v);BTU1uQAQvM#o-bmM=obUSpmwM#o-bkuO2VUSlI)ijKX; zGGB&{y~YY(j*h*?7QO-SuoAXuZ*lX;-SEFOEu_IrDj=jdM_*!(NHFo0v zL`PaI1w9muyrGh@?W-U+QJn}+ah(TcKZDBljPD4T}y?a_*| zX*llKbhxAkng^SX)zz>VBI};(bx~+jI)= zhq~XU(|CW>{WhJ!2cYh^=`21Fb-zs`_#o8%Hl54&MY~c>Bl-SlSE}g(ejwVFYPyII zM!Ql?qxcZCE7f!fABtwxrpx%zXoc8x1wRjs7)@94^HI$Z`QxY(o5t}cP$f3q&7VR&YSX>^ zXQ)SQ8qc3aJ!;ea{CU))Ha*B+L_KQL!~Ex{M{RnP{{qcTO%wPpQIFa*k^c(ys7+7u zU!xwi>1q5;(=(FkXas0_j?X|dSJMl8CYrgLUgERR%+)lB&qgy>(_}sejTKE(_*^t| zHBII7(CE=Ljn7A;N7Hn^0F53^Gx$O@dNj@CZ=yM?X%_zznzNc_^FO0Gt7#7Z3!1Z< z=JI#YoYgdszl-LqruqCmG-ov};P0b3t7#$s0L@uVZ}Jb(oYnL;{|L=lO^f(n(VW$^ znEwsUSxrm$-_e}aw3Pn?jU-LW_&?D|(zKj^ibj&A75sBFk~FR4U!s1vX%+t(^}|i8 z`M0PaF0bJUw5lzy-vEq}~YXjNNY#~aW{QvQUe(MVGMjAzlRw)_Rpqg8GBD_%sS zO8INvh*q`bZ+RK@-sMD2?~O*7a+0^85vH8tH8jGM8~EmEgej+a2QF z6&hj6McxVZ-sMK#8TH=fGVg+V?{bBAMZI^qg?B@}ce%#9qi(spIo}hV$t`!_d!aMA z<&J!BbSAg#Ojp>T+*>B-*1c_u)sOJ?irA{20`Yl>74I(3N=Qe*6T~pOpLa zGfC8+y-Il?AAvfS@*sXL>blGO@{wp|UEZHxf>ze$1NmjB11}HeSD?P7JcM6` z`j+xgehund%ES1zsBb9`=hveyy?i(yjXLx4k^CmqnU{~^x1bTPdnB62BL9Ddki6c+`8BPvZ}u-n)DTe+Z3@<+J!BsK+jk;7_9Qt$Z$j9*uA1 zk^Dt8zLhWFKS$$R`68TL9wqrD>Qc&=;A`c}aBleuTv)ye|5&~T|5U!#GZ&%WqkKJI zjCzmqXubsX9_1VPQq+5tZ{o{P?@_*mFGsycc?@5HdXMt$d?gw^%47LQsNX1$<7?1} zQNEl19rXsy_hQsM9+S=YW48H0%r!rZrRGOHvk}#1^8{W-wb?w8S5R#>KgnBAZ8ks6 zYp6DxpW&OM+H8J~cR;n-`~vTYYP0zzz7?v?=1JJ8d9q|1)B`k6!7j~HCEKBTY@Wuu zp*`g0>3m1Dl5L)WhcwTW3`OU3nrHE0s9u_9^WkWBsCf>*2zAKKbMeQ`^Kf+Yd>qrf z0B>tvh<7%>>6znD-`o5)zZ)G<&5QWG=!j}w%*UhIws{G^AI-MSOZkJS?`>YjA4Yv| z^K$+u>U*14@Cj&T*SwNXL`PloD*hz8N}+i*e;Qq-(7c8}gRW9&Udx|DXF{7l<}aX? zVDmcu5?Tp1f5IoB^DoVx@yY1?OY;|e3OfJN{1u;y_Jx|i=F`xe+x#t`j^^BEA0!uM zpgFfW$!DTDw>iaUp*gp?fzL*BZgZN?K}UXbmd{1&#O6GI9nG7zEFF{0jgmE}2W~F& zwP^j-T;U(1^;dHX{2xzdG~(eYgA$}8x2u5{xq=y_;3G|pEB<586%cywhb9#a{H$5w{pah1dI_{x!ZLggqtv2qNaR5=b$uAG3UR8GRv zE2ntPGtl^7IgOu%&Qny*;OC$*zj78IiOx+_M(_*K_*pp@AF7PRhbtH0BbAHr(aI=% zta1rXs9c7RSFXT`m8p>8I3=y+=$OqZo+3Px8QS?G5CDtc6^~S z7GJE4!&H%R(TqKQ+Wob zSDwR{D=*-T%1ii4WfIP;Ovc|tD<{Euiqq%xPkg?h`%JpLzCBbE95SoEZ~1Zy=7$~e+TuJ zl{fjjsJE=V&EG@4Wn~e6AN7`%#ry-*TUM6v57F#US;{{`l~`HE*Pu$QEaz)cC017O zk5MI7R`PYI9xJQ(Cuk?6vYLN}c0wv^_!np=q_UQOg?h`%$NX!wGOeuRp}LMIs-N%( z%|6x7cpX}qR=?o&=<0&%S3E{FUj3S9P>ol=<#|-&)kHy!qZ+R!c_Uh-R#Utgodc~l z@G7e7YMR$jU01Vwb9CObn&(@f^Pbfr-x8hotTytk(F|2B^KH-!Rju%CQKeT~_;#pQ ztk!sUv_7qF&U>H{pxS}=MC;RPN8SsqPpez;-e@$acH+CC(V*Iy?}0{xY8SpI>N%@j z`Ch2!tajsjqn@+co$rIzq}3jL5b8gxJ^6lU9a`qfm7yKL?FM)nR-j+Bd5X=NF)vy?Qvm2%Yz-9?3_c z?zDOozXWxs)noW&=nQG~IDRGSNUJCCYtSBA^(1~B>J6%=@X=`Bta=*%3EDTSp22TM z-9q&&emmL?u8!b$qAs+0F24))4AqhRUeq&GFW}=*7h1iDKY&Kj>L~sY8b7O-@JG@3 zS-p%;K;vii3O*5ypVh1QlW6>`Uc;Y8<7f3+{tOyFtJm}A(D+#$&0j#{XZ1$@5*k0N zH}Oem{H)%>C!_JRI)+a{<7f4DJ{66h)vKjlPT`-URd97G{}Sz|Rj2WPq5ZV#bp8z* zwW>3CXqmwiEi-w9R>3W^cnWnREwgz8S_QYv;c2vo)-snD(A63(^LPnet4u)v`aIkM_P=4&)2a-dD?Dz7X{% zEkp3FmZA8kmSMQ4WjHQvIoxyJMZHJMk^DVWxh+TW_fhZBat!|f^&Tz9@efh&(Q*R+ z2vu>*Nqh~e;+9kRT2!qqr}0lw^|hRVq4g|Gw2r`Z>$#X|9f^h33p}%kX8+cUcq8iY zTSxIS>hN1H;T3cRRO@BD71dGe6}Uy~RoJoh8tl?~EpFF(J?_vt+B3VO`f9zA_dsV? zTW`W$T5rMLtz)oX>+QH#>sZ{Ub)07oMAg)KHy?y5sP$evpmjVR*m^$>Ykd$8Yke4x zXnoW(k3?O4>jZujs*Bc%{8%)%wm!*^M|IKqG(QP-@~zMCQ_#88*5~+XXg+OyfuD)y z)7F>x*=Rm(oy5;Ud&{kp`FUt>xpfLZAI+z&Q~5<`K5d=GN1^$&bvnNU&8Mw1_+@Cf zr*$U30`2y+&f-_0iff(CuR(Kb>l}U^I*Zym7w>4Dhhtmknfbp zy4o{;hkEbG_Ro>V&tPp+MUXV*@{5w$aLWbG`^ zJRi+ywGsS6bdI=oF8?7qM_e1pFGc5wYZvg#QD#HJbHmm+&8LLX0_4$HdN6yS5kyKP({~n z;&-A>xONM_3(cFgG5j9X@z!qV520GFjpY;3yjdHEFVybF7i;(8)Y^Fbb?tt9x%QxE z&Oq~E?O{F>)o<-le6=N#sK@Wp7~we}KU zg7#f&llW4!?^>J8m!W;v+7!MVb*HtddP<%@dm~;t}dvH(Sh8sFpWd!W+=6y4g~mLHod)E#o;fdv3OzS5Pf)wt{~L z?b&X&l6OM2v)L*>5Y@-94$EH`dIo$n_w(C3?_v}0b_v$>urB;y`@wk5_CxTz?T3c%C0_1682{LP2)@;Q zsC#&vzT;rLe8(Yp<&Hzc>4{vA!MJ6QA-HvqpEBWH;^F=@^6@b{oIT4HveAnuUkI&FEE1Zz=JEi-Fe=>@$S~z zr9%iEw~+hS-@pC*8|vS&TZV8?7vJ;$V(d-8B+Ih$u$R-+4A4j{gHQ{)=pHo4JuFS` z%git{v1TQcS(#*Hb#=oh2aypkGh-^Yi5F2>*^(>)0VPH1`qy^vu_sDyVj<-5hBAIF4@}0vpu}#N>h=2AKsxR-!l8r9#%SGy3PK{d$G<5 z(_MD+5oo2d+S;eQL#5Q#UVKLvQeFV|Ti!u==sngx{T;v8V4wMp&-oDD*4Ezrjz5Rj z*=hQ1@Ay`cTwD947p#x(pA&iS zTKmpVW-QScul?~)*0{ZE?bkm=WB#tS-~1GnoUOg};=>bY)DYOOe(@v5^t)gDb;RRa#mx-UeE!t~Ye`Axi=O4ILt&u4u$P49f+hu^z- z!&H0c3qSJS&o`zYeQ(2U$bHU$=7U{f9f?G=D+-!4f9XGreUtFeb@VJNWbTOHl*M8J{!{Sf1eHM z55CWa^oQSPL;54{(~$n%PyH<1(e?}Y{n)*Kir**qu*n8@w0#DC$M;^v@8sS(ey8{L z@jJWs0KXr<_a=Vl_ipf8+?w94gV1qxAXU< zUzQRIeFJUR2+2+Msd%^WQ}Jfwr{bN$7x6~pi+GptMZC%QBHkf|`vdsC7T?$5`+9tT5Z^c8 z`$l|!2;Vp171M9V_bvFo72hAm_igz82)=K}_pjso4t#$!`z*Y<_inr~_!8dOdkJp} zzJxdRUP3?l65h~z32z3zgg5hE!W)4v;f=hP@Fw6(coXlX?9b!-E_~mO?|bllFTU@? z_ZRSeKfWKp_k;L;2;UFm`-}K~1m9o6_oMiJ46md9IKH32_mkP@;$6MZ#Y=OaoBiAP z{xZJ5g72sC{X2Lw_20$!SMmLO`2HHce;?m}fbXy4`y2TFCcdA^UdDTGFXO$vm(hQ} zjQ90k#(Qor<2}8X@rv8act7uDyq@v%7tmwy?r;k}Ia?_S31 zcQ50;yZd+`~UD|Yp-Q% z_}+o<1$>``?;gH);(HgqPsaBt_&ycii}*eb-)~v_qU^Wg`*eJtvGyg|XX5)TeDB8h z+4z1NzR$t;+wr}G?|0z)TzsF0?`3@V@qIqNSMa@x?>+dw0N?M#_g;Koi0^md`&aP2 zhVOm&z6jqJi8P?nrmN{weYp^9pZa{?+D*l;QJ`PV|*w09^yO2cZTmP@tv=& zYE7b-bIlj+fHb@lM)$_OIgW;`$R0AIegnO)(#UfaSLZz~((`xw3_Yunif-x%Kn-xS{r-^cOI@fB-3c(r#2ul4TW zt==8H(Yu2edUx^{)@(y|0hpwXcuheXoz;b*~!U^Qz%BuNvO(s^j&pdiFQg z8rk2(_cQqZLwtV=-`~dfch*|je}wNp#`m*p?d(6n_n+eXxwVgG{~5l&yLOfR=lK2} zzW-wFTeANW-+zVgzh3({v%inm9RC}<-1raH{$BRq;`{IL{rC8Oe(e`Ag8kyP|6%QC z)_wusFXH=$`2I(H{}aAnTKijT>>oZa`&o=t`R~4%?yvnL3={9K{q0ZT?>~^=Uy1H^}e(wJ*as_x@TOM)~~{^7}*b`&Z@n=kWUtFBE8|_TKqt@%zfX@5Ar?wa<7Tf4@L}{|}7K z@2}m%$o&4=zwsp*ZjAhKjL`q2{N7*tgRc|+vtP#FACupo#kl<&Ubw-?{pa8L9r(S! z_M`IK+ob&O#c2Ni+N<0A-IU+2lixqTL*ysqx4B327wz-+*ADpm!uv7zco+S>zxLT5 z;P1D|@A88*|1HZSJ)9H|huLyUqIELA!a-I@oFKHxG6jwXNNDy|#1EXzXp(H}C>>YiFajUu*5c z(%Ne5@9b@EG+JBjjmCC!y|uT$-rj3B+V$<$PJO+x-mYzJtZ%or5B3lCHX7~S?e(m& zb+EO&y|qstqn_U6XHW_!EQsBg4(wzt>Uw;Q{y#`Z>SYp>PX+TE?~ zZ|v3Td+q)8?1LZbce~ADF&p*n8lzrOY;1HZ(9Mm_DtHCDzE#D%xuNhux4W}VhT3E} z?k$GX$;EJ-cQ1zhCm*`Bv@}?oJ5?h0tH1+-AIGa9jeA=gApbv(F+!zn@ z#YwMtGMrqO07(afKAH`Bi~J&gw(xAV(dcNAkB=sU{Fz5vliuYhKN|P0^CBP(=Dk~Z zEq|Wo^Tn{=8+A9(VGwt~<_2;C3A5jY!G@9+VY`{mhi^|O3%XQfBYU_Ujp*UmY-C5R z$#R^}jjh&ak^(*+77P4&+8ZtNjjX<0ET)r<>^ff{sb`GQMplHDg+&LqY4A2S)9`L) zNWjO#$zXbWJe^!`ZDx;(e2za${nH7lXA4q}CJX#-)c2d)2kni`&AsMUyRo~myS=@? zxmiDGH&B^cd+W8W`sVi5er;nN1$%R=-mbTHYwMevwawl3`u1kF*Q{?fYdhP!^(I_x zHuiRQTbs?s`p#Z!e|xWeu-U3_G3+05F@N&jm$GnBnInCNG{;T+cHP;#UD)N9-OyX}pQ?MAz~zTMt9*xfm( zZ6ECI?r(3QjoI4VukUWhxrzJ&lx88I9mv?MZ=e}zBA*WSw;*AcsodOa>>?o#&>HR5 z*EhCy_M5GP_GY8LUfbB*+1^Aewy|-rt-&^bcCv1_vp@sTug&MZyQ9f)ad9`xJHxm0 zFW=aG4sln->}K2h`|ai~Vu0xH?QLvrY@xy2YHsc{HV-zow)S@r$HqQN&~ANeW9I;2 z-P+n{p#ZklQMC5=GUV^>!9JT;1iZDg-mIaGZ112jZ0@Y19PZa@XtOsCTAN!3o4ZXA zTTQsz+TPjSY41URRL{NVgmrU2+uc}i@6=k`&Ar{$*4F0k)^2SBrE6pT1P&06cAzPW`$k67(A_Yc^@WP4i&$f(WcZhZ&7ZXy%+b`Ew9 z&;uc>cJ}J6X1l(DQeWF!-&sdRYSo*y+D>x=#cOZlpm~t3ueVWaH=En*=-Lo=1a@a@ zv%R@p-#`s&Hn(>gTMc-Le(s>L+dSCVsiEq$+dIvJy{)a*fyM@bIhhWYqx?hJ2hZli zr)Xo3#^m`@9%Bb+q><(`qugZde7}TO4a7Uetl=7 ziRJ;}J3!q>j@8>+J3F<#8Zv8RtCp>A?6=ozn~j}%9lhi3*7^%8Cz2B%|RIs^ouwBpI z$mheWyYs`kvnGK__SbZZ@;Woo?&R?s4s{)_JR$E!p|bkD6$3^zVbC$EWAb?D$mv>~c)9(?W@A z9PDk^>aCr<{jD8T?cMglR+}yH?!i`T9c}4e1I4Y`LetYg8QwxdG`1Tp`u4_A=cs<% z$_^hN!{^S$TQCD|9v`;PYbRp9cyQGCsIfiho}51Fv?LYS7(9Fo%j1*o!$z%far8#* zLTtk0fRkGH;ibWQEreiKD~AF)I!KR}IbZev*2MnAB(g?6HyUCeuv;%Yh{pXdEWZ*o1#+ZhAg zmY@@COPj7HmXc;~(et>sk#^o240{vy{hlMm<_S;iuAU<>m99gIml2{~(pOEVlaRtO zf`%idsH7C7q%NSSZG3I4dICqe`bk?)!aDsA2w})AK zJ{`aL*5e164r7m}7<{7C<&Ta+q%j>$=YUQ>nmvBd{b=j0`f2UF**!j{RVotAZ+x`d zIDL3=ehRqLZ5$t+H69!tH_uxSGgR(}&Gw^*sGg?}vx}pXRu{GGxL#{~wCiA0%H#T@ zi;L5T&C|yZS)os2>v?Q_Gq!f#>L6s+X<$5TU7Q>}JgL2T^ss$uTfL)G2J)g-?_8Xo z(J$lmBe58d)ndF=i}93}PWSNqR1IgRXG+#Us2M>}Y8}mG>)dt@XmZXa3C_>aB(=`Z zPtUbEu&Ktj@aW-TCwthiO;Pu(hK8`?TfB})Xw=R+*?FsRkv+ILZnZC%1)T>+Fg&=Z zpCTns&W{csTu?9?^o#S_!wv+s9s*%&c~(1u@$8hphqdnc>8T++IJ&rKbuKu-dx$(# z3xptcC#{E%=#Bhk8IlIL)p<-$kjzIXXgTYrZ=!oRJUe=`b=-MVLj9&RbOHR9DPU3@ zi#OjAuD68iE$Odx%K4TKh`U{ld)}W;1~v41!r1Xvc2Xz3;Us_xPh~(+U6+g8xect= zZ2*luGu=L(&N&ej$A_4>1XhwCOqX*f*jcPt2i#b;%i3sm)5|)r_tAe(3Um$&#VC%A zU>7sr>%2Pzmv+-9Ia+^71ojFNeK8<7GNlxYn=m(S(B0&MT@SD1FQEB?(^AKzWO&HA zFoixbe+RTMBp5`%bW}XB^UF+v)w#^h(a|i6vuQEpV63>f6#kQZvb^YBW*DW(Uy02W z^UCpMZ{9_sLUP{4v{b@>SxHIU^q#G96HpR2!^yb!>~cCEAs4$8efb=hz$0l3V~#^1QTtoCFi+K~QKOK*!kCZ7zws&;}4Rh2DsF zWRut$Axng>F<`5s3ArQQ46koS_!jg5iol^5qR93~Q{~#UM5mTub1KAL z_Jv@OeIabK)M6(4tkrs>;SW)heHMahGwb(e-M$Qi9t`@~4L-)}Fh}hj_MvT)|z{uvf$P|2PQ3q;~_(a)}C_*vYb zZyX#AvUxs&&l%e7>)`~A*RT*fL}!ZvKaAyhKFE55L03W!^E@9TSk8Jnu>>+fFNK+h zW3txPvsn*n&Oyd`3I24*#lJKDp6A5^Edor9(X^1iNWb1pjFgI~U4v?THn!7=F_2>r zaTps3jhh?=c%VI<6Oo{&lLVm4ex=I!pVGuQCr!o z1XV^9lq5tl?y(q|>S)rg=hNk65Rps(R#1`h9BPGfWRPP4<2u6V*&D-xN*Bv^g^Cj+ zHr-V|7JY2zns#YzSe$x4B zKUYxcQ0g2tw`n-b1XDpHW{Qy77@;PrWkP8v$|AgUUQ=2G*nEkYI3S0*rvIdlfojAq zlV6jH5dk%gja`J%Gp1++2ALG$Ou-;~BARAQ1W`7fM4*vf!pVF%nqKxsRqPcM6PpSO zMP08HRY8%4AX6C2k7NSm|+%Ax>S;I0I-6y^=xt6yF-<$;-jZ$_`zf{@i#%q*u&-FZPIzNbvpm6&YoSApRY_1A ztJ_w#jZ4tgqsC2_j=>~a(&5KE6mo%yi4|(xgit5%&HFb*B2H=o zHADklI1{H}G9V%vm`^98J5|S9>LWXgk!hQ5)UY(VjFC&($YJTIT`1!+Rm$wlhdV9u z`3T($yk;=WR7Zkg&BQrPwRUJ-Y#$M4v5~CQxTs!2Tqq->RLN_s@`izj? z!M=(Ga;&f*ri8cFoXZxQ0d`cVt_`Y7EZ&R}OXii#L3RFX&4f9`#pKlWoz703gi;vP zGpN?cMRR-F$0UA`olbOIpewOTgSJ%03Klz^aKjB3ur(C6*4jz0vs19MF!`K?p$w;o z)@g*rGe`+02QCqhl-OWCX$1{K%(oztYK56PT3%8KQtPYU*5>AOYe0xJ-IjiAtkc zX4XWg2pPSrJ7O*cDV0%oS9)m66;E zG8{jT{Iohi(oR(b6q`n5rc{m@G{xN!%3F61o#<5sU6%+}P$6~&g>qMr7MO&fZR}$; zYZXg>Ip>J-xjeIZ{`9#F#-Hbh0*fMxRiUr~L~*`Cj1B1uGKRFPq)Yf$IGapwS32W7 zq9UW{q%R6{nQ2sTT$gi~eXt7+OeE$mL5vS@AHp2L9RUv{NpRlQ!Os?1eX)+am5ExTn_%+O6?n1kU|nOpbc!MqqG|@ly)2JW zsHR}phM`^Ag?Leh{midSqbDnzv3*%V8gkxN7AAAgZZ+{RU+7p7`ZX;2zs=mq&=O4+ zlBBe8%NGA~BErAyy`l-*A(U-HR4z-D@t&&H&e2%*uxB7;u>*TECrQaFeg)CG?U<2u zwc}OPi|KUKS})WLyt0FHCJHKM53>7wI$b=#T5fj3A7&;8;u-zHPTVog z1a)0hC)Bb;DrkE;(xs_@oMKlA&#*Ae1B`63f<3?@KX=rK5gJSRD}`!AqBO^KG0w0& z1*Eft&H;bf0Mt>8B_z5}Dtikmt`j7|O|y5$eM-6o$`G{-7z+}Lhf$1;{uQ#nN}_0t zL^)^1x^zfQpwyp};b=4rBw(rgoJtds>?}~lDN0Xdv~9|_*YZikbRcfZb`>qbT%l^B z&*d_FK&M6-Ep32cVfr?(-rORXhd3ydFK(s-Y;cf2GcI=zXP497ToappOm8B4H=&rl zCCvGK1@%Iy%y{pF^F&Q$45i$2XXi`98g56g;Jg6(xOKgaNrnD0l&vZ zYcRx;dw@V!jERNq1vInp+bV7D(nw6b*7z0VmlwgcSh2 zW4;j6?E@U+!M+f&Fo4+p;>?cI4N=uNQNvIQ>=DjA&xAPBD#S<0%o=i z2;R)EdKh1Y5ZCL(9VIyn7j!H^l530x{sujRXN{0HS}W%}6j<2k=d7YuolQ{}5N+qa zjCQbv6x)iNyK^+pIoe^SAi@?{UF#HJ3?(zm@jDCR;>_e?eRCBLjR>Zj1v3O^M9>1L zVoi7)>5%O~6#+r6CbZGE$d)Fyogz$TW3gE6!P>)lu@C}#OEFLr$RLZw=m4Ev_5mr0 ze1n9~+0nL5uqO<0wexAQFa>HjGc;T*O)_{JX)+F}p+vQ@L&+2%ls<>ZxX;-xu(JwH zVV)t8&%kE3FQWy}-Jv2a0lAkzap#}+M~Z1420x-l0M2rHDuuCs@v^*)U5(=0Dy$~WH#KWgs#yk{ z)MTiYV$a=ZR55KL>e6F;#cZs6+-?7tACG#z<7uRskurOXi2XEc+pE zV3&Fk@Ul*ub~12LMz2eJ3>7kBhNIGp8&P{)3}=Cim9!OZoID){r;=inG9tvxz$EwF zBus2N4-;c>*giYLNDnKBg41iW%TLlhG(X5kGixWGR7VRO71q=k&ig1htd=O`Y9V{2 zI^kqEz>Xy;bW(?_H3|V2iw+yDL~jsqRO%HBC@qMtF)A*O0_syJrhVv<3y`%F&N8Y{;g7#xL=8Koqs#Eg2d1n+U}*9wRC z^oqTJk$)pg#o9E@`=b4nC}7&F7EF890Jo@){Uyj z-cc~btmthWl*o9*Q+?N(5WF)kp?U`%f4Cf9=JS}U0h30$%1IT5rsKK_mzq7+(NPs$ z*U&vh#}>iH7%k7-AL*Ic@p_w&3uB?P(kkj|3afvW3wC{&<5rR648;JN9huo;JkAEL zim|iEXXt_Z=z(Jvjj1%qs3BEOdF-$f=lPA$?<%H;y{E%#nJ*%6RSc@zjEJSgm(W!? zW>gAKsCJkz`Fsk}#LMvH$52lo$zV^T>{5QDaPz~kjoA>!S#kVk-L z42qxU_hj~GRronn>chodOlF_znJ0a$pnI#A$^LxQyYnOjuY`GaEgIsTchZ4!!L+eb zJaMaqG~LcJX2BuKw3Nw?(A6XuDgwqq0VxC)oD+##dawN*H@>iJ8ykgm7I(&DH4)=! zC69X>&klJm8FYEJ(8?i`XN1Pt*f`epHZ6zV&T*BO*X$KH-o{&>)W*HfUN%du=km6p z!~MWsVp<O*YOl#(q5B3eAfIw28Vt@M;~j82AFYSkg8?pINy4ZXOU zG@sQ>nPxFn0n^c|rG*8JJ2hT$!)UY`f{F)(0?fFClfXx2kCcSE3fI8}YDB>6Wt>lW zCZBnna0&01Ok-ITd{@G*Ql31Pr+~)>7${ z9jEH{Hc83^8mO)rx4t<)G_lQ|w;=f~LcyBU7GbK!2zi*@E}YIn3VpMiS{z3S6wZEs zi7rJ38J;r*x!6!k!7DwwP{JqE1#TiL!M)Tyy>B&K5p}+&Sf23E-SK(ZU5bqo9*M5q z6ykh~<@92DWTSg6hDd9*)w*)Ip*w0E>LdUf%$E0nMIB__+ z-oQvr*0~&KjG$Qv=%!;ano4nUmg7PXY$&)^zx42gP!5Mz($lD9MpI0Xzf=?b*DWN< z5?kl8xkM;rG`nLZ#?HK$=U4=EJer$MSYTaFxFK372v(h11?P&{?A$mD{bcj&0A_Lo za0ut9Lo0;teC@M&6eC?^VV=pJf+ay3{D&xNJw*L^VwM>Y|b`dlV^h` z?U;4oEEE;Zj2(q(QcanJGilGyw$yrttr0E;){I>ej?NNoW^;}&#TYcGd{UUXT zr48p&;L7{ZGghL|f4WBQ$cY6BklfF(u+d=?Kktf_-Un7X^f>vU)aA$Zk*r{&hb@z8 z>*Ndg!O0=kG0;VU;qeUybN>g!6Ne90T>9hu=k3RsjIVQ)>Lc0nBQTI7Ys+xBVoQ|0>R>+9p(#eW0ni! zGF==s3UncK>t{yh9bjFU97Ox4Ap77yx5fF#bNh-Y$rH^}pc(o;TW+)b{9q%Hw~y&q@n``$upcYM?D_Th9hhVD;3eB&N;FtANS@@ zJn2G?;>fV}7B}Jr1gIm?uW~%-K`RI?O^)qhT<9(np~}Bv!!6^#G8y}=`cTtxaOjC# z7JzT6_wlfa&Iux)&qG-6X7dPpR$HTnvB&f=+1FM!Fi30B9 z?L8AyK({FYQ3G^7UXCR+u$clEH{Apz6C0?ka8sZwj@|)wK1}XBp@Cw1J)H-LZdJ>< z^HUb6Bv4XVhSY|8r)JrdkpRzSLN(#AqZ027O*d2m=qnJwGL_X#7Z@WYo8JnI5eEBC z!(+0;*ytGD3+o?S9b+UqFq@47Y63~EuHV5a`RkZ%iJ^&A&CZiMu{Ufd(XHv8Qgjxk z+vwIy$YBXNFCk|3jOl?P(Qm0&5&<=NPYk=JfGnF@iFyu1_z^gnwi?GFrM{AKxRP=n zQhay=FG59_dg`HYX=4xDGi6~2 zoCU*KMV&W1f1$SxNz3w-8XZY>HF-W01jFm`f_oMWidJ%V_Yo@l9Ff6LJFtjf{KC2QPJk52+l4ox@Y6mUv17LuDEB`amh-XlYq@H z9$+3tz#^nll$(h0LSPYENHxpfHe9Bk5NRZbcGD#|pS<=;s!L#H z3`L#k<5of{3zgIy>c|;lwd62QhF7gr+p)U}{n++|3b(S;e&k8gG*hb8Rl3LL%Xk={E#3l;`grM8bD7I5MNpDE@Oe@xF3^Eg@ z4&0qyLEVDmviOTm<|@?|DA8U{Ayj9v zerYI}uk^-*>2@0UfKHvvlIEVfj0#if!V2-#4j2L%>8g1C0Hde1?bfDOV*)GlyFJ~Z46s)Tv4f^=18-Q z@??SKkTz3lqea+|yU{jIs4(`5e}mpd)??SNr`fRfJ>Vs`AJLD zKH}Fp=94}m#<@b$sw^Q*mjYc#2tDr2B_=G8V+;^j^03$^7}7^JT4>y{q}Ah=5@R#E zI9V#AATmoDNm?3XXL(sD$d-3nNC1&*tc9xAB4VN+gW*v`aH&8Zkg%c_^bSHGLAWJGOW0?di|TMIb9Ukcyff}h~h@CEtOC@ zBaV^W;NpM$92F-$Y!k_@E}!sc3^^#`#SLDgK`oVIdl`qKC;)039^|vkT3eixz{>FS zco*aWxMG;kiouZ46M?Tct+U;;~4|1_{SsB0mevoQY^J|zU@5_uVvxK`;uZ3 zrhtcDvuJo1fla3KEa={k&c~NnOz_;1J)lu8k0N+ZZ{wy$FOfyAfjLm^>9uDrfs2%j z9@s*`m*~9PGHQ#9=c8-3Q{I)gv90mJQ)!+rw5wdtOBv{zJaY^87{N84=bi@>vLO0)sT@ngXLkQLv$r(~VS`@n~GYzo0$2uhQY5;Mq0oI&;uy^W#w zT$*&KwVpMBG(jDQ%_TJ4-if5C1(;WkN_G|KAm4O2Nd0hDI%?{ImG>h8%&aAdhaOe& z>}IO309qO@-Kk{(WlMNMyL&55R65vHG#+XyrUKkCZsUH;%Yk%?CF(W<-=T#sqXXRg zBQvg$Rpbu)Q{$3e3zMQKj`PViTW$0qYQp_R1W1!xilW6s1L5W(Jg2Q>HtlXJ zu3b`O46vpz*B2=p>w5}ORVTWGv2Amh6bK!sOUdR|EDScp^F z>$p4Ui40VEn8puKDHg{Z0GY9mnq`BAc&S9YrWHb{41qN`h=oAOj^%)QigzKYy_XQE zNjH2M*m$lK?9=JzBSS%Bg>D&B(n8Mp0PEB0j$_pE7w3X0ZO4{o3yRpcoI%B31mV@*e zTQexEi@rL*pqTnQ^oM*mLNSi1nQ{IhMa5n5D3eZQmwf7gf)=X^t=Zt6NiK~d!17^*pIbCA&jd!7Cf?IhJ;K*qO<#bX3GPajeB&(!UP~x~UPh<~@ zWMoW}S+WMo1m6eT<`ilPwnjuDuOj)J3LS(w72+n#ZBB(GDJ9bx;wr6a>~V_2*Ax;j zQ_%XC;@&fkB35~r(5$Bk>^)8hk>?4`2jC2P*Hr;XXf^-|>;sSxq5vc`I%3_8(%Az# zx%H(&Ldg2)S&Z}w3d2<4oEfY>BWsD;3Fs6t@V!SL9$c}!$ zlDmZSDW!y!?guGod@JFnlSk5c`ZVs~CIGC2>z;{HI!GHm>~j#-A#ZB%K*Lb9-!DKuQE8TM3gyE1@>Y zN`!dCiE?o=#qFHs1`NuQC@?OS93e;qheb)?&@=%YLAQ13)Wij$A2yn5(K!04>w*(Z zPIh@qgv`0cAaij}v#~eEOvRlIH+Nz!O4O}NbrcHM^OAOEY-|_`OoW#ldW_O?7@OW6 zW%bTz3wbjQCdIhR6gzX|tfje{5ZC1*TC!m$p<|77dW(}-cL{E8ro#Fu4vUN!p+h~O zcY4L@rw~;jE@v=(u*uT9JH2|G=bA`fSKGOP&OuYA1P`Z!~eMM#g}eO9xOt7y;BXJ1Q<`D{dg+ zAx_cY4^OI{VuJ-Y@yL3G>@uc>a&fi}rlZaSJTUP#N*F9y!0{IHaN>rufzaiQq&9?h z(nTQlGYHXHNRgERhsfdp;+A_PvWYBLPCOI6D8s%)IZg_o!rlS&F#@Q>cT^1_Z!~t0 z1~G<2$>umDkm!{iKqu_B9l#FSS;)?(Asj&V2pEM_zkA*}poFtv+o~f_QYAq)ftXFM zj+k&Gxu=nUB=i=lmeB5As57ryo^)n-(iky-9&EC{#@k zr^YNgC1Wk8mhD5-z46nvp>vDsr1nXV@RB5?0Z!SGaNV9^~BR zv_fDNQ6yFo4zVaH;X&}Nfd^sG>}1!2;nwEs1DNoFGg8S|c&5x4F&wtW+u>w97G^9h zU!fT>eb4dma^9Q!u0&WE5mixVwh1y;Ql6Uj%s?!32}CZx8&!%-VC7L!I5N)JAsHj? z-$grX#Y!E;f)^;z zYvcahF^+#3I@Al|ggzYOh!z+}`bQ7VsaY?@QZtsr$;DrsX~xzB+FZ4_$DE7Tk9g(f z>ugF_Q|asTIT%mjAgk{C$Oi(Dk^rn7hRVCgg-yB|Z;~;KSaI;AFNea#rh_*zYEclQ z)go~tgulvMNN#9s%Y~q0C~Pr>3-s#Q4MrphBwXm!pHvZeI6vX<%VkWlSdoD}APK9$ z*YYHHLct`EqxS@ro8`ir2qhZP+*nhB7te)!(n1R<(p||FiJ8|Vsom*!)M`{0?0Ql< z+HBb~jq-&)OXQcHk4 zI~+kcnrAa57Be+*cD;q(@eL9_XGaRn7iYMhM_A=f`XNK37uR56Ppc31+}w`W8s3B<7(e z{l_E)8>YV+XFB&+4e`IsRgS z_Yi#`R%b7;;z{ceu{&f9<~Cd!yNf2<5L zPQ2}{9Mj2LwM(;xZIvXJ~H3R-C{v00FMgTR>*xiLpyg>f!8tt@09SIA}t`ax#mfD545yy(#B z48kuL9G@!c138veOvf4rB_VoWxyQk|>9gsaIIHd?5-S&h18X_10g;V%V2yYa9KCH2 zA6@&8Q~3rOydXf_wqTPtAxYvc3SsuCLTMO7pf_<+aAVA9fK&F_Xm+KE&AwAcKsDsI z7MBDX#2k#1cI}*^dsiuj4hri^o`>%A8VTo7U|sOuSrsOXn3{Ug?4>;o!IMLko*p9z zZ$Nj!^+MRXN@zVKf%Vpf^Dy3<`#LuFGL_t5Hk`vIM8oB?~XuhbCmNyX-0O;_DqA>f5k(#rlKj!%W<1S5nSu`&AIhC**}3Zk~%F*(bf zMag2;L&Ym=Hp`ykk#;_EL5zQUP+q+dvXqGG=L9^H9b7>?@y+?yh0v*=uX2Bx`2%I!8GJ%cBW@88GT3FI0^$$r9SBqO>%bd^S;mMdP1c@n&If zeSTXa9-UI5%+&(1Su>VI1M~#fVC8tM?kVP-C%x;*@X9PDm>gS0#qe&0JBecOFtNrl z1juo0ju;EoS-o-S&6U{Rm z^IimReS{5e_Av$>J$ahH0*uMrqTbXK8Hghc%!jxkjO1ZpMrid7H5VFAeq`d|9mq`3 zTYFBD_Bptw41I&j#wB)Ypr_K8vRR<7EQ1js-K(XN{dCUu&~t}&N!k#g19uKTB+#Eq zf;*=la#PGPhIAoD2`R>5U&sSR7Y}}g5JhRe=&T{6Nd=UlZJDM+-ZJhIJQPGvO!FSX zlwSd(d0X6(L5~DaPSO$P>)mLzv>&GKCn$rC8uRB^8PD>1fcM21UUhuMM$D zejD+41#1g?g{8ci@sKWR;a;&2^lykslO#Q2fH49ohRVZ(>GqW}y_1jSKERGJf-@6p z-0P;-a-q3{64$}3@qv}&_`nKv0H5Lu5D7+L7ljcEXMpvoL`twXcxy|*!@?oT7#9+e zOw~@nC6P?9NaGmrx{*M_U#Xi5+{t4Qp-wJwU((_QZli51i960J7-O?>%qMv%Kvhho zQ2k3W*=vBRnEMq$L0=U<$^vJuxPyF?Mx_F zScuKnUmp?7tSc?q&(b64b*YIO$UX=@2ksWfiEb5-z zs;4)Ds)h?|FwodwA)z(G2Ez$onzLyS9aCWQovidZ?(StQwqVuRTiNni?Ui(H&O(YT z7dqq+x6PuG$}SM9HyuHmO3}08h^e$toMuUX>v+b!XU;scZ1e+-BhJ>dfL#d9Ri_@Lm4%#cEC6H!KEOo0P9MD zaG+~l_w~jAY&*bBBDfHfIgKoT*3adfA_~Fvk{Dl|E~6e{0BtF4Iu#W(j zcIcu5Ps)IcZ*W&2ei0(%3zh@~7I9eJ2ze4K1tpM3v6zVP2Yn>n88Rjg{|cQ#LO+~c zs3I>Udw?l!&jE=@XSw3FUi5%0*dCzMAnS7kpbU7bO2o^{9%4}CF=h{8btL4VBP}5C z5ZYjDyY)V^_2+fef!`qn-$Sde1Cke6&P5n23ED6#!5E?DwM0F+E?YJ&QwidscE{nC z49RW^BZ4vIW?>e3D;P@#G@_TVh*LF-)|wakNWxdZOcg593cgC=7-NJyGibN17;7dj ziaJN}Hqs^-W+V&=WF$XLxZptuk;?}iGa4qj^Rt?gxZyt4Di;nXKV$8foP`t#wnJFf zVuU;r=!hpq$Rp_!@x+Mp%OkN9D>LoNNiCX65v)Zj#e{3 z&BiNnS#WgZ1&!^!gz5?JN`z{CKsAEggDCJ2&%!;;#W=QxVIg~c1*Ccs!$&c*nu$TH zwHmdMiP=qa?2ZZE!9dsb-dvfPj$+bomm^%O!)36R1%`A&m#`ldVm47^Gb(l_7sjDt zHls9a)fud#hDl~wPAAqxIZt9a*2;o0ESMkz<|NB;U>z1*Zgf;w$s`-*WQG1>YS-t* zG`qu}Lv+3UX|}kVo-Dp0-gV!+Oep7wqKx|sT5Kk2Lo{0_HQI~vCQYIyWND*Ml4#|Bp&Auw1 zPo;VvVo{{Pa-7;OFmza`k=kg zHRTV~pd@;m2!YiUOPGA2G%$*lht_ zi$&;x?$a{Y;a$(nU3f6?;xXEB-5CC`{NfJ<;SaY=L#<8$Mx&llu|$ZBnhUg%-`mh5 zBX@{1Rl0^7O@lIup(AgD%tRMY^)Gf+s!&)^BE>4v@m6~2S_)jb9qzt3)OF8wnwoABSTJf)$8jG0;7h&w-z{436chz77=(g0* ztg)Ec%`}AkP8!!BE4A_Y07NI zT46{~8Y#&bkqDN^T68qIz-FOK@Vtf2?F8lSMwVek5Fw9axm8KfI1UFw)80>vDEV0B zk;7Wzor3H!MbsS)jGh>np!R+WM~MJ(FbBnr7|yXR^eG;l0me)5FQ#I&!)3x!s8Rcz zJF3LQ!a6Ai5sTO7@ur{=Z7rlo3uXZZHUdV}#agP{LE{h#z~IK&H7~vWGNARX7-mdu zGLhgMaw{yF&9{2F#)Tp7U=yZ3pzTs3fci0q#7oNj2sy#4!6&~0?N)|hb!vX6bHmyX%u@QHI^_O! zJy$i)Os1d)iXu5Ag`@r|x`^Y$IaNeefL2Il44Znxl3b`!!6ISefTL0}1;A@81ywm^ zbXQW(?cMlQPGw2LobIWj>j#6< zZV@O6E+L6v85~Cl3Z}lf6rqrb-5=Kx=0lZIIAY-brB03koL)>5xs)YA9te$4>k30x zdl^bZcSC@qp}9&UB5S{1O_TndA!3+iRvbBHAHAAtwpUd4%fn3E(5s|r)>H!p%L)W{4TPiHV&}i zpR34xn9Fb88=(Ijzs`ebf*-l?u|^I1GWz8FV!qG`5cD*#PG_>cHlPM}?aeK1Ix~Bk zsp3&dAu#usWr^Hq*sJU@g!2yWd1>uJg13;N#8rRUO;+J-tb;d@BmOEp@4EzXyd%HW z#bHC_vyU;48CV-q&Rd-@rS|OlgIYD=f@KzkB`z4%-r+9PK&s9@nW&7^LXwxPYT^_S z>+e`Y!d^}AM2iCsbq5d~!Ui0Dsk2MVh4Y~s!jK^2UA=082e+LlH1NZz zjy6IV<2Q8f9M@@wAJGsR?JGkx=t4_y2m~n^!qS6bj2vRvNnz%?I8l#3T$i=i;OwPzI#}72QI}=eBTR_aEIk`yn34S5UdYyWS(=o* z4DHx*fNk+glSJVGAY+&02<)V@76s(My6_aD(8>j3F?gIW0(YUkAJBR}BqzO(O*NyW z@=M6o#BkJbT*l+xhD&)3u3Y_)$ykt`UJ$2$7?rc+4eXSFLuv7EC6QCZN>}uiu2fN8 zDX@Y>aTTx?W_>b?6_rw-#}kION{01EgHXl6qTr)d#o?n+MYTR~Nu-Ky<*%Yk3|6?c zvZcv;p750nl)jQ^#WQHtDW4K-U?XlTM*N8=HtuDL3s=NXNz$_N#atdAx23fNN~0Tc z(J2QZ(9&=!s)gRUucojOEAvZqthy4T|1yU}>$x0G-C610CRjO~^|10u=xw~p6o!KF zDpMG*GMdJ#%#p^c%n`<`f?64R=3P0aWt3SO^D)F6xiSarq&X-Pl@tzR%ltMK%M_c6 zWr{5wvCk5w-X$X+6DSCa2xS7){AJKatxOR)h(wvfsFhJ0wKBy`PdJL);qyn%}pie z!@`guL}Z+(M6y5Nl+yDCR#M-HsezT$nCNY!Ny2-Gbt;9JuAW02*+c6d7KasZ8KQtx zm8IjLSlTDziPq@Qp`|ja{E;62`Q9WfsV@ncp0Lt2c(^$hTmiEtCY%(YduOz9i)B<( z`f|HN$}d5YI|wFZzB!!YuUUc1=*9NEUX|^!xDDh zI9nk}Hbo`4TtS;)l)-^V0y8ibF#DQ>lL9os69Pq45;P+cZi>;e7^g^zkx!dtS9oIw ztBG>LzQWZ+HV1hr^uqNqX3XdFvYO(0o`|24R4E?8OqmK88da!RBF-o%n5z0fQicmk zL~%ihP)d?o7>h_Ca=8RdX!LO<&8BVQCZ}S?`zYywM&Bcn6cIumv$LOlPRv?KFuVR^ zZuTwSErqf;6KOB`ER)aBDxBp!<)sX{SQ9kwI!0^+*;B?88__a_AuXenq`J_uoGM(G zL1SJUni#bqiBX0kMtWxLTH~tW;nfQ$qcXfQi$p7iWg*p-$dWrs)x|(3Ca{uPoA(2R zVUH0gNdo#)a{>)bc(DCOWJ?6*%i_l8oxG!^)=N(jM$8BTK4&u_;vn3U5g-pBJl;Zf zY9vpw)Eqe}fjDjubI~amj?DN7%HV#Eo$Ha5=h3+svC6HLy;5k2KxrkAV$6&`4p#{z z=Oe3?h%PPuk^6bmh*R2CA}2_yb9C^o$S>l2aU) zDD-m$g*WGv_?;vij<A6>#Jr3znE@KT1X z%ZQRJj#?G&5~Pag(xZ~duA~mMjKyBcn9@U< zkeE(-$fS8Cqs}8e?}AfLZ>3YLoV_tDuo1trxC?3YX%&s`I8E@9$Q>h`Ja{@?oDF9I zLKiVIi|7(9T-+&VjG{gQTC4Pb zfdh&$O4ns{QR1U(oh!v*PciaIy-Nx7sFENqWPD#q7I)7fKZnE$o(6-y1*IS*+r%{O zNlFe1NlJ1NXOo^1UF0i?wj)Sg`IJd1K2b^(Nskn@u}*Ot-4tg$Q_P13Q^=I)15`zn zFjWvJvRa{(6tdpa;k8_LfexZVPO1({Lq~tm+yXOgSk4UZ*exRKSu_raP;0 zBIUfoU9rNA$g^7{Dg~}2t|DBPBjZAC`@~A07{rwf&m&Gm3*z&Y-ccE6ruF(HZ3GAm_bgH|PVwWj) zDf_)WkGKmK5j{nUU?s)Picw)aKP92edw>EW0L9-^V~?Xua@rx!?Y(rI;-4y>941~S zm{CqS9=a1{kC#qo2}CZbO$kocDqQ$|k5T1nHFY(GFso+)wR=(JN~CJi>&I5$dr#oi5Dm8Jqn)PIpx}`Q5y^arMQjQR0?J)gSu`mGehL?Gg! zJMD|So6t@=dkiX6LtHYi0%uQ>@=}IX)TT13aI3%#c`3s;in{j9! z>hDv*k-k49Mq2-nAi+gOgqQ>|!NhCbmXNYy^2ahC!kGP~5Ct#|Q(THs1N7rZ7Zhl#=v`6yJVDc6mON%j#LhyCq?0Nun03J;=Nz?jJ!c2`oac^PJK7eHoyz0 z!pR?Y^0A9*O4$8-eoBhFcu!*ztfIx;zjx!ie~-}*-_3iR@~d#){d-=@(B(v*GNGMx zj)#pr%q(RYN)BOq7tiP5;CZ!s>%((ISCA;P0;aGan|M^zhq96oWS{4z7*zr!5iNm{ zhb1a=!ueXFI0`E zQqCY|sQ?q<5H|4%Aqwc=y486p02OG7kFJBlYLvi9CO?-UD9mNoR(zSl#HHLag#ybc zC9w|(qfQwqCVXz(Rpnq6(T}(iSL|#;ZzC^c1wW)ppsXJys`I2ou}PK6Vj_hYlP9#( z9hE>K#xSH9)j}Z;-T5Xzq|kLWg>GE+<;*K7D643$Vkd4WFK+l#iL0q`#}K;nT|K5@+k_?)X*f8Cy@LY5ZacW%#DMxuM#zzx*;?0gW5{RWR;1EZ)m_gyf z`Js63oA>%^vMYvVmlPb$%@V1rXwkGSaARW^KvG2zod6=2opJ>*IV)g0;R-m#8>fT} z2;x~4!K*9-ZV?lt8#5swi?G$?Fj*6q%)USn{fQ@30g=9}CPst8#Fd`Z(;`4G?1;5A zgcZP!U)>xin?e)O{rZ4Xpeh?ZMrkRgN=VN`cc-#y?lHPcG4h#}^q8>(n&oxRHBH1* zlrF7%9(tK#I(GFubcZzafJrS61d&PkOngGvge!z7Kt`KhCOt_YaU2$nrPxNv<5y<@GyXn8Qb_5DkVjS?QZ;{ZK%mtq{XhdgwLCoDp*0;^8y%v+Xp ziYK?_peRZf795OCbWi4%HUserhHhV8Pm}mZ@N{<9jZnniFvtL1&Y{{H{bigk2-cPh zGZ-<(Q(S(vFlI)?-p{Cvl6Z1;A|79bL%H=rujZkxg?j{Zyeb9rVU8oO&h~nr*z0}y zgAu6Vz@;AcPTuU%5$_Dq3tuvM2uAV)Z`9%XuECHl;JbMU!~oINJUSVowjGaV@uq(7 z%9$ev%tx~X!dkv8?AsmYh1>Y%A3hc)FRkkINd|gV!H^OtSrM}EDv#E)g>isuy(B{B zzC}qzT=rvLLdlpAfz@ywPp|RN+6cRa@V;w6#&heJc#q9HXSPAho4l{W96`EZ3nWsK zEUZ^3m$JBJ&BR$PB4g_BVE?+9s+-u zFYv4#s`W8$nm$|LnyeBampc-1ssJIrSI3Yq<&L}ogr5EI6@ zH#G2?Q~s6ON(1K!{EOEs`G*nWi~=EGAr+&!v_{NwR~v=lS~dab;D!#EU}7MGLB|aD zym(3kkb{>?*CvZ$Z8Yo^;y6Zl@3g1aE(-}7E(?MQx8xW*3jPdJ+QO$Gu9rixE#nTk zwoc4#xVZl4dV&|e*Juj z_>S|}k!iSuduHw>E$m%vmTd20b95UjlzK@hN~PIEz+QD(WY2#Z@pZ@eI(FqF%P8X$ zIFU^_nBk03>jPKK{Bn8C8wpRaMxbfM)q^5~7jo;g+8A)NG@wk3 zex)d&sRG&n+I1O=bhpM#WdRac&V?8#dfUce-9m$o>oA#!g?SLi64d1{ey~1__z%~t!_J> zT3v8i80Lxvkqc1iFO&h-n4Ml-A)VAZ4a{6yHgG6LvPZ7C6jKyZxy4Z6z=a2~?x5Z< zaWJ=KucCm>Jbk>?fHwCckl7aj(8?BgXM5BhUZY1vd!+Z2;a+d14**ff7_$;lBqj!s z#-z5ukPcH57D3z*%qz|Ef%f46iD8s!X_3u1q`NBg8HM(!cMT)De6*ozVaVCg_7-YK zK_x9f2DeJN6309#0tR@#z#mik&Hc1^bj-wo_l5P`-NAxOJ(kYBg6Qf{+1a>U+YMQhq)g)vTE-L3foHUfCo|JLsNyVkYl1^3)CD-MZoJt|6 zzFJsZ^LjaE;jH3bVV4cjrNWV?a(Al=Le2D-`FfnyiA|hG{AI%8FuqARk_A-?O0IV) z_sL44dJOX2mBZqggRPR$SOCw5VOcYF#3h0SK?^6*s|6 zykc+QcD{V%gBOLx!@5Ml@Odn{rP#ya?Zh4pZY2)D@WNjSj%#3JCUg0q2mL+2;>?vE z##t}+^t=&KM-057zJfvK>m}!=Kymc$-7vfTwZakzdxfxA&e3A@io7%B_FtZtFZc|& zB$+f4Rt*RS}?_X6cFPB9rCb({V^?Qmvi|t*9A`4Ec<^N1;u5l3TJuCQuO@2Yi+*xbfLS!G+Hj z((bv#3$-lNof?_a5UUy!!*Qf7G8yBT77i!K;(U>*PLqY8$VM}~vC4TzGv_lEP^1ciyHmY)8W2ovs_4W+wsFP9Fu!B(~=v)-=y_okvR^Yv0NfvKqapACmt$Z0(sV*#WIHEA9#dTw9 zmFV+24K2?e4DD{_p=1{Y%gy_a)GR?)qiR2UiyP6UDQ0uaFq>n0c*aJuZpQpWULm*V zXjIT>L#?5iE_xCa5m;GZ11pPjXT|}xCx>>@-OdSd>}{mse3S<$I|5JwJypE&r_(%v z&a_PF9MCdFeplTjDO*z&HD3}ftoQ#&f7Bom5;pAT?EJQc7; zE8?8wJf82>Zcs(=>GuHeDMvL&g%=U5UPKTg=v+~l(|7TuZqfBgoGM^)yX|Je znReKGh?OdsCE9a#Y0|-1K$9YZT#tBS6gzY%!y$F8+8zNpUCu8(>m^Pt5(;_@o$m}fgM*p6KfjrdFP9pAOy=8Dv~`I0;S@Le(b&WDhR0a0 zQJa}$2FL(u%2@;k+yN>>!ZLh1@uHX%%p&+<+Z+=NbnXGc+tAM&T#}KET)-zSp|uAz z^73`QQOFzt2FH{O5h;n>W6+(j#L+@8*OCD(2&*9bI{Ql zo|cq%JpxxLHcNQuuC$yjxlu;B=fHH&#)lD>Z?&2lK$_eLAq!MLA>CW)JDd3+z=4%i z+m{9$DP;O!!yyU5avivkA|KGTBH0=fFjfHujTw5`*&M%r^e(P}^z8u!39>YsaCM&G(-(`ps7#>J{f zu+=N(N9bQ@56sM{p!1Nhh4zYIgk(BrI^eMr-%Gh>Bu1GaF`_Zxq)O*cp$s28JTdM% zKqL#=DAvmeRc6-kkk_=4$ea)z2htdPyR4=e!WJ+_yp$N9VuJ>nT$9F{j<#nt$>^-X zbjSC$Rb8@fPY8I%t_#n!Z#Mod(ST#yk_K9$L`V9fE=LO46MdRIKo~^diAxXzt50tu zlucU@xl(s80?KHf4hy6>mPQ5Qx{Qv_lR<@1XZgWHmQKD*7_mo?i)Y4$VvFQ}Zc`R= zQ38UPlm;IXmNLo?H5#O3W-o{J5#`ow=qhYJJjMJ%%}i}$WSKI?1v+SF7WdrwWr(7+ zmN~tx>9PbP3TJ3Wuu))G+~jwn!C_n<6RVAG`G?+NO#KP>HE@r`D1XKgh}mMqriP`g zw#Zr|T&q1=`HV#w5)xWIE9qKX{28>|b4{ts%s)8J&o%>{!fj z)GIg)W;hNjI1FYu&MP&naaupl8`Z3#K8FCeQt)fW7LmTLD#`lDNc3m zlFKd*R}szw0z=~kGf3WMh8769#|m~B;+ICxjA5xs#4Z-BC$o1FI)1RL3iJ3*j=LWW zXyYe}eqr zg<@mC*oav>V-nicH8Uba5ku!f=6y~UtC(0Q$XTLbIy4Nb1BbW z9fl~o&=i!-VwtXkzp7D1U4)mVUz5| z6ul>jG66GY6dvy1k*5yvlqpO)yp-{^zFNrvrS5m)GJ_07j8%6&$=0-P?X=5{!D_j9 zq!y-{pl7{-{3Xzyjs~)V3Xt1>guuE`Nw})wrWkfBm0~IhlPYd2hAmAR7)nWT3Q4h9 z5D9F~l^MUp2va%<-U$lua3T;k4B%-=rV@QV=OD(|8U4^cvP?J~i=#wf)Y)7Uv4l6sB32O|hgPHDf^~LX!5%Z4zHC zHucr^|FiZsP*zn}y68TqsyL^hs;ILCEn=ZX2NUd|0Y!txbcR|k zWJ|=bb`=2=Lo9kMPMT#wM8gJ`sT5071=Dy6;_fu7C|07HD3&q~cT&;CXtgg9qm9Gj zBK$8`aiR;57a+L35i3R&j^z-CRrwgL*wt;YSb__Xsz{uQ-10(fEKv;PgS4?SR_dR= z#z@B?up7BCMsAmtxhWS*asiSY(CCWM#6U_*EK7AK4zy#$V^Qqnh=RFCm#|~WEjQGFS z9U=3Jfw;xmft?79;GjHqp$!3DtIc(UuS<|Fw0D=F$hn1?)4jSq$97?1|np~SOk`)dJyOyCb{p zDRXQq;X$YfB#STuQLI=9f{Pby+Sao!0PyHgSMP=Z=r>v>lPQ2ZnLU;?2Fe_;7+Npb zUSLaS`?<2_YFAc_J4ziBCA+n~*OtYq(gNNb#A?%ui6HE#M1bqg2xFT|5xl6kzw^(i zF1jMz@?1{@P`99z2*FCC5Lzh_k_BCWgc(>(l?{2mqvxScyh%d*FXo1v&M{T72#Vh) za}=T4jL66kw!vIe1VORcpY7QMvyoARgXO&X)P;%1sy6Fj)}#vNwDv%-zV$dDFie>t ztgMwwbcr_Dd2^8MB|0d!VHwT9NNXu$vB*}B5{wrYrL@d1nm8U!-Sfv-&l)kIm3X2R zZ&n}h)^9dnjf9R|k>f35EJzmNyh_c(j;qGr)wAq&oj~gtHVAPuRJv?Q_Q6~ix`FA# z>50N0C4tb}HDj+|yRAH<3=ntqMBywBc{{?GfHXo-99g>Rb&G@opj3jiU(v zwl<2YMzCuwPR9opMEm2J0lS2zjAQ4IQAQUaV`q}FEV&orz=v>9>mb{xh+uU@XJ3>* zw%-iE{#%5NJ-F*}!j8ki2AwH-OTt`X1>)iu_8EoK!}fqt1Lrl*xT%sU+oyo_faNQh+zJY7=JLgzPCU3K%YwCsH{S8yFQ2` zcPcR=je#Om_gXYz3o#v`4)jWtv>F4s+ft2TDl-q(VI<}Hqr7^0w~Q0R)WQB!M9R0& zs3R0m^YTf*5UurwAgwk+Dz#}y6+sX2r5YiXZDWLFG0=|8LP7{xNaez6&8mZD7sEcN zK9>$-#-$$!a#!^rCESLMii;yCLt(5VuObau4iBco=rI^~P#vb=nug*UCa6Mi6os+Y z5qiBuNR2v%@#Hhi*9<=OIG)q&(?N~oTs9v?Btk{j;(GQx%ZVosk#S2gLZVd5O0QN@ z>f5oMX8B;&jR09yY7oPz%fiKOfExpo87)ksY$7{8%4RGMtCtOU*Hae%qF21!nHz{f z>!XNZ>cmYTBkay@4Z}#pXMMuT@Xke4WCV4EcuZjtxz%)YfKg@H{kMmhDu`W;-AXo` zT>{0u8QEO)*$OLZ-Sq>KRuxB;k5~0M~nfTo0jFaSdh;y z^N7@-#XXy_L#Jxex@pJG96+)f16Teja2q?;E!>1Q=o_HNNdSk8aL`waI&naWApZ-M zr>9Ol8nxU_SI&|VLCiRUay?l*J0HOda|79R8zY#F&rum+l)ehX-izWpDSax*@>Wnt z38BDsJQm}GFNkH>dWGCF{|MrG88$_f37HXuD~#)M9h>|0Fp@B)LPLUXtPwgp_(VUA z3E1>uOw~p~h`oSbXB%O(Y^e}}AVkj=sdUvTjAxzHy&;D6s>Woy(C=Y9HCPC&kIvFV zTyR4Ln*|}N(=`T*<59IZVM!r?ncA=Z zvMr}O?Ci+O(0PF9S?%By6NdCw;n+Z9ak$=)-KJRFO_ATlYTFZW?KtV+@(dbK;; zA58uLBKNdsH|T*N8)Qbu^2U$h!nZpY%b?3rFfSA7o<0=B3}T>(w_-?$-9l_REe~4c+&~JL(G)!fv1EXX*Nr5CS`IOAC)%`cdA0}7r2>+Y z;MQA+5!*O@;*Bhk(AcPgIloIDn89KWIR-Sy9k9YZ{md8uyko}gK5Zh|)(~UtT@VpW z%H9a1{K48GWhjbDreP?_BuH*@TlJ=o5T}%{CT&Qh05QSdXBZKO8DI5+OevpgOx4>mG27^$N{6{~%y8BVwo$`U z+}`O0gjEq5$s#eWk6jRZ+g1#Bn>LBZi-9g54;_EyQguA5O9d8k83I2#s#9@yex_fxl%5PWc;2QGJ?See)!)fTBk(~K6!ma_|6BGn|P z`&$C>qyjE!DX4v|Eh_r1EtteZ@(2pHyTSrHSh!|3o9(a?LHrhDxh)>1 z%Lt&UA3>N_BY^BK>)nFO55@{-bS&ht?_qXu1acEAh*=E7;ri>$dI-8yIl4EUa6Pbq z7q)W&4SU9xA^~Cxx-lrx?wKvX9uL`6sbf&~{B%e`mhrGfNbSN9QQ;V`0T)t45aYr_ z|1iE96CUzMxk1*WJlLg_{s_}q4RQSurqwz$EGdG>Nwg%72*MS(p~iq*w1!!0Cn!uA zK?B?`3aJ)x@P||pLq3W3ui*I!qCr)Q1%wgNimW!bIVzdzfYn#+|~4DWF+HS{EJ&aI7RYMR1!R%fOIo z45licDezzyUsn_*s6tS#4tt#cA-K-%DjWSVqwy9-U|ssKqXNrg%}B26{fQaVhX9MsuW`|)J0+ZfGb%^ zHGzbT*sNh-6k~+F{R8VZ58z&2jCu?X?>ddsFx~yRuC8F@>8Sub2xwM`LHG1*#GBV_ zs@cR{x;wV=HeWU3c3eWB$s5Fnv;9_Y3oQB0-VV%@nw=q|cqJ(zHd_n|@nlI0eoBTNAksN5Tb*gJRKI5f}~66?lFWL-BP8F_7uFDHSoI z*(?Ihgb8fuSR9++VsU2NT$qMUVQE5(d)yqyi?uw*i-~f@sVx;`C82ixXx zl$hgaj3e)~XTfgUHV#sZRLA6EB}eN4v8m0qaFJn^AalYS$XdrhF%+dWn(=bA816{h z;smG9{oBSSWLZ>vQBg67CrlPmZFCq;jF>fQ2<9ciSZ;B69j>C_-wd%wNQ$I*RK;K| zT;N2p>UzFjAU=?SqSDn!*?HxRou-K?{&JlRPfi0s3!=kOj=37IuxvbVfz8ApM zT@h_iDQ0`SJtPpNyI5Q<8h}-4A_0nxt11e0-iqEWRz`KLg5&0hwN5gH_i(bV?AbVM zn&W{@(#sFvwQ>O+s~=0DwAHkDYkEMT8&+I$T6+R>#L+#s_K7!0p;) zh);=*eEb+@U@_GbZFQ;(N-ZyQsdv!#t z>!-^+(DBYZbe$i;vABnr!1@!j`#SA7-L@@4Ld|2pLS-8I>p=nB8oh60F4wgb?*s2# zZ_R!Ik|tLb6?t3MJKz!oL2l9nK}u{8>@m9K*)FTof=!$7*82c}YU;SF2LOk92rzqY znuQ3)Rv|bV!&s7={)^{UjakQ0T9slkUM~_9-tPhnmoHw>*9Ug)!<#C?RpOG)2m7=A z#{FG=SzPNheqEU5+qSgBs5Ux|a2TvfaX8^1rqKUDa|kA=Lg?S3x!ACR6roKH%QUKF z6;>6k!bI#*ImJ^O({Ze^8ONw>jL~+ycnlA^xVm%L#!&03K_+4*F$!`!1~qUYh0X~0 zqMn`&cf&AYX*m1W3pRuB;+`B|w@JvI5W2Uu=vKMjSKq1lrFaeE9o>DPT)b)7=B}>0 z`VG1>eBJpr>~?}Nj6nUz1rIU7#n=$Vs*Dc(VEFlOoq1`e2IcV4M~8R(t%9S^eSdi0 zBMP3&f9vdbpBg#5XXLrR8a{b)_}j0I93HBUG3s+q{NQY-2iO^pTZS(H%wjw5n_)Wl*?pkjJ;7tf`2E{ssy~YQSTPJ99UWeyh zwoW;9A&)*#=8)e2QhN0rz%V!Ok{oFJ0QG=Ah@BqCF*p2+22cmFjdy~#UO-v+UL*5{ ze1V4n&%3-^T;N?h-Ufsoz^@;FterPwY}}tB4f)4mG$_E;m18Nep^lV2i0?suUaA|^ z@TapTj9KSx#IGxW0{$j#0ygV?9a!(OO&&`jElVQL>k#8j-i#b$?Nqnv?qBau)HU9J zU`I;$?}t^}GJ4JyG|Wy~A4)lj%<0xbExozxF@xO>InEVle6d zasN;I;y9)nizD@gxc|IoEN19rw%mukZ+LUP>&Jx+ zPYR=VuvfS1PgdTQNO*OP-bBx5~SMBRT~ zxuZK#^TqXvn$Mv%{%+qdb|vbrS@z)96LlXyklUQNgmOm7&8n~1>t4-$NVolK6YfjQ zU=Ooz@5B%1lyDz{teZ^Ez5l956Q6e!D@Ab!;wk9^-WS`CtvIslUvnGp72UMgb{*L@ z<3CJ(pmEuPyHD==^Sfqk9^Um*?iXE&%T_+HbcMI!^Y_2M`j+K4qh;pc?<#LB{u{tP z9O5^9?aup*KE&6%kXQfw1HF5G_W0j_Cvm0WW~;>?M*Fi}&A%SLSO4W@2M!!M&|gf{ zr#AklyA_&b@}qFg0<^{o{O-i>HqV%2cfqHDZ)-kKnE6GGd8zafBc5KOAM2>oG<%2Ja45522V?A1ZV{{8d)!+%#! zXL^Z0|C;w%Fg@_ko9sf@ zcuVn@m|6{Ag9)eutuP+8&0B=Oo1sLy;o>!GUg8qtaNukI5%pxd4}2|AgI_R!(;Hj} zxH^{S1u_4cb7}uI$2MZx2`duQEx$O9vFy43vMn)vfu@;$s3e=RJD~8kI7QjW>0{&F zqkDgKSMSfc}W-=BDE-Obw)jV|yU=iIq9>IiyJ_D6Vp$N^OF9p)vErt*$s)B zxlljX;decL^YFU?zZ>yGDK+!)L+*87MP7900KN)s<`gM$OzS<6sM&OPVshiMKUjbB zHkMVt?)k?OH4h*a`^c+fA9;1`BQLccbz2W8wei4##N@UW9go-Vy=K{^f4*6%$B8qI7vJJGbx8MV0=uCa4SH$ z0V#paMA&wu>4Q-aVQvEk7gFJZ=NSHWZN=7R3l3oP-zFG`_tvJ9{>QHWulw+d|9S77{fQu4zjxb#M14ErY3O>BXbjWP zgej3>-_z_3O~o%Z&oRl)%xUweAvuc2PRxXNDeP|Sn1B~F$-+$@KM17`x(z18(Q=n5EybhAict`Kz z3G;6(9H(cz%io2^!twMB$J3KG4wI)i%siz}0{$647IyhFFNPiLcz3YNJDxwoEtL5R z^Ktnz-tq5vbLA0sIMOrBwDEYCr;CsCOL~^==pFyWJAO&;_@hr6*Z%ZL>tI(F{W$-w zKBSG;hhg_edKX9E!SVVK@5*rTasFL>9RH+cyyJ&_@^5T?9PILT^>Jmp^p1a5AIG~Z z&+#9JNgIcmR~%+p4yI3DT>kVK?_h?RKF%-W9Lz9zaQrhr*JiH02)q0ozj2u1ILz|m zaGW3JABRa7=bvf$=lEf~t0Vbw{JD7Y!#}2R{E{XPGmkjTa2#g&4(>q6_?Z{VBg=B} zSy-g=@#or)W%19!j-NO@HlF;%`Dfm7dWK!ROY6#av@YJ&&B3H6E}mZ;X1vS8wHMRI z=^1vgE8oE`FIOJ(il=w{IC`cZ8$TAd(oEl3%NmCKF+bAt&#U{_+y~gsI=*SvecZq~ zx+`(XV%P+>DHqxdpIrvbL$ES7z;~9_Z3yEZ89Pg4#zI*teXu9E%{NXiutvDuMoVf5 z>>F9wRXE!0uz6y*F!#$Bs^o0Uwh!aJuoM3;7(akW4OHGlWE7XnZEG% zJ@?&5tMiuS|Lv}ua@3fm!#_I-RrPKRupq|Knv%?TIUCFXq6*a`9rD zt(&5D%CsYvc5BFg;|8qGu0wCk)w*f=Zxc1QWBs%czdP{zDt=fk)%+2De~cg2r!~v) zTaMpK{O-Z;KKxeUcRzkv{IJ@q!R%23TeSu)S_4g9gYD3ojrjcs{IIcE16#BPTd6gD z_`!0n!CI+iGk#m}+lt>d{3d~yM*RM7FH!S9v_G)b`wDE>*|3ziG4%ZZKKH$EKKYpi zPkp8GkN@SrHjjF>ZHYu0+l7fb1Tq~lVZOKGa(*$Dke@D;HR}A_Wd4;R%K>;Mb zOwgJ#P^lY$Nw&giO*5Z#t0nm<2^;HE6O#Tt$z-xM?J<#>L6e{GwW=>$5RYO75E zn@*Ff!oEyreOq0^&k|FYLa9&AOI@1D9~t+HSa1gh@(1HTpliKELj$sJV67S&SV#jt z>9!iQ(!quXHi>1~kec9{=br(KNwA<_60lk)t#;V&7aG;1g+`>D(1!Y_ zQH>f@10kQjdcC{HypX zZU%d~$uG@NBmQ(kDv5r32FTVXKmSu9e}+o<`JWNC=$|9AG+3C}GBK5I1>5NPMA<$} zFX@-Awr@joqUH*(`3jGJbrYEf*k}cZnZhxIn(827O--!h8Y1%_*Hh&3ALGkv6cV*5 zFp6f$l)j==b(AfNToYTOkPv5ugyQOf$`tBN%IlTBQB;ja)hMcrs4_;C5sEFIDNHrg zRH3E`HO)`}(B2JcHIrXB%;wLO79>}vz63Gg2*L2kO*at$zxHWBB_OSk1HXW{kCT2b zQ>a6)JZZmd5*YhacOX@!Fe43mr5Dfned3^)K#kGZR09x7cE*!rFn`2w@}_6jnB?xG z=s}VS-HmOv$g&CTlm-L=2LnI=4e=>xNal~EkRN$hzJ*8Gy&R|*v00)K3i7amA2qtG zSbk|S)d=|Rq@Xw>Xa)> zQkE39H`J-GV<;s3!f^rjh~ax!n@r&zq3##zenS~RrN~yRoq$?lVEctN_=1iuRoMPa zsws*7V-o})ifdtMV`?Jd0MDFDYm`}OOGTWI_olrYGo6$h=tst8N?8-OM&$Z?si|lIh&S`e6gtsL-4ym2P_jXe z&~;FqoH8&${9NtaX-(Uy?DId*7+lI(BXwc|>P$gmp-DTNF>Qnbi{aFLW9svonJ|1b zn?Mz@XpKW+P(@BM2t>F*U1ioZOhSYBSv8v^72(bXG$!a#X#kg`8Zw1vEzeH25AwqZ zY@rm?NkwrSQ5X5$mdI8GjLO01;xl(Jv8=D35Cq{mQ zG59biIWz;1n0+3esIJD04FoE<1~Yr21>J{%*wS)o>Jn)zmt{~NrY!u1&BOW@egg&H z@Y&Sm7$dM9U_Ee-Mk92l8#sW`9TrFi-61;w1waAJNnM6iX$U9&3f=5lXi;S%GbHG{ zs6DOO3!IRlNHDz6cYz)an1hFg#*m{HL{WjNg8IYk%g<%02292*6a^M$G_Z2agJP}( zGbW}caGs}nPN!-WOmpTdyklQZaD{h-dDk!SE6lsXyyqAA73Mu*&iDm>g*ik0Q*3BX zQF8r4#V?$vzta@f`{s>`sF`Y~P=IM;^DTK#PG|yiNYKb;RS#CsB!JVLK-2kerS4|k zAhT@K!lV3VDN4ZvyFp zDi^?*0Mj)8Iw?Rb!u6g61znhIQqQPM30{&)#Yn&lkUr)RH7*%|T?!^9r_`4rJRw!f zh)ggAvT!v)+UCJD^cTigAhb~X>Gb3j7=sZ4^O@u4NCqrRu!SMM$__YawmFixRxY+R zgV#lVu?=#7hJrbGS!$wRoCgeSL+gQJ8@a8Y>KFbYN&K|t1Y$4|U*UxwqOS0g6!c;n zOu{G%N+o%TmjOzdg-KxV`o&wA-Q-j)N|Iz1+kgmq83D}2#an@CWMH9VCXkD6H5Y~g z#!7J}h7a@dgSKNfR-Y>ECz~;(x+4$2ij9=? zg;;uds?pahBn}m7A*pugei>JgLowHAbe5Y?o=oJync%YoF*{%rpiX#h<*$hyv^6=T!t5Y&DNm<&ID zVHnM~gue^CaS@ghg~ITFz{&iyad?oUyjT~sWO0cMoL|B;!F=h@PE(g&g$7jLvM{cU zsML~JWI-a9+gF0LT$pyh$geQ%!mRR({0g&5nALufUtv~Dg&vYVEp9b$qj_EC^_e$d z-de|M$A3&Mrv{}C8%J+aDTaSiujoR4!(SK(k%foDCXNMIKp+in4&&Sn%LA5j3g$em z#>-Q_1vIj4y#Tad>|jelvk?z_b!uud!b&1_Bn1amA3-oH z4E8$iI$%m*BU*2OB9ofTWcmU`1ltqCnvDq-XQZZsTqy)IDL>{Dn3l?9rYH$gvr-a_ zBZ&HZs#O?FOq#frFmlWm0K6jgB`ZUd1ct4BIe$fXvc4-d8(Gun2>yz&Lu_DiAal(gjAxiM z4X|stv_xyrnz1hkG}*HLeikfda9_>L79^kCHo>i68XBP6#We={L5x49n9dbPy&BtE zz8<5i_zu2|ZB0#NY}hFn)AbgMdb6m~Q*59au%0;^q-tr&8u_Ih?AT<2+NI!jC;g2S zRW@M(TYXrKRoDuo$XC=8qkfTJwcMyM=lvqT!kic8eZR=BFz>T1OAT_ai#XE;6G} zl$Hh+=CPox8Q8uBKLMnYmI4Z3>MrykT-00ZI4tuxUg{b`BLwiW)a(XdW|@;q3~LNj z4sd)-mej(TBBTI47}Ntq)i8$)HjXjMwXIlM#VLk!t-3;XMrrLGsW})1rct?oMN0#81GyQ0V$wb?sp8@XDRHV-d1JSCyg8_JC{sE_f^p{{ z#iBK_)x!<7L+PKN0U z>b=fVQ`@|4L+o@m^<@-Ftx6$lXqb)$G&$tj0{bW1ICVi$YN)}|STnsr0}`u4j>Z{H zX3W7$HfgXE*2w363u-~(WUdX9u(ZY!M$2)u6Hw@srl!`0XhRj}WtjgFgD=(&*#3G6 zim#JKd0MkaNybv?T~)C3GgXDQl%GGWPAmP~V*XxB-u-@YftaCgCVQIhvPSX?zb(yn zME&r|l(HZWc4Ei@7qpquV#aCOCyt_rcH@ErdpgC%*o&Nq#fgQI*b%2u+KB^#rl#qw z*c4+`V6noeV7C+wV)QdV9@AmIJ!4;q%o$-u{Sv>z$l58L_w^M<)=uetUteKl?Ud(G z49YEJQXEzr$(72W~p%sWv6KECZ@61FC$Br24o{`*hmo7pFjH z79<$|sTtxZo}Q&^sC$^+@qsNf4x8frSarrr!cjCdL2JsZrPtb=LQBOy*o2?rQW`&E zY8=N=!GbT|--t7E6xHMx@5z*guS(5GB3I+avTq_^3Wg51d5p%11@A93rMX;YB{@*b zx7wG3uzag93;i;`!YmYKkzeLlm_@=Y@yq-QvqYHXewklkw24%1_w^M2x8D?Iv1wCQk_Sbfy>DGp}E3QrE(afPa{P>WNks} zW@1CG2#7Rt7>!jVv~b888Fe3Rilx(Bt)a2m-WbgA(v(zde%r`WPoR^DlVsrCYs}-WXHkO;3Qh2afZ~5Q@Bs1>54?K9wi%?g0=C%$rn`O z5Z6|a!Ix53g2Lg<$KW`976i>h zn?TdW{?I|L*>XW`Bb$g8KsO>Tnwv{rms)UwKDzpN_*)PEr*wIJN^9pK0cKBG(D1eQ8_~eAh*7T=Mwc*koUxnvb~y8f0RBqwdgxmll zW5x0ZCt-n6v13gh@s{fo>4{jvDs+iA75ki~%Oh6N_3m&ul$R-~+CVhgoDY?!(+4C} z4j2qjX7x~R7$saN@Q29Dp&a<(oPZC@vBrak`IgNX{P6|_!_$xgRS2n~ke2b#jJ+6##k;=|F=7Ff0I7y70XM z$3fOf>L>=$O<|aJY^7{pbx2vQzq>8vI|GwC9ixIwabyKQcNr{yWQwgaFolsM_+1aZ zL)CPIyYn0mtc-m~;mD!@u(MMw+=Iqmn-O9%)ap*F)#Ag|o-}LmVG6Qe*};;+-=&z9 zDeIV(^3U-8F0w-iizPHt8^(fl8TNw;naXZ_83Ij!p6VC3CDYT>lW^0-FE`@8!X*jl zLR^Sq8>8Gya2vK6jb_o zp_vcBI!xJO!zdV!=vG^XLeyFLOgU4}J6l+wHZ(M0pVsnM(_#2w^BVV*>*}E6xDv0! zb&R??_4XmZ!moPU4#q2o^KYj5(cdaEaHIjqD8`#6@&+haXa)2r_aZ5Y2yjmkUo61U z!_X+|P;O{(X#$@cUKWouhQtOe@e~1MEQw0nZZIzls&UX!7JzLAb$x_&4?ZD9*cic{ z6ID8Lo1_ax2e}i|fWsJQR<^c%wKJGMqN{FM6c57~CajdbTIN~5!mnE9Sz(U*6@G;| zuKs)z=WBlDlwWy0?N?4BM7{voBz4lf6E~->)|^BwRQ(5P>urs~pi*&9vkk`#dXyuD zvkkxiYUW@I!b)Yj7&z{PQPRJZ`aDe`=mFIb>Hzv}hO*-RHz)!x3LzP{`gwI2+!bbA ziTiX&AP_2ueWYOzPaieSX}`j+n&z~cM%#v!ccJ$<4w`J3`IWbprEXwj@Dz;unGhQM znT1&8i^ojmJ$%KH)rWPe`dpftOf82GC63aigfP6C{L0%901n%!ZrC=}dx_wpFpf#N zHL?@Dp;>WlDZGA^uAi6)Vz}o>3e|Dcukfon>M~yC{j97FmaBas3NVH+g;B@FxZA_# z0!PF&i9O(OB?g9Q9R?7iIAO}F(0pLmMos!af^@0bupz=3kBWeA0d@6{g`? z9{Nfgf8ba66~`a2SBj6)9jrCM{P6nJ@1ZXOiNL5p;kdmg<;)?&#>Un&#xY$$tOKSW zj&J_7HLZ(*F2qja<}$m1V@_KigR@mAH%*iNpq&v9HW<{bsCoJCrq+TJE}x(fs9=J> zh6dBa<_gPLNDr9<%WzF5S+i{6T)zI$gr_`Gfol(lc4WScuml58jrWGaWd4U7U=5XU}4iE@#< z=CQOEBdQ+l0xmY;a{E1|Z^$NK^~huXAiwI7$J8T7tw#>@q*mCtus&eByOt*=2D6P# zVRKNTKiC}q)(<8krOOP}W;(TX#rZmk3v&wkY<-8zI! zF(Cuh@|Zu!uWG5&E{S3kK=W`IQ12mUh#KbzTLQ8_nUY&EWt>DO zAf*W7EK<}{|+(_D`Zp0RneIoJmPp&@J&4VmHFnz~eFNfb~Z1|-Wh5B8=pf|7XB zRzqttc}wa`9LO^`HBg*M&yS1+!o(Q%LewN|s~Z;(N7!A#lUrBlF~Y%7UtcwdjI6=; z*QV~Eq+{_;^+7}3Jdp7Gb+dJgq1dz40u_T)ZSFZe_vOl!jhL?8D8W}H`w<;hHqW>H(&jgS8 zfJd|n1cS4{m?wQ8oI`E)Rrzfyc~-C=QdoL(>I(KWW@(LT^dyHp55aX1j?sky9oS`D zexlw~-TXFj^;_6Sx=eX)!$duy0eP{Dazpd9Rh-TY&2EDlL#Jw3Asyu!!vdf!i!idd zl}Ikso3C0w%Ja)NXl^OYRCgBt&b*&dfs~FI@N-bKWQuySw3wL=LlM=1swg5bG~XZM z9sH$4fHTW%K9d*!foDY=j`;e;Uvbv}Pw)O3nWp{nSKz_LqsTSj7|)0CsWaHu@KEXB z*i)EEe-_Mbx)h^X)PYh_G@Tl&U=@P-%8-GEM7b;*LL@YXkS@9U#bK8XO7qKi^D%ND z@c=HK@oc?>MY(+_pqT~Cu__!;$P6Df=sDf{auGLL=nlxUPtO*_oHr623Tua8*_cSrP$FhAZOaKsCn!Q-5R9$Txz;j)j@)bvBKWChnHwj3Z)}czMs!y;rdN2E1v%; zMok6J2l*Ws(v(CjxztAg!n=>fe`zIm@TE}b`lT1K>T5-V)%wMc{Zay=^0DgpF?Qep z;{dUfXUhoUI|;X0@$?);2C4-QjJ+O}gH`~H3&9*tkbXXNNYtq+6doG#yQ(mFkP%$r z+k{hmm^t|J$$6mgY61$#8oqL%sr53*k>~h0kEfNA5Y=QW z6QI%Yh&CU5hbKh^wSx9$W8)ELG?+=8h3wgV+?G1Ut}C3FimRuZdbq&=Ni@C7w1ty$ z-^P@N3;yS6m4Zi%3w9$Aj4k5QF3y9fmjYXd4TKGm;GhY2j_t(Bo`ElFv0R)JoEdP3}~O2wlJACs%CuHv%_pW<9Ow93BH;j4i63;#^FxLs}@Lf(W)6>U=d z&}EOHFeN-N##RD3f;vP++v7N0x{9iT=g4k{E8O66>wKJ?S3glTgry;-A?nwb8qedQ zJ;DM}MrKHNGm6-R;+G5;r*aPs{pb&E#PddYy91w9FI>fn6{p!(bkj0+GT;w&v4N?9 z0@`0#P5M+5PAs~m3T;kbHPhO#FhlZ$c?AdQ;H9)xZXVJ}DT1oaNG`w&rGqOYsbEC8 zLnpJLcn~nQ+5=LjIPfxF-iliFEtXQA)spfltor$7?0%P#nIK&n!Tm8!Kg9($3vJ^d z!GjBQb5PNo75wbyQ&*AGPy8s4vOPRiwzY71yCL)D**dv=+#oz(r5lQ3b+jG>B#nd2 zaybm`2t&I?!=dDtxxn+w2jm_izOXc;J1p$8A$&9pQHuSct&lNWE(a5DS@K?fpZSzO zQZrWYundG#*PWBP?SXAwXcF#0&}T-KR#btIYEqeH3ERW=uh>3H1%ihGP&pb!95u|z z2&1u9dBgA@MR?<8&~bw<8Eh5Npp70CJ=kWbnPIxYnTA;uVQ|IhsxDtC{-& zY&ukVP#l$;WpgOX=8$1d2Yk~sQm*Msv3dm~05m~6yq=d8g_R=ium)n~qp>mgmXE`; zAdO{cR>|NyNRSzP*BbUsT*R2(WFk5PXFE+i5&}7w0ZqJAJ`pPeOm79h_#$i5#EGx? zB1|H@jH2#x&U^(}&g4)v=NySrfyy7|UD0O{k34nVTm=5mcFw|uZNYY@Ka}TD3G+rm z=yN+OAKDH=WP^)&1w3mlFbL+EWN3<-1zB-dzba91+CDZ(JazF$wB>_c%c1R)xQ%Ns z3UFJQL;2uV!q9dX$ZJm8uk*js$9|bF|C!F^Mq+v$?E)+oN*}xBCj`UV0|N|Uv@j~u z61;x~i9B3Q-~tv$e)wUQOw_R__->2ob<^wkiUQ<{#~SStL0x9(F~9gDxcDaRcpP^Z zF7f!B0$T#j$AxYXq{M;{S3PPJnxFphpRK-k+PwF6rjP&O1Am_R#l)Ly@jfW8_J5<} z;ihfvObdCu%#kPVRyueO5DDNU=y-WL&2(yOXVAqwgs4QK7MFHK;ngM-O9u@GI>gkL z8Jb9^M5jV$kWPk9f+R^gb#!ghDnL2<~G4qiWx6mSyFiA=(;J^$O^ z{uX@#WD}hfvzbIEO{YO1BO2&5)4}WNz1lC+`9GQVO@{DpVz2fCW)0MDYbW@HLwG^Q zlq6>D2@L@AuhRKxazbm+H?4$!N$1ymH0@Y&LJ~kBQ6Jp@C>$pGD4jRxyw2F;bka2w z{5cHVjlgWiolZ{B3s~MJ_ANT^(0P~6dvwl#sz^2p@6#D2*vwFYP9vORnxPL|>BTnU zX3?36QkJ7G?f9+2Z#9w2>9o^XMF+S{@eo5>>1?FaMW>I>0G+jP3g^Q7JBTaOc^&y9 zGE;n$6#qihX@X!pQxxNIYO*RX$PI% z#2=+|jLsoC&(b-}*uBXK^#o23I1Z;cgQ1gjP7%C@p*KNNygE4n{gNrYP0VRHg_j7v zL+4#OXdge%T#H{}2qpRX18_=cGhEoGbDqxoATG1=P#6f!ChjAG;L&!=+> zBgj}DOyi0&L#T*fzLm~GI*aHmp|hM$JDpW@R?}Har-NC6zfAcIIy|^tT{B^N6C=Cm zY-A+4D1Qj2;=w7dp_6qIB3%CG#G#3CU5j+!7WbV9f@Qzb!qEIMMO!em(u|u)hrCw6 zD=v001coz}0XltQqE$f%)*MM#iAtFyyAjGi$ymFlK-__#gvQ{l5*hMbIYj3$ooDHw z`7)I^89GVl1fA2wy+h|+I`1*PPJKf@-Xhs3Bj0D}1B8l?!WmS>(Mp-Y*>vV0c91n3 zY@pLj92;YB3PbZ5YN2xrom=TFq|;7k6&=(tGq{nVE;@Y#_cFAV&H%yP3_ZrsQHBoC zIY#gVL(d{q+|STSI1#3~HF&(H@9eS{&BMPLZk$P9VF4}tm2&<;AS1lt&z z<$9s8l;Au>6lT(y52yGmWHPI60(UKlYbWjo;I@%=A)Q<4ECT9J@!O2w!=TASyJ3yW zBw!qCQQ%2fY@vg~GsP*4JWtyFL6`cW1Qzyzevw0WlYBOvIUpZe9x_a^DbAmW4h`P$ zLAZm2EVPI=$`p^%VG9B4 zaT-YR$`vRAGzV5rbdVeiEQE^F5z0S?P=^Upsz)n+_mPZlv%VoJcQd{)7ua?x~HpAgG7Ex*rDna&P6%IE_`R9K}vNc>8J>k!1m73Xk3uUJLBA z%oJE=2^e6oSLFUw8>o0^B2mxC{h8dK!=h?w!8Iwoz%d0|sRcgLCh;>Y-;;=qPS4(R zSBD+{!ZF){IYuD=v4H%?DZIfBoHfDM+wMg9hEcvD;B^CD2jCZuYu^_#MI>ql4!GUn z)uVj8&}}Jxbqb^rdK2eYpqdRs*|vXR7%5#r59|4b_Y6A2a*DxAV)TNq!uu+1R1wW$ zpePR}lco94ypQA+?FMwQ7B6gpKH;jHn@9?gVT7=2j*B+frbp1pNuY6z~Z{=9h@A$O^S=qCfH36 zHt1(^(-#+Q3X2t3ia|_eR^b5bjn*{OB8ikq~V2B67 zOnZ}u^Ay8p+B2(~J*cM$%&hjk)ELC_sUEiat7w*^MVh^ok2mSe=H@=6*k6u!7XqDG z1;-kDxq0p8tuk-5y6O-Cn4+rVR=FGHcFFCNJ0N$hrQ2cNZu1^9?|>*e0PsyGliFO% zcR)p#w~-qj4ckF~=uYMt zE;w*>R{7U!As|8PykV%*Xb)KA1mFocV}K1EjViowLopg#FxV~W+r-%wOqlM5J8vGx z80>dtg!f|*uua;M$>;}0W<#vx2`Xubaf84HVDUq=BGeh{z}HrEBOACzYa_Na#h@0I zFpmJ%1p?+9FkiqN1Li1)#dJ%pN?G7*HnAH!)4W;c%{H$My#>vC1YahxcOH}^lvqY6 z^+iRnXf6u+CA81g-Rrp(IZ3x$1XC z{GP>71hM#0HrO$O(BmZN4sCD*k3dth^SC{%8_3Y8zYuLnQj67*LFdhr9O98>@=<2@ z<9#}cDYux{YF?XpGf|E$YVe3Gh|4BYcv6gy~1h7aG zpjN?RO*lMHhA6*$(mdH+ zs9^|^4wrut>F~7G2b0@)Uy!?*`lgj##iP|xwDVj%lSCk^DYKXb5X_(OV1HoV!uz{P zlK-Vh@XV5Db1zn!lMrd@wBlXr;kBtvSX&0&8F)+|6x(d2Phm6R$r>~aJoYA@uOZ5M z+dRKA+oj8ThdK&xOKl9FN6UG`=d{SMZItm z*Y*vv&LUnJ9xVt6YhUKUg-h9p-JPd}58F zn>A<_)C4zwtX_kBf~Udg9#gJIE!U&U?|{WvCl4Nit%&YGU*KiOK`1wg*2v%?^^j2? zQ$FfrY#|u#cr%{$W!bo-VShODj}YwVSS&Lr?w2dcD^gj2(X?fD(!AHj;u{9M4G+t! zfa0_yckndwv}lRIp!y!$6^1)+odgixSB_{w_DY|lY{X{C3Y*@;_8%tyTmPe7|> zD$gIX4jgJz)GUjV=MT*kZl2-h5h%V27uzjF!E3~7&JKuu+{J+c<<%V6;PjetLkBAq zUfdUoXUXs%8G=a-Aw%))rvXkc702F{aU?ZW zoMXV8dUQ6fNi1(k*P^4-T*>3p0$>6$Ex6_xa8_)KI4ic{y$Ym5E?B9w1x>soY|I_8 zCO!~i55%y$Lo6=Oh28O3h<%J$GKuvGJh(y27dzCxC#(XJn4(Ec@uXsoS`76S_S_6O zrbb*V)Nw;eu8PkZ@T_7?7K`%yp;e6Xi_)gJy@9SMZa36+0eJ)RN-BkzDLPa1jj$eX zupT0L(~5dCXsowGlDA_G5Xx>bCcC9jc1tnYErqgMie$G7gmPs!KB$m~A5dCEIOiEdh9esP-W>5v6v=S{`qNauQS;aM;oSu^{E$ z6L@fg<|y^4kSCdYX{%+nRe-uQQ(~8b{32BuP&TbtH-$w>ScBFL#l0kPZ^DzIg(F%n z#khPuO!|5Z8%j+{QbW$LiECAOOHhfPUwX^cpw?z4sTSF`qrE8&bTZnCo zVMC!PODN3HJB*VeHcWXIONYmXDK4N}*hb})Ww6{J-paCbaA}5Ymp#UmD2L!Tki7EA zu;`PqqECg`Q!#AVMCDi$mBS_~tBHc@zZvH6W-N!(A@+0(`&Nj3i`Wp-C=8)@s^Z=y zq^eSqP&-KwuJH(<>|p!b0O^LZ1PQz0irH&1QY5(Eqcq1AGhhHbyn>DY6omh1#9mlh z9%WpHp2vN2#lbglM*!|HaCZRiMy}XWx0L5q1jPpoKPKRS0S5#eG5{V6faXHs@D(Su zh-I3^9S!23SxI^<0HIVp?8+;fA!~#amZ!9G`F#S|tXGa;oP3l8fNcUh1nf4zc>l=K zNa`xJ0xGp2!`8k5rXZ}GJU!er@=OdWp|Yw-Sq0cRu2U;>*p1A_&!2+Fn@fV^0SHD_ zMO|H)WpVUya=>zNc0e3F0k;}(D{D~+%#2D$SXu{53wYQVVmC%SypHtXp`F>72iNh? zu3Xnz96cOT7!PW2oK}d3?Iggdg{a$u(!zPT5}SuB$3h;CMLe8FdhmdrB@guAIv&vP zG(Rih0L62>QJum8TG0Si4tXggF3`l?8${yhg!ynK7vvXCeH9Hlk)AQqGXcr@klFK5 zk%OMY4nhIBu6!3MQQ}8pKpp^B1;ggw6U|_&Xyp00JI1nb-HTXwZ5BxnfQuxE$e9*N z4}goD2_4A)4}#H~Kd4b5pN%%SB;<8TtOm}iEAQ=TgYt?S zq~{OjU4c+{_R!tQRuyLzEp%luzqI3vOXCPRDc zgY%!Jrb&1)oz@U|UK*AZZc2-LP^N1=UM}-=3(UiyEB z>`13^9Si@xEe+f5Rk=Tv`;6S5$^CiFEU&e07M6s^5Ng6NSqo?lQTdMnrV&EEBB_&G zFHEDt8M#yCPLunF+}Gja)KKAjc^}v_<_Rn*+=;A&r)4wVF zO?0stPt0kB#dXQJW^J(VPCPcsna@&%#XI)AiN6IdHoFy8?eStiQr*>& z-7H-0+orun!q}@#2P;nO`669q9yn(obIX;mN~y56xX>fafZRU0yX78$i>*k7SuajV zbX9k35i%dusPaC;*zbdjjXu(RsPJsLbBMt<9^D4H&BC+3xL6~1l`wl1-YQr846-Nu z!2^m_x!AyBS?bB+lZt&qvEpIyBZjd>L{~L0KBe#uxvg?%$z|!>wL$)cnR4gTE&fXQ zf1!)RD7pu0;dU~J9Tt*{5j>PZ%-a)YVVmQ8x^@;H#{dTV7<5%saf;~A)5Slmgqy2J z{{=f2E`%)##4HM9y3;{SqeIyM#xontc@9NDSzreNg%>;2v{=$J)*4B?;pqxuj>$bP z_gT4Ci+@HKt8uw`;nmf}H~ zj}!y*ix3Pgc{3q}G^JGJL7{N-iUg~b1MC;%J-AvZSRstbi-W=KPUZ}I$gqb*g6&^Y zS~p@k2QP!~DyKJDUX#jG?{lj-fs4!hT!E{}UVHM=`}(te%X)k6*t#y)H_+MJ)4s94 zcgv;(=u)`o>v@+YJb(0&7e@{q8?GE5`R3DSUisVMm;chkp%P=SPIxodcU<@2-0O35 zubDgdruo;*yME5PYqA|*y6&2r*4;QSw>~$2{*BjncwPfCyy4n;*W%}ScP6~gT)XU! z_OJG5yK`H5`@cT>-dz7Cl>U{6=3P4nd^Jr8qZW2<>g&pGTL#KzrfCaf+U9{vvEj{1 zc%MCc>Y0(pUK@Vo*xAQkIdk&4S!cgr7Ro_Ov8?5X_l-WM*wzWSHL zJ0CS{OTxP(Xcb9A7{MMrm)|+O=W(mbtl>Q`06v%BGjiaY!!Lgy^;eJn@RhT#eAnb@ zmVqxhD^fy1~?oC z{@;9I<(AHYbsIwrxT8!!N=Bb95AQfQ{Ob44KJvFCyLX=Zi|0M>(u9{;xiQ<9yQ8CX zptt{yp6r8NIs8lTgx7TY#@xEE=Q?iRnC;n+!&t=Fg+Sbz@Vsi2T)UvBw>#Ul%@{FU4*&OB0=ly>{L&90g=c^8#2IwK zcV9mH;wzr_xr8@kq&mukYIw)s@QXzwHaQ+cW;u*}^QqxIe`UQfa_k4gd-n|=e|h-1 zy>0-o=%rcoM*qUjhdMiQ?HfDSeZ42Q3IB$YBhoyHjpIrqwe(dUnj{3Jhe;uY8V)PF0x&=5;=J)4(jdsO?;J%@%L-GA=M?~Oe9 zlXy#z#`A7Uc=JA8_utXoH?R#N@=&fH4eohgO?V4FUCM>M0|U8^C7nIF+j{#k8qnmC z_)JfDEg{c{F?JoJ><2P>UuVa_M(fq(S>)E=6N>SC49QQ&2QxwmHZnYKTEd&MBHPi~ z8xAd3Drc!+v}nlR^6B!g&Md0p%!GI4xff5JJ#@+{H_OU_1YJFA_~q{opDJNYL$iF! zV!qnBX=84i`nakkTNB=8RmGT0vKY^!{BhLn{F}2chhos2@FsCUgl#!5;eGMWg^MHI za%gb))YI`UnH6O^yyvNr@0Rhe2r#Txbm!LDwEF4Nnxax0SC7FzNO(7Wy4H>*j+&ZN z;>ZhsefH_UIQ#O`!#nO`fcPpd#MLxczNFBgg5c_-mc#MKwB{%o60bajqG~n z>}%hoMG#Q4mqooCHRZ_ta>BduQ?@Y+sS+}_lNB}c_|V9qXGdTAOU(YzY1R+{7g9FW zT!cK|o9)_+)?h}rK{51p-Dq+` zUi)BopVegKiKl3wjMJX13CUe^-kk7m_@u&Y1`P^{#8tC`3L4XnLFwbPBQ+xP37YZK zPu~&CRZTU{goPPAnAT$x+3=5_8m|0U)4C+yWc`UfE5=f{wmzpeN|$g$eHuKV7RSv->u7_IGt|=-g1nJcs+}kB*;v=Gn7_7i{>A zzWO}*31pwv*1w^Y+q3<>n>T6Nj5>+c4XkC^*ynz*d-R2ZD}mC0zUb@_o2D%U)5K!q z#_a}|h;6iB-9YC1raUd*7x#=l{a5E63wdR+_w+33rAfoCIeYLm>XsKCqYeM^_gy9uiIaPW_Z+Ck zGs(Gc|9JE@rK-|MW?w>Aah4CXlB^VwkL>*Gkv$=gwCpieX8TvJ%SO}qjR|k=CrmxY zU-h)93LpK}+2TuP>cbs*aY=%tx39r$@VdBdZ-lgr?2Lt;#(0jpzqZ!Fm<&XE7pq}0N(#ZZDF7MkC z-d8@Ih-#`HPeP?ePCkP!8Xt?8`qI*I*A9#MQ#ZjPAtf z>yzE;=0KWGY}VY?0a|ZZV|DgH0}Su^;kn12H@n31xSSn_XyoMIjC}Vmv6{Ll1@;55 zwuN16Rg9Mq*gS_}rPHpm4tK?Ky_GLu*jYNZri(H)Ic`*pA2w(_Rg97A65chD4HaA4 zS^teb{~G)F*byusMvv@1bMj@+`(ncT{c)3w{`iIA*UGl>aQ4*Wqp$5#YiL;}k;Dec z@J~v^PwvGE;{r17>a4(89LvS7-0!5M2|g|Z=MJ10e)YxSM;`$jwuB!3_F*jGj2X|n zA>qv#H{rOPyEPW=gK<;+?&45)mjgF5U=DJqzxbVz{L|bG_|C53Z@zNw;8AF*(Vram zJc?ehVz_wIbHx=i`!7!TrG$6gxo-~+@7-Y~S_^<5tPV}sXPMzReDe9>N1id`%56lv za$tDJ-;N&q7EE_rKYQNqC%mi7m<$xc#f!c+;az>f9C~qb<{T_BFkxe`U7VD)kD1{Y zC*(97*IxfCEwL)$t&HbkO~iehBQJ5gNfVaYpZ~Tdo}KVMAJ6!AR+&-}m~j`cE}O8* z+`2gF7htJYTd^0Xy(;0giS~DLC}pipyKu2%xG zGZp7)k1UII?T!nNufSZfu#6SH8u? z+LK32a9s6i5LENVRV@t}TelgtiLK}5Pkj1SYHwE;bSM^!!G_${fz81N;==yy7OWuM z_S!v*xpQb#v)ig^X1BSWacqq9Z+6@5o4W=!_vgOSliNJdpY596wtVx0SU&x6Zd-fr z*K<8zd2r74>u*^9rS)^?cHA&0dwtgP*fmyfJ-p;yklyo>w)dx|6bp(i;_1kIC2+UJ7FQCsWPl-ykaC1{L3*w&8aHVb>jP<3Zs z{wBAq@;jjbIawKbD28XH53BR0MwgP~wq8Ve;(NoV_Md(J$l1MEpi-JFE6V}W6mG)> zMc9^iAljlgX;QsidqnwEi;U#mHL97T)dZ9>+d6b|C-XJ7v3Pd>ZVc9Ql}FFMip|`y zv6lASUp#{;)P`o&;sQb~&K;jD&a|W(H)7zCBCKU6$`p!GVN5`rO+{mHWY^=^@x)j$ zd5M`eG&n=h4R;Q&5E)28uq(}qSSjO45c>}854kX!3+2Kp8}fqy2643jsPP@c7n2an z-(tt3Vb2;(aQG2O0yzwLlO7uW@%LeZ+J2GKE*u9&gWf^F?2C~{4h-)(Tum9366_eo zv|5nEUFlK@xq~=F=mxjN6B2YiE4N@D7PDELBd|%UI&3L>JZ-R7I1An~g zOI=-1)_7t`0F0RFB(#BI+x0*7h zCVAvoP@>e)xldEBZ9}T`3tQN1O;`E_JcnuBDMg&O;ZrZ+@WzH@6<+(nrlUk4OC;9R z;bv?w7X^BZ(qi>>nvJbATsb!UVjio!v)?`t$Hyrh|IC5g+D{&_*0wo2RDEdwU@J!3 z*(N_ux|nu2hPRW>IA%QAV2j0Rs)wQYSDv=7`~S1|9e_1n?c?vwGBOdXR;-o}kx6Kg zgqo!hREMub#HdKfD5W$p6D#)Kqg0D1ReN=5i&FY^5HmLeAy#W7x&LRJ_uli~dn5Tq zZ@=&NmsWD`+2=XuJo`LHMG>Z2f<0mNnOGxJEk?pBoH3mbwb}hZ|nc`eanh4W@-I%pxJKDKuM6AlQLa_0yfO!da zpMK9KJm1BhDuNR;tOmAiI#?j$^UAY$;I((hYnmLhAs1&cu)G0&~mMeWAW zgb~rAGzo%=f_ftbooTc5EMIHT29u4Goe(MjZOrq%`KOc%UfMe zS*b3RTC~7MrbU&L2z=JE)a69(NWXWNTArAt6)EahqKRs*S_Koc)H0gH#T&JI1KHa3Ligr=UrT&K1u>E{rz5VzRK9*hc0JLapMmz?7zD(Y#ho%mz%Ma=APJ-UC*_ zXf;c15OD;bF;m@QHybVr!u+WP5W-I{0MIVB0FFlnrV(P+Hnw?TBMeJZ*a+3)3Y){N z*fAqm#2K-E)Cq|bL6@aEYpf9+D~poMXz5pM&YC$5ZKDDZVag)l(?H;bO_;N39+*h<^JX%|5x7f| zzJY;MTc+_yDn%{7Lj79giUzG8L#)EUu)UBQYR~1dpqbywf*9xfG)8225&#uliD(L0M#UCFPL_ zyrgECjlt*_#3NMK-O7+a)t5C3R8lx)a~m+DeSsM?W7hAP1VWq;$H=atrda7h-U-~D zUOE?A$k6emAz7ATgBS=n`Z*thizv#@vK88joP&s0F3%@1ck!0&Ny)_$N>ZU{3qI;F?IG+lOc`!AX|?J#NHf}fQ60XmHALqQfhp*y|4@x8 z%t6+4in4ISWX&j~@NID2BwpeeNVh|H#|z}c1|8ygV7tRcWdC+q@!BX0XxE-SK+sXQn6+{uXf^wD z0lMJ>r(%fK?Cedr>rXI7yZQ#TYU<_Z6V%kpHz)|s!-qPh$x~OFM)H@N(9tDZ15&v4 z#W%`q2|Pc)KmeZj#kWN?gJNY1iY-$%!fJnDyLGMT=MSz4W{ZorS*(l?&?IP%Y&||7 z%kkkU(~gf0kl+>7Gh@pI_HEe$pxCM<{AwAfC{G>WU$O&zTj0qRzxduqu@L;rccT`V z=x|lSSpUMEsU0gaQ#@95Q&k08Ksd~1vjNE*k*j&8$}&?9nlM$*l(Ylr>xL4@H`3kc zs4>G5-V2M19SK*z-i!Ap2Bc$CuYbO(i5BA}U_Wo)lKq%s5~HJ?0^!sK_yCnPg&wrI})dwbPBv4|Ah&MMnn$p6c;fl zF(Mk>QxoIEV&jLQ7h3#ZJ8cs!kf&|pOl(Q3e32IT1tKjKzhqjf8J`i!nozMO-wek+ zwUiONm@tvHEo;=L6lINL^o3jJmRqY4vxQ96%*I>l8pg4cU`8UaicRoZgg`}Xl!ep! zzk^^}!Y)8koAiZF>HII8H}W6;Z^13drSclEuF-V7Y|6y=`2mk0ez7#78I*CqS`3$W zDsYBm;+V4?2%edUC_J0V1OczG;6;BHXS5lp__JCQsUTfSAXMu}s21&{AYc{O8B}3q z2Wu*eYnIEvr5n0LH(I9*HWR5j!flp6L85ZjZ<_&KHuY*X67ILtfmR*8S-~ML98BD+ zVSbDvp)GfYif#$~|9v;J8)1&~K`_KMYDuhR=SltmTb z}9kgC)n=fS0Jr{A8ttT zOPoBsxVu)y_W*h(PZaZn$Bi+LpqM)D_iZ9PzO$XS*Y=GqX zMaE&X0m_8b7*Iw&vp}*anh+|An>TOn#ou#3USfOvWo4((;LN5Z?G&1}wK5jd2KLNW zh`7AGbI5>ABV;V0-RVTDw7C`|A7#6dJAfYHJ+a%_%0MxP(4UHKq)IWu+5m|zDHe|@ z>{1iF07o>Mu%{GrOhxiG#hrq^1H6Ph9*VPG;u4TxkI+adi28g4QNv!%q2|%=?8BTvpJZRVO0e?Nr^xN6qkr)Js=QfLmUjctqhKr zVBqFrcxxQ4jQ79@G#D!;MkAzpzY;Y#fd}Y812m^y+@QK--GF456xYxguaIKZpuz$B zmMJ%NM2bl-xp{TRKZjl~G!Ncg0Ac7KX2a)4la;p9GK&eV)mkFUREv(N6a!Ky0f?1T z87){maOQ&_(#0^B2O635G}OpYYy~jYqtq)Tca**{HVTDh1oa4h?i@92$k2q${p+)q zgF`YzVCz#-U`Z)(3c`?i9)_GW4%zHEeR1xB?YVH*L&SS{8G0!xdZ}42uYwU1!l(6$ z1ZyT-fW#k+IS9VOc&aHzFt~uRY5`{qTB-E3%>5hrVC$#s)^D2$1z24H?q9P14cs(9 z2WzULD5dd^G8-H!SVADoS&UGvIK%CH)%Oo^3@k3-R#siB-QafSbl$>zJH{wU$j0$;;>p%aLDJ@S(Ooi@> zFiL+)0l|{QuI{@q)haXb5bWu#Gj_m zzNsX(SS`S?H_4uw7HrDi_<;w2pD%d3`1yc#lI%US#d#|iGeT3b>`x#L!{@~m!-HW4 zD~Z)3Dxd|Fl>46Tme$43hupb9c@x;uc#Vu$DAd@&0!rhe6JQNOR?C=yM=E2>`H|to z&ll$B2lK-?f99(~918oZ!6s&E&eXu0xiLj)12-6W+nQ|+nd>vJ+#zak1bB!tP|Z4( zm|-hh!7SJ8z(~2pE{N4KW(y*f!60)$Q<&5<1VR!MVp)#u3~0KfFqYb=z)hsDl8U7V zG}NI4eS}mKsj~D{QvI_ZHLwlv(~ctfhsvQKV5fl=gmrSlejhBpe#)lz1>I>w>PPNoy=SF#(@w zqu?p6&)%B@*FtReV)A>(jx0VC`O)HY!;y;uP@qjjM17!WA11>Xu_+t^M4vPdPx1tCQ9S{Ceb5yE z*+zM=s%ruwE;-#qM9Jfo7QvPV;a8&}8ZKyr2eRV9`q1d`)6h&3H~VbxQBjm|z;Gow z@JM^Sb41LbXp93b<2j6fDk06D&}665Bh6x)>>Kf(VC!Fp7E8JdRhmIsAY@up>2?f5 z5w6thSADG7%n-52=ntL%fq01=8M6_3TjE`V9clW#3mK-cc>$f~kR3e`Ln3i7kK`5E z3zv$J02FW?&Nf^=7V2PW48rw?{Bs(~9Ye#W_CVSP^Q~ojxy$C{EKZZFDJZJGpgD_D zZyc0f3POY)hwL1r>72{K5RjRan>TA1j*mJ7@1w+2Zwk`PPayEiZ5fr`o)%!IB7su5P2PbNPEe{kob>AFeVsT z?uu!s&D=W$EZP81dHpFL((pvcg@FUpr!7W)YyK=jo))I(PJa`@w{S)W5d zlC0GEfY0Ou#mY>*u>k9}z`I4lUNSDmYsPG8rOTh7fXhmq1p&Swbhx5`UqPQZt2Q6d zOvL|b7O0*IGX5lgLlC%W`{c26L>A-x6vZ3j4$Ejd>$4d-+ZP%!N+a;J1g$NnYL~#6 z7Jv~$S$|F7%KqpuzS8vchHU9(hu58qsG4*y+OcWTb7xq!lH|C~5z+6$RYr`Xk8BD4 zmB_r%SR!h|3%({#7%7F6khY~*Z$w2$$Byn47Znx5c#{XG;@f{=-sY}mbfT5gs8r1W zXs%L4Krt#(#Y$W5m)>y^G4UfK;=o2>V?RJ2xNzw!e#scisH^38sLcMbdn570Ez9yPlC-JeyV}zHil6oU+hNwq*WkNP(b2~sD!CS zbR7wg4 zV6DeMQ;*0Oi0LzTKn6b^GC%wya;5ZQrves5Q_JXOU?T~(nttyA7$({*sK54qszphKZ-nq??W0`jo{GHIV?*$F~F#PYQIe zF;$fYC&_iK7@$D8(5Iv)gybg7aT+|N8Ompi=`BcbnR`;_o?v+_@nRCx_ev z=M8HnrAAU>cJiK^nzsVLEcj)=ct&MhCo^g6Mt&taIKaBc3q?3H*benPpfMF z;!B$8mM!`nqEiOu%>Eo+y##F=M`;BXlg;YDhe1$I^a}uY;k3Eg3swW3!H3bjL;$V> z3o#k69fb&isiQ@d#D3HkP()b(0GUHkzhKsnF(9pA2PuY5&fz)mfC*JW#>rR)7S$|h zEm6uoBl|{1M;V`96OUBFHP2!E78@yS;7+QQLMGR%z|uy~M?HvS;UomCS~$rN%P5&t zCn{Alr3>ha0Qo@6JZanFG#M2e-&4Mf)<9`5#fp`f((`ySxL!o@J3se96ClvB#_nRPZJ;b@Y>YC7y!04zNj7; zpeS*+GwV6Ri)9JmgBT3(F3H3W4@t!(Ah%B+DAWaRX9gGI0$`_$4Wz8TT1!lmJJmrh zAp784jNwBL8@#{N>kg(|)@x{UZK?C^6frC&eqd}|tPmP#$g0pl(iAf>9Fd3~fMsbA z;9*qaBqwv{WeK4wp3#FmfPo!2ZD{PC6!hDNIy1W~o;~ z&C}IpF!&2=Y}><7GX_uR5C6oT;3rX$l10+8;ss3G z6Meq!NOv9sA-EJqW8f&`>@+N&fWPQ!e4syiJfUm14{#+<9UyFB5O6>bfwBeME`-Oj zc$L`6TAqx!qyr9u)20?*2G`uE^eMiWZS6QnSn=MXKU`Zx!f!S}1_BRO$nx~Q7pG`p zfY9V1;#PdbjrZNnOUZ4RHib>eZc9)ktC!5_lW>cqCnv1T1#BLmLWiAU^HHid%VGZp ziuhDA#5J(|OGe4;n)Z~DIjA^TGHYfGnP$stn>bbtwJ;y32ApOCMF(N^SR_q^u$ERO zyRe8sgTSWnr^$6?0-Mr*f+r>g5NksvvvGo@{_sz_6jnB%1$tBl!PX?cM;?#x&3=j) z+yS0PwuKm68o^M!G}#3HMp&>}rO_J74VW`o5Y)ItrKeOMVr*jAPA2CBSLuaxmBj*0 zWSg z1q>cAXFJjzQ0=VUma}bxqQEFRWbr)+h^q}BVE4cW;+OfQLgtWAkMlkgrHUjQYj);$pg{RO5nzUN~@`b{(5MI!~sc%zX zAu`aQ_+bu30sYsX+Ijg_ty%>&1!>w}>VCr}wR^;D>SqkUjgc4VAamGL1}3V>_~9#h z)&+FkpxYEWHBx=snD;hP9N$2HW@OBsx6ulSXdyQ%@H7_HmUNyds2QCnYrOVZBrC%; zqfp3biML+p{K*h7FDYH16C|lr?T2TZUvoheNZQqbP(K5h?ic zqa{D}Q&6O-+$PUuH!6>ru99WwY4d(+S>v8Db!?2^E`wiDYzY`}E&vLpiB)4|eBx~k z5hlW>=*b@y3E~$M9JBYcsAZ5&@i!Yh^Ipt&$^4PL%WUg$ zO0f0~0H~umiMin2x${&~5*qK?Uw1xQ7kWz)0c2dn7okD4c>ho(`%+kDzlA)98tGcCdrn0T3D zi_6>ARNUrV9h^2~1k`hfTwTetGvn%tt)!WwStVP})R(kr+L;!+FfxH@WTe2w7T3(t zSR4+$xqsB3rQh)LLoTir=(bBEZR|~`|maz26Da?&^tu!4HG!L4t; z=fic`ZwuWTNDVCR=Fi-RDF-MBAYF-rulz0(>x|KVLhY2>QQu;ES*HXW8?kh=fDl*U zR{^fxjr517K8-fG+6dU{n zkU_+QQpnGkwFQ&P-k+jgdN8R-1cZ3#ByEDxh~X(KhvF3}n4zmZk0tTXN!r z&b6F4;w-aS$-57n)L5t>&%ANA+lg*CRyo|Cm4SjFWqb-yJ5WN9+DBc@3d?xf>@H-M zbl;bCdVKd+U9pa^wO%U0&y}`T`-r&M#Q3Oa>(s)8-^44ggjLn|%T)3Z{6Xo+L!gA~ zP2_=F1`J*jc}SY1QzrbI^Z}Lt1J}-(oBavgOXird`w+KNTpqY4j62CPmxAoj60m+3 zU5&v{>uChUNHBZ>_j*FC6f+ENmZ&aV7%W`Je|F)Xh7yq7Wv^KXt}JV&6{R!uRnjdL zi%r5hcR)R)#AmbvsKbR&ho&>ohJZc+9ue0cn#}aWI1bK|Y({9SHp^uxLVISOR*X3W zTBOprwsajfBtByFYZ1}I2I1bPNKZ5+nh1N=Xr3S@j7ceK$Q@hCTp04zC;{TJ6!?V>}Q9a(i`f50=ZRCB%xc&132m^yh|q zEeF@BUTQFLH#%peh2UZbHo<_^eMsrjz<4|GfcZ0PE#&fYx(Y^YN0Yu}7hHnm;aR3z z*5Vtua=MIf;HC~NkRVp{S@n5Dtiicl9=UFDw+)BHSv&x>ahp1=1d{&_DAfan_Jv0T z#z1vAGy{%2PHaA8sldj4B!Z@km};gJ73oVU;*`RgSEtR6#s#jbNlI)3#= zY;*F3m6ufA1$5vv`XfvMb&`J1LA8C08G(^joI*Gv<%~3!L^MS?9;)Ecp>(q7vQH?i z&R^rR8Hhfc1Z8#HswkjIRA)=vyjoI7j^x+Ep9Mf^{?>AB=>s1c4ewCdR;x^p5Bdh7 zZqEn8O@Z>D#0bn9J_)Hl#$lGd9cagKNF$1n$~cs{6|uR*A;x22N{7v5kuD4TtaUU- zv=f}su66nY3l*h|PO)nSQY`HOHFh2su`xtjk-iY07VrbjE?#Ps?;15SLCd?>dm{$M zMjP*`1HBw;JGsl11F89vS{HO28~&XkvGF465z4Dm{-7|3QtwX#F$77^(C>> z5Z<*JCP1zXxGBl{ zr=415jHo_smVW9|_T=M8blqXW+LyFoQE`#@M9h#VRRX}(4>P9XqM4*A3#N9ck*UQj z;1o1WEiSX*vjDrML+}k$88G`JPeyRtNSvcIF0GxlicYDJ zz4Q>85w|aZV+@f2P_2TKk(1T4Y|F_o*tL@}AD0Sz)L`{_&#LFHWU2Ynymw7!QQRR1 zc+Z(jJh6fDkOSfCgvMwJlx4P<9z25pn ziybCW0!f?2T)P^;19RmRzAbGjeaTEO?*gvHe%IREfBu;F9+rS13h0!i@!q4NyAXLwF&%Shll;0yZrN$2n4UFj8^3kP?c^@rl07L|QR?ZGT5uVGziNzU#<)bblu$cFMUCt= z{JqfVL}2=f&6Gy2&ZxOg`5WM3Ut-rid2v81AsCV@~S znJ<932NqIbA2kJRRAS#qDeAryXq6ZC zFnD)TW*zr!(x-gP0isj~A=n5Uo%hxZZ_HDXh@dg%+w`<#EYN zsa>rSN=gf2%M*$>3Cz%``9Njv^XXGED=AH>G%gMxNk>KvN{plUq7spjFHCOTn7d^| z)@R9JWk>Tl#2FO|Av*R_u3)+~mTB7P7G(hS5_U%}NVsiUlmT+9I&8w?n7h;dNj`cN zF=&d2GH7(pvp!D-ym}^{Rz{tzE%#U}eTom z6f<1y45i_c^IAzjWF#XkJ-RWM2zsuih2}reoixZ|y32Xp-D6Z%(0fuqdN)(S)z%TvBMMSk8K`TDLS7yk4V+B}5M8 zmz+qtq3xDGr6 zepCyszz0C3i&{vt0<7ZD(+gaRGRl%c|C20Oj_^RFFJLQ_9E?Mf-=UTjsigNcmmL12 zfjQx$hQ44}s|IoGVPx`{*t{m7C}+r<9v*L>1e?IR?H3xvRqqZ@3mdlqSRGA|&;JJ^ zz_4QR>4U(T{HcTBkUuSTik~=2WL7KT0*FzWjbgMaPp-#DQ^aKy2xsvLqZw7CBvlrf zkl2R7Y=gM^yXPaYQ9}@FS@kTkB&!qK14&H}TA>o}()1o06*nSwL=?C|5#s|d%0aNB zIPgP(Bg_X848bs{r2=3thQJRX+31bWgsZ;5 zfb>MwTz`zGS0oZJk6!%Ek0uA(p4Ct^DWS&)F zVeUqOOC?OyEE+I=LouF znPDriFb1@P1uN;H3VFdy_HbSm$9pfTKM45aO2}w~1eq%?fSXvsNa&32boecXS z8I$*ZU!4*TCQpC^hAi8W3LilGnYm{RB%*YxPuUI5i(bZdSUhb%6fQ}{<25O>3_f9i zN=Dlb5tjEw&v0OYT8Ycnf{z3NXwwW8E7{W4?CTFY5gwGV8IoM74Y8gy*Yf=RNt)$` z`a|1t4sOp~J|%bmTr_DI?JfA4&HG*8wcKHmUW(EU_HRfD`?qhzyBdF5`8#V-n3uyN zrr)qAXVXM=yV_JoOJPM!k;d?96yfOfU0FNVW$)W7%&`=q)lv$kArO1E!`dd=!ukhd{x_a6)0J zf=XDbPH=a6WLQKDU!P{DAc(yYBMdAO5)=ne=;W#l~Fl=fV4U!l-u~T>;MMX%z6eG9H=FlCA%A_FfgTOX<%a- zHIIapH5S2xK;6S$_C~!Mj|#Wy((Q~&wPnWJ4$Ye)YoGxW{_)e8)<-A>$D_F*Tv!Sd z+JiaU0sf`Cm-Wi9_yltYJg9(kTI6Vyu#ggUhd8(Gl9~?(lpHCF{JSCnF%_$85{%_G*&q~ z)*9CvbaM|6uHhixc|0++mAEP>W_kBA=*dPzK^;v-)D zXNE*v`nM$q2woPZcnIj>B?zh+@GL?Q6bD6M#_5G$5`Se2&h#}o2M@xA^Y->G9sgzt zD2&G~yI+|2H~I96kuBJt{mBAr0SPF$40|Bbn6kH~>JLrfS9W13`E^d!jSZ!$?3CR( z(je3||_i)_UXC5xu659Sh0wX5KerNIvkQ zyhH#v#dz%4;Zzh(TLDg{Di%O|A*z4AgU%S@BTg|f6#QMkZLfamW))|mGLqACSFU0? zRZn9@wpLRTc^v)LIim3LsrotatTSP7PLdf|z~GYMT`DAR6m21Lz_i+u#eG$&s9Ad! zMTs_9Z`GVO!H%(@OXhmo%o8nS=A`JAMD$aF3NsauB(8V|uFC8I3H0LUzhUO3hV$WWk*W6Y(|F!6AO)Ppxn#RMpY*?N-4 zq;edBi9E+FvMBx%WtApAlJ!|pBqMoFyxc@KrD3R3B36P!&DyglTKxE=^ClHCYfmbKFlDw%yG_R0j=y&0 zw;(ByTo7Dzv1!*7Yu1Mh&Ja8p**0)Y0e*~+2y=++8q7pVOHWBCp0Nnn4rJkkzqW04 zJ811hS99N17&W&g2!ce#KHsRH^0_3w)667k8$-+Q-@q)pP-jRfV)omog3~>#rs2*x z+n@Dn%W?}UA_F8>neY#efeRQPF5@%EiCKH5WPh|zmH18P8eSy_w{J%2LLi`Xtxc~D z5qAUy-9GZq19B|(MMIqJS=?hEgI zLkT_#*2FxuDI_ucnXwXAr$tMe2SKbfIGi{|_MuZ0WcbxwG~Jqui2m>-RS$^3 zk^2^Hp+Aa6vbJV(yoE(?t>!M9le0K2cgKP36$b>xI zGYFFW84Srn`le70vLPPq>=4I6-jd=Fil7f@Lr^7LIO>YBE0larqPb$`{@Gq|$9h;q z3~*_22_fjQ=cT6?m-Q)d84DYS(X#3vgq^HU59hAkhy2;R6rkmB!5#Q|5bf|RZ<+_& z8XmNU6tpgBUb8l>B)5qUil%|#{^E3AK;B=bR0g>9R0v@*R0a<3P#Fj^B~_GIo0%;n zvmwEe$Dx`H(UnZhdBrq1q^#%VIkp5J4$c#_Yr|wPV&zgf#woDl8nLR|_y#r{B2-4m zZ5laRSRR$9Chm`@3M>*LkU4X?VHsqM(^T|TSEtnEW{n4pRb0>}4;WcjV+ja-0SZ^n zz}}1*ptHe!LU+X2PlAJzV4zP@q3|w({nMx!TwcK|f zupu;!76q1u04n;lB@ihb7cXf)ub%)06!i=A@kW@qFr%#m#|Crf*b*2F$hfQ8u7E$Y z{lo9h#8x2uIB@rW!H_t_C3=(bVAxis-#gI+SByZe!c-{>FntqXm$hIw%pr5n?Cj-x zzzHoUc>yene(w}mac<~Z(!{K-8(>+)9oG$;;J|`K8q`Q=e)fTUFR_1;4#2_l^7RIj zp0S^NxO>@Fr?k?i&C(y(oAt?BP^v(c;@ZnyzS}flXbs1llm~Ztv*E=BKnUE7fHxWf z_huyte+6hYXX(N0$-8q7O#&7WrvdQ{CLP2JxDYOR+Agl^1*n{>K{+_kz=*&NU!3BO zRnQh3C#Z>3Vbu!#p%i`kT$pQ4(iEtS*PEy!&-|QHbIMCeEk<%VrJ9~ zh=BV5Kam}O{}Ome4%-CC`DwO2ybP}>Z|RiRvX^fI(-pjnq+h-Y#r!E9`Y=NE zDGTM}WeL~i09R0x?afZ#lskVdtT?V^&hF^|6=>C~*GTjmAU^Q6o8lN z8UfPgPcUIP2biC=0{D<(@{tS0=B!rc%-zLjVwBEeYr=~s)-x@}%%q!{L~CO<%h!(C zYNk47E19M-Tgfzy*(?)Dy4j<8ab!cn1*GfXNw5qomaqWJi2!>!5z6pQeh6@pb2wd) zs1+%^oKg!Uu9)iLS1Fe}odL(etbH(IL84R=g(mF-%-q3a1>VUKd4`n?73B%a5YM4Zz zP{X}|w`WWi#b4%h7AzV;Io2`&C~hBE*31t%v4F;y4$zmgyqfuI^59^}+09x|F1T6o zr$E^2h^wvl`R}(qSf@l3+qSi_HS>i5wuFCye(LnN7;{?;z#O2C1PJ6v17Heh#W3Gf zW>5ccwzWNl8(XXb+7A))$(`})@|uxmmsH{MN)iJvrNRm3I4C?Y{v1w6l^C6w`}C_< z^Zwx7jig8TuMl&~1vDFj@Vb<)-Co4hQ!Za(FupJ+P7F0wOpk>A_b&qq2i7{A6*dT|{>=mmaW{Ea~sF6|Q#WheOH(Ma100Xi$i(b46;5x;# zcuM(V3v7UASMhm1>jfxF#f@IbgKEbL8n)b}8=g{t!=pT{06n;?7C=mB)`h%lt&BkI zS_!#Xt|~Ee;HgO-P6x0Rde&K5j%pV!Utw!%eC=I<)Up`Ckwa zo|51qfb38i6H_6+N=ym33ejVgVplTz0{(0wk(6GfkW@Ru`;({#`TRrNxv;Ncorzy% zjudww=%Cb6X*-`*iZpU-r{)}<0}TPwBr2l^9XMud8Wd@)8WH6JAyPlELvSqvh&gi? z%&+5-r$IC3hp&w4fn{RHLgYvn>}Sy&Sbtz8N%csxg}DJxgkDxn0f>kc!Uo2dR_Lgz ziUSXw;>^Xw0BL?y56&4N0Fm4ic+!&0j3qqP6Pkb;EZ7_*bkc=(o-waDTxemyAY83M zLg?U)^AMB6jbU636>H+OG;lAC+05dp4^6miv*ClsNQq&AHT6~JE{$IoLYt@0h&CLy zVn;11qh% zRbX}F4zyMPt21UOF4r<$9X1LUmbqg65w4b*9RBik5i3kg9~sU!v`K`WCF?Cm^-?3< z(RQKA%p<8$*C<`mp2=&>YD&gbs>>Rd7rHybU}`$DRjhyG#gO&N=6SN_)jW?i_y`b1 zA$m%hT+t?J_l>Gf^QyAaT2jn1b3|1^M*)FhRDGyP-ObIjVw(UWb*k+iWFU6qtcYqrA1M#rqm;QJkml#&~Q*b3F1oWL|;tB z^eHPr>kn?rl#bMjnLRn3_X8qpW8su^E(WJUxWQB7Ifqx_IW%#zcvLjOjm!%W(5S8o z9AdGhm<@5X(!|W9E!I!j46!B=Re*_W{w(N;S4I_|Xp36}{7_e@m|P(SlSpq-7rO^$ zfvVC{a)$yY!soXW5QjD;XmHRePJVn$@`iaYT7(Vn4(*f_guK{xBv%iyuYxFI>uun$WKKfXo7N6x>^TNmB)g^sI%Tr_&$W0+Cz!<|^QHjGw+?7VGas z3%>9TTJXi!*Qrw>YNhYe@7<~2F$MMg{2UUCD2z3r27#6|WRqb1j)EH+v|0&oP(f!+GsR`aV{9@vbQZJrpdH=tngzSr|LV1XhIB`)PbDKPCJMu zEc0+iE2pW44%Nh^0UDzp+_Mt&6ooHiXxU4m{G=uo`>#5@r6lyJ>KH{1Au>V*XgacX zOIRF#x(7_hoD@4G`_NaKBXL)-w^5Hw_L(f=vorV2$lSl1Sp;#^z(hQ4znYG9IlcJ0 z2z}1wlG>ILMR2;&*vzi2Y8QyC*wl^IX;asxbZvPg{6-tPHjDNFMO)0;ycU81Xh&ko zwFUu{SY?|qkD2GiG*R0cK}NDOb9wC)thcG3l8QGLX)V~VS_Q?65b{Mc2D+30{5)tw zScnm|C|z5ZSS9e)-nJ}rZ>l9&WYVl1Br#G<%E?3w>O){td&Ilq;aE{)GTqD>Y9nkSeyY?QfNnxfP)7> z&_tstkK;7cRvHz@r7Vd$K~0;q(bw+AXWUe;rqYx_m8Pa0t78-T8=##RBV#mtmE zJO<0w%!`q3tHffg;VQY9mCc4Hkd-tRCy?ODI>hO#L7U4~aqTH36(Q?&$Q6OZUoc3m zAzZ>HT5W-L*to$Mn=l_!d{cOQ_$^7kBCR4U5_Zk83GFdS&eo?b%GxciG^rI$W8+TY zHxOD0(^)S74pV9ih&T96V7Ubu4pL#HWH8gLwJAsycBHXzuQr9bvRJPLJFXfFKo+Y; zSWb0+1pZAHAhnH{mt^TyMDErw7C3R1C3s#IozhmZV9T}L(R_h8L4Y+YybI~zp2{J~ zU{s+*yI19zwB6D6VBN81E<|#+%*@%IoV_MlTZKeE4Z6d<#Lj@Q6Vy(5u`z!_H(?lj+9B?96A5l*zdReeeH=8JKjD0dU!`= z?3Rwo*_|DgVePvrZ}xgq8F#(Evg+&rrRI-O<=*c&&DpopcIW=y<=rDjoa%My=b%2L zS2lZne~(w*UQ+Y9s8RcG51-NW)x-)H-gzH(uQDG%ia*=nb3OQb5B`FNQ~4P_JHp=z z@V73&eI9)N8~ja$zlrcK68=TQzX|Z~F_ZzKqCogFB?A6Ugn!H7dsp~-0sfYUdSAic zHt>Blc;&csQlgbuWgrxW`2X@3{%D^QOY3YBHU1}5()Xy@Lz;7Qi+G;fl7iB zqrBz`VFCw1Vge*3gC}#vD5x|N5@Mhtml;}BQEJM`*m4{+k{}A`;5ASeZ23LtBN38M zLgbF;MnH@4@Lz;71U~hLe{t|%Ec|n=sVH9N*`uH)R!D%xW1;uIdx6TxywGT9Ee#TwW# z0xuFWPrd^(SR!;_0^l`xJ<=h*XWqhoBjAJU8!f_Nh>FA9#9IsJkAyK?PhR#`mmUM- zAZ_rBuDu6>w#(tUIr`D%--V{|gZt3P;X!W~y;f%E&!YjxoP^b{FFZODlNY5Lld%Og zxzBQAGS*R(J-159-=wL@XAc>Zt1rAgLrtD{nuhaDTFM0`Sa&YPaZoa2|i4pG$uBxZ}(1} zdb~Mo%+z^Hmdu}(Iyq@P{3NHQ&6zcQdg`R{qZ7uAn~di1#QP+$@yO@@ZXV_p1#)?l&|U`+HYDQVKwY16P4 z^apKIHWlQ;$&->`tn`B&Le=r($Bi3@bAlGIxn!t@sq_O`j6c0*LI%sdMJfOG}$Md0Zl>7l3Ai zk|H^E*37Bn6JldyV`8IYVj47rqPl5w&{I(3oW&{?QY%0`nimcMhYzX^(7%YzFcW@w zmXJsz<;jmjl@7KnlodE*C>ji^D@DQ8#=rRE0xDCbr&iVduPEEi-Z4Opu2NastT$`W zF~>_~Gih;W4OA9U#u(mUwYj1xOtle|19NAwFG;?v^mC9hY1 zYjlA3+W6P^O*;6RchU>}8oIkQ`ykHoiv5G`!&gSEPoLeO=73p`wj3|eefE#(frE;Y zDn1;L{@N!m%(ov?r~lONR=(cl*3|Da(nr?VTf^IZ_{5A%gKqmT$0FY!_P$SKrL;R& zMkVWCD&P2la(2h?x6hT$8w*2Gy1d+@!?w@?6P^F7;SQm#{sVCLW4K3Fd+9Q4ub+b7 zPwL#S+)q=L;G=&Fc=_Q-$KL1D?Sem;!E^ifWMf9fNaaS{t`xJ}y(nHR*A*a*%!f=!`ufWp*E{<}~%l#2~wgvr+?VIA1S% zXIfC)&~6_z9sk*?2lpGFR62b3Y16X#r_SZdWlU;E{H%Ehz| zDL=QGcj2S#C$2|Fq<#PHwQdJS_3Je6#RtDR{$bzt`Dy337JQxhU21bhx0W(AT^ci{T!Lc^CUa%Y9td7&GIisC}oaa55e8DjBTf0*e2eqkdsG761fk%TI z<@UaHy5-i1I||BYMLsG&=cgxb&Gr6m&QFI~{g0f8-(jTxJ|4-JOHipTkD zN6Uw8{6!a*Z0~W+zRa4gJM7okEvu2P+v3?y`CEe1)!vO3CnQBHbG#j|+6U#g^;)DG z9_kbvGDnvY>~i zPs&wS9A_mzZ0#{=#lwmzcXTIwf}MgLyLnw7X*bbnv(C3si;)pAo5Q;*_V&vD{%5v# z>eA}7|DA;aoBV%ZVb1cxd^YdJ^2dTbg8LqKEI2o@WqNww^v}b>QZ9!yjowwo`Bkqm z$q56mx%PH&Uvshkp_`|U4G!t++IGyK=kGP1+UJA1-Ov8*-Ir>FyS0y>*|tgJX>0f9 zPh7k7+Z_wysx7M@ea*A#l8iOp`X3@TPmApG#pwfIPrBx~{o-MVZhrHo9eXX*^^p?U zB`~wb%myd#-Lso;&gaE*Zy$<^zT%SoONS?W-u>ldT=k!wpU?U6o8{#KJKewZb?2}9 zdyiQX7XS73su#L%Zgu6nEorN3 z320D|`}<#Z7zkgUO71)HTIQWNT2AqDX@6#RR!+=@8kV8u*aMmk(TL0stHYcO)`ULy_^2yt-e*Zi0+X_6B zH6-N)Q}7~oDSqtO`z657zAwV>^-f#+wi)gjQti-pJsd+`_V_G(mq)j5FV6M6>fX6> zey0te9`EndF64{nU-TcB+R5k5CFc+J%Pd>|Xb*=Sl_r*Nyz5N%()Wg3ICy^hlQ9F1 zXBA#t`NzulwwQ(=!*M^K(aqwQ? z@QN|5y^c)iydrn*srzR$LJ~sGEnMR|B6t41OH~tJ9PsMlaYLLc-8nZWv|ojk##hH4 zdDyMo0X?!l9Pn$y zz8`#7^QC3eJ6~+D*!P`r-KY4KiQl_o>{7?*F1pySKCIa1;T62zs5rjK<$DLyLq2?^htJ}Nt4{R}ZrLkseEnaiY(KKq zBeDK;$5-|`4jxeZSW(sSKHt~5dEUR;~27gxV(!_ss-~8mUE;_G!YO|pCr%d{~ z#k%Hp^N)=3yw}xp`RSfb3)a8eq5t%l=PrFyz3Akx%SLBR_+#1T)>G<@tdbvGu}|Zs zqeeMKCrr+MV|TBYgYtL(k>2)fk4@J<`|e!Bo{pI_lJZ)l4eD9>NX-*b@%28hzx>!A zmxD%mI)CwKP%Wo@Z~gJ^S9xK}>v<=&T2cGJnfX8O`+jrFncE*H^@&~BX;U zR`ssGF1Pi?T3_|e+)?@FdmpTcJ$_hMl(%&FMBnUk<-Q&i^S2gmU*Es;LfO2;}`*=lR6RUwu)*ZFx|E zPejw6ua;>sW3^k2vQ_6atQ6Gsy;b+ZuUy@^Fl6!J4J&TXYaqjH_DKDK2&J*EMQZd+0nhBR3{!wttY@?}Nwc zf5{Ja8MNN`tuEd8C}!NdLq@m#y|(9xLtD0ODcXGNx3_C-ZlCy8_OSl?>z%XT zdFPX&E>}h$4JlK@w_UB9-KQ=-cO`%2sdIfDS`TZGuCF$`a?6a%cG>S#srlA}GCMDv zS$Z*i>Da+>@vD!;#`VaK4)ybY>@hko>FE07XB@f}y#K@V*)JdT+_kpZHyy5ZS{LKg z^oo1CC8s9GxOUml*{-!^E~WQ*g&J_BCqloLI2`^Y6l8MX4>9y!P{ zeOlG=N=oI{%7sm9K7Ty*wDSO$ujAfLndR`Kdx0*lfArrf)T!6zAKNFpDTnhOB;M9V zwtDN!taF)6LH+9;tXJ|7ha2Z$f`ww?JvzdW7!QQ-TA zTKg~Cy0<(1ZNRXge>g@y+}60kttV}ocDa_-zK3Dvlh{wMv|l^?XtkJQDUEx7wBWV2 z9euCPDD!Evgl5$yMRrZ=xjg$9`!cud=Q*EgKIQFHpC^y9m!vfJT+n4ilfj?tEkAAf zcUwAL4_;YmY~vjNhiOCV*nfAroO9wk`4g(Q-~7&(wMPAY_&*#r_TANM$c1%&SrzhH zMJ0B6$^GUVIdkgXO8a)p)UVbL4eEC}|C`B&I%K%5{l~%j34Ys_raumxcp+kO2iS}o zpX|Exd(Hj#j|4h?Kc&a}mwxFm^m||Djk~@38B$u5_up1D?$qzI$G;tUf2={N@^anX zE1pk(|9=NZDE|o@VYh{GMBXCbp_O`8`zChenU~AA4$5tC{pKxi@ABo>RqofjLr8*$ zLoLS&U#>0RW97b@-;TS~aO1fUxB2@Qw{U2^%PZ)YE+cQp6cjZ#?Dv@W{l+_=J}BcJ zcleKkhCc!icB@#^*F9_h-fFF$ycT}1efa+RsRy>~{mn6^`JxBEKMr5;+qM?B(!6s& z`RwOKukQ}p^@gkK`rf~<>v6wP*Aul4WO)THYUVUz%%oWpzF*XDom>8IFS>jfcCLR`nWp?n<*u z*&E9Q)_k|>kdLxEt$tK>Qr4$GN4I!2Y~1A?V{${f|Ni>brVri^xR%wp@Pnee5vSU& zJ+(AI3Eq0??9StB+P?I-!jq}p-@O{tw&TiP0m?h0zP>%&>A{uFn;z`En(5xYc6eG? zfO4ez;qBFruUl2C&~UJQQupqQ-eDP` z={bGQ`OmMqKR++5`-W&G$z|}?u_^Gy>^ywrbOPxmvkUY%sOvqzt=*`mg&e(V4C^6h-@D$Tncz1_(zWBqf-W)*cD9(nWU9u)?kU-8Y= zsK(0=K3@8X`%fMVCwQDEQbtescQ(EfWhN3^a3 zcvzy3U_pJ8k0448cA#FZ_Zs-Rf{&nL=b(5g_wCDo07F@z0#cMCO0bd-e^2Oq3@N&5 zhQSe$2^c=EH7J76qc9a(B!wsZdG_=FCj^{O;r%E5w6mKq#d*Tj9)-beA3N1P?eDrK zpzv7e&1)go?R+jcdSujpJEMKGHT7MOv@f3@QlRs_c`x{agV)K*9_jYYE(O#|_jfrR z;re6Gg1dev@7FtI@3Y;$`Qb{XlbJEG zaXGZ$s{i@B{wMC&J@4R=QQ6~E{g*C=zKGR&y8alN_eJQ1Oy83aye?FF^>8KcQvtQp z>({*9-sNa$-r4piul2kE!*ghNvO)7h4Ql`3U-ME2m&>8f`5}d8!wT;Co^~<8eUBCsz?sd=Gw>#un=ahfbBMn_ohZo%Ozi=(|ixLK*~;Yw`|H*im{SL;Zq%jKRfcl^)as|UFAq@&m2ifvCd z1ngexhxX3-4GRIg-|3lmFXSYU3(vME1H2E{fAKb;+)%_~XA!%fw+p-I&`!qgf|dm5 z0a37j^+Nr&fZa1X)H;I5xF8=;e@{TUC+vd{+qXScxy}#un_g-UIWAWK<%VYbRPUsH z@JYw!7aG87JDm23fa56RFY0D=A-_N+~0OVFRIp*i--ZF`SX{w{C>=JJ3d zozF!Fj~^VAjOX2t_&MM4y>9Q3Ua|HO=pZ-)XoF{+bVs+#{!i`%yC`AKc3waT(<|0F zf`c!o)GN5>l^6Vs|9jfu`2Qf!;Tit_|6rAIie7xy-IY6H!idZj!2dT4S%&;8ZtnSR z`Ip@c`EG`mNyGh;d~WM}9_vOPsnGTZK*^O|uQULj`ocN?@9lg~2&VL#^<@k1QGCIndiCwD@CGd^h_h7A(Sf7stO9dWqJo#4W|fO36+ z)jnC-JEMKmyzpAc^0&_eS>;^)lX@@0;cbC;2NwF05r@OXf^XObpQ_XrSbiXN7sG*U zx$f}43H0Y$Sf1YN28bSv!-;oC`V)HdYR{W?C_@~o)NVVDLr|Hker0uDMIa1Rc2n%? zoc4cm*C)>b5VkI(3~=i%S3;iXf`6z~`(g)Y#mCvs?~8yT z1CZ4Q&iG7t-qisv_v&5%hT0QZZB&;)4)N}&E(y-NH{c?Xn2Vr?FzSIM+==QE(7!aj z1sr+^HQ4isXwVDf4iGR*feWhsMb!`y%ipt*M2{QxEJHLq73g*`+zlE;4N=I= zOknxLGMoU13k?yedYI)em4*maJv_plUPV_!t~)M`f;Bvg~^3-4U^A~pgm(BTE$3_S|!~aH5{2%y`((AVh!51pMeX~KG!}V*W6BB;S|NONO zz<|FwfEwKUP=Fh%A;JrP>Ia1>UnhHj?=T+Xz=c_sWN2m|*~hByh7DFF2D0*uJJ zhZSBkDRd4uK)w4~AJ?mX*X`OJsQ}2_?Xq8i66~V$DYzGW%8?lN&HAT&{$< z=z@W%KkVp!+0o6=!1ZY86D1_iF8GE$5L{3=fx+X6;_GrJWG(GPK+L7(;s2eT`waj8 zJJ9=|ulo%D|HVt_?t$Vu>tym3H^tqMZz#h5-P{zne8-1X78TSlx?0JQ6mSF3huz4F zm3mz8Z?nCD+ocw+s4GE)b;Hj05Mg)Jp4SKTry3VSez=FWQP6k*IY7J*c)h2y;&<_! z-wAu)L#TPFXV>K6>by4F8iLxU=B04JN~lNy%j7+u^8&l8l}UFECf9rZ+w6eKfC_?4 zu0Rw(krL*1rsu6|exS>j^gy-J8`2D3!AV|D4#@zpNv!#lXZXWv$>f|~jGH}myXz?TQv zf&bF$ln}|$>iq!RU8TQH`6b`4h^*G{@`U#G-+YmEwZP!&`bt>cASE?9Gx(h~p_?xo zwuEJMI{EVXI-hwOKKLd4K-s^!I2jE7J`=wTj`Iri`Yf!m!5 zDjZf5V(%9W&zyP=tn&)N!zYT8 z^12SRGzc#A%u0t+cMV?{J~Mo6_}FmHuoHeCHk>tlXE@|zG)#q*9}W8q^9{QU zvmyPuVS(X@VLaq)GR!g@FvJ>$8rDI{4-69xpBT0nw!-hJhW8#`W4!4X4qC##-J~9H8e9cF`%<$n4yEg)iBmD z-4I}ihX2A1-3*frJq>?@v^YbW;UmK|Lk!Grwc)hEN%`E6Vc2d+Hf#Wx+&0WJtO2<6 z1^9hv=mcf9Kx=OsQVs7KRvP9SHX5Sf_jJP>hW&<)0EyS3-SvhfLjpi6#qgeCsUaTP zo?{pTzb8WP??BoB!w&eq9(tV%usjK{{|tKGZn$jNY?xv=26gm?Z{hnl(B@qD^u6J8 zsIeSA&4M)BWC-tZQ{Xf#0PZRqj8Q7>^$rq>dM-6v+H6P4E6rd zIYB+0ot@oIU7_xg&K*9Nw|ma+tZt3&q%K4EwQiekv2LzzxNf6vfo_s6O&6eRr|YSE zQx^vRbJW;ZgAC<3^He6xZmG- zu=c^ghjj`*DfBKF^v92PPu^K_-|3;-lkc8{Jl^}q)CZd%6#lW|ar1(l$3OjX;X(Tc z&;7CKQMV_LANT)b%f0RSW$z^4>+t)*-)B5n^kB;G3myd&cGZ1v-`IYXu7lFp?nS4| z*Go)fAxs&=_rhibYizgAjWaZE-3N-tHK zU*VQpp0lCs3uPjmoScR^tkG>MT>og>@88{zx$k-Z*qzuY2-$Q-3VnH_mO@aCbLg*O-8`teTQgI{r>pT4eRaYW=H*R=Zt2<+-!fqACxraM0Dqd2_kn%Dmu^RaEuShxc0NzkTc2 z&9LhZS=TSeWE?wx|9nx#ua|0H&b?UeV(m-ouGY+{bL;ZmH4hU1IQM9BQLN(v7vG9m zo(C$It$M2Z>{|A9J?dYscgCxK?VoC9)fo2N^HrBteBSkBnWpyL4OO4y|Nh6F$v2l} ze|4?fmB*LfxVYhh!})E$uKle>M)S){u64@#KBvablzi{sTNiB5`8mB?{+{cIiiRq` zJeOT-UL992f3LP)U)8x%yJ4-m&ke4UU!jJpTe(<=uMK`r<~$gcf9OW@oG1FT*EU|+ zc4=3JE~6-;)8$#$#$|nxyYZ$|evkVr9?dnJap+rai0c;~IhF2L&8V@sc0aFvUJdFj zsr5q5v(Ncg?^wmDVk=jNvdQ-M3?mB~J-l~s_U+$p#OJ=8vopI|_Jge4tb^GfHrgnBje0Gy6XrzH?ez z_J#7JoWosaxiob7%DJ`k8|4$qeO1QI$Ao_g7Ii6HP~cgx{YkASx&N=dF9C?E`u=~*47ebWiXxif z7d2NxMMX`;ea+mZTv8D?cEJ(_9Wz%@6C+b`A<@j-sI*iRM8GuHBugU~a3{qDROa3H z-v4t49zKU*>>Ep8e}CV2=iYnnz2|f9xyw2C49@6J=vxcF2>xV)I73Gld6%C~eA@i!(x)q)ZhzV} z??3vn!ZuP<`b-v?vE1kUM9muQOp6+pZk8^Ve^^Ylh}53doZ>yX1I#7KLrfFK>l@}h zeG>QB?(vaar`$%lQMpc!?Vfl&9i8`+zAxD-PLdtjIPNjuQu~_4PZsShyIXFy>|q&c zk*VFS`J4~srm-!UROubDGif07(%;MT&s&){Aa7{ivAjY0Tzys2SL`XhEjMB;+2d?F z7sr3g+iEnLD1IK!l25rb_9WvePmm(TJEReLSJGfJ+Uz^|n!z?ngRXLrFTy^M#Eariv8UKX zY%Eq0Z<7Y%r{bUD5ZDD4@&~dNzDxK9OWJfXf%xrm)lq8N3 z7m!3@wa`?!r2kC6UB6uayMBhSTo_F5lIdcg)CKm>Cj696MQ#0)v~Rb@$wqULh=(e;zDv&I4z77GWCsw5Ft%yOh%J7;H1ZWcFc3 zTCroPSVv*fR_P;Ylawg^E}cZMk?YCt!dClBz9~PJKgD-c@58UBH)XrBv)P$!TedIT z4p;~A<;!iDujN|uYp{s4QiA9w))dc@0P+?2n&`+X#P^A%I1BO{A$>00mm0zDs|PK; z4;oKqcvg>j)HA8jexEXENRy-xX})v_y|9!mV3kNx2UxQ!U z8&Y+-p?pmWlAefGSTE6Hu((8A0V#bg=88Xwm4M#?^EOm+g`K(?7Hkq^mmqDCf~8*4 zLdg@eHVQp^1AS>Mb&-5QTO{p-ZF(KHZ&%nwJLL7~!LL}WwV8BTfZeBMGGX0)1AJe( zft)8jk*>n3JqgL&Mmi4ixq|pDSl6Rrznz1vwO&q^Z_5v4BG+Z!Vrt@hogc`R7!fl3 z6(jr#7U(S4bW>pew#7^_vR+D-WT_IY;23EQ_$Ejx=ueV#OX@D$z8Xg2ux>Kbn{?YeSbJ&cxmcY;gA&Wh%~i&I~&1XV(W01*=)8E*M@WE z76E-Jm%wTH_Phgc&j;~s__};ep5qg_V9t}9z%}6R!6uDh7qdaE6J8Q?6#oyVCi|Gl zW;Qcxr^?Yyzy^-Im zdl!4F3Cpn-Y;ATJyNQiu!`T?vz&l{`I-qaEA&ZYNjt-m)_YOEdWiPOc*bmrR?3?Uq zW-9E^NAguz|C8lF+_aLhO2VbtQY>y!?@9lW9HrCZNij`qDpipz5p1NEQeSBx%EsW; zNeaZ8-HBCp5%;I7(h1zI&P%zH2J8N=q?Z_+&TqixPm*p*=Wst;f-|V6)LFVDCgNn8 zAV!Ik#rn`BUz0$xh-@RiWCYQYT4WgMK;9sJq$}x2mV$nlR1=-Wu3~GP*ZsxC;t}y1 z@j6cU^XS=rF+yA~o)t%kpJ0!T7l+{Nt0|_Ei{v=jN*RbsZdbwbFx&&7&E(;@eb2;AEE@N#wa}NdaSpG=9q(K0et+EM4r510BG(%?-oL?vJPvq8?@V}$VVf8i=>j1SS2!H#5!UJ zv5V*__QQItgLdDG;jlUSVVyJ;^`sTFla+W8ZHJOwSb+=3O7b>zdUaxfl|2Qk+7;Tf zKe)d`U_+wbM&e1{BcrfRT4DwEAVbLOBX9-t?1Yx1DN|++FMgKg7R>EEV75x)^bD_3SU+6DX5xNQ! z1wUbq@EPo#&B9gTm~c&aAe8?GCz_O z#0N$2Z~d~ZlVvYiU8P4r^VyqA#pSG^F}cesgJNrr-(B!rxj77j!3X7&XOBs zKlX48&aEFwJjuWraUY={xV?dOF$g;T5Ain6raQ1qI9L?+(BHMBYEm8PP3b!JaGrQm z+$CjTCmXi$kXA4iG?*3F8>5iQ!w`4 zI=P+f0)NgxtmU?H1=&g#B{%sobaNf-4oBEHp?DvOee*pmg2&M6*3iZdu)kcHw#;bk z&bMIWdcaBxVY)N#Fg>vsJ3?F6fOomA3l+9pz(IWa^Ax}#_M(NAzK3;7c1^f zt`~Gu19&3(r) z{7vo{_bYc8*2Zq6_JQvmX#R?PL%s%IiMQpib1ir+@O$w#ynveV+&QiRYyms|D0ddA ztK1)4ca+)lJ^A2BhYr)KA+}>#FUc zwbAM|_|F;IW12rSH#NU#e%0*9tt?T)Xj3&ru$q(nUVcA62-5GtKjk=n z2X}e>~8F)$+(4vu{w4n>&RAS`@`zXU7Wwkl|K z*{SeBvbe|PFh4N2U|%1@4yGE=7Jpsel6eYC;T|;VBIxuL@IO<}dl%^N<%ZNOc$ovB z_2(j93T;0JUf?-+ErUhB7XInwXfY8tg3&lzGNp?0BUmbja07^iEw~Wcv=OYKDv}_k z;|xp`Y3iO>P0Gfdrva?Vd!mCh02;TQ)C9L1SKNR`;?-Yz2e-R+xQ)3;U19Hxm3m9o z(ofLJr(q|~$9;A;?wtLgZ{LLtW(^ywKHhCbfgB=d$j`9oWKspz;XQHz=YI`YijLyj zuob<;01L%bu=!?h1TFij%T}?iOjtqrv^Cq33&xVi+(4i|x zUDBKMB6^_cF;56RMEwxZ(c=&6gtF79xcc0!JPQEYU#A^&-3}px(ggv0;=$*F@CPh}3&Ib=ULhH@UxiKZO}zzFt4WzBmlQCp1Y@O5apll|~$YNMMtB?*MbI3x}2qELZ zYXEF>XXsx~QlGR%k9xq0X+?q|mr>~Xe59hmdm-$OWZ2(3$ZwdPW8?%Zpx+>?C?L!Q zm$j(15G~&TkDer3;9=>UhBZ(PTrDB@#zcUG1lSV~gl1$gtmZzD$=B#f3@rJT7{?y; zY&zy;32*};vG%YSRQ$3`4slRO{|nhgcBbi=O*@sP1qXNfjc}$6L5!FkK4*> z*ctKg^JHU{SC&Mvf^-e{feg_NH>;cQNX)}6qndP4B=8nw!D`TpHKo?lVC5>aJ_j3#_T%9J7!6xRhtHF~hZkodT3x~CPrKj`N`Zwg<6dwEo{Cg( z)xh$v#?*lqi^Jz24e*(xUJiqIttB%M_DENz6EmFY47f?vG-eCsg*SZEWU%;jrZ1}E;|KZQ4@s+10KcA)_vRhTapUN{A zYW}<%k=gJ6d!2qh-DrrX+dNkC)Wv*Lp|2CW_5J!T-R;)3V=isBWvfagxe`u9xp{tra zi>=M{9oX7-4j)*-c2loSTHDNso&&qiWRv~p+8=0sMC;-*Vm+C#lGi|C@uivdpm&29=`v!j*`ylGGTc2CM zz9R6_sn_FL)Eh8uP0-~UYriH-pIo|X@lD@1cK;fjIo>1FdToyx^Ufz7{Iij^+1O>H z8+dno`{I_NsTOZ%+V+|ex24_E*RNE`?!3IpvX<$``?srNS>^33RYy$jJo2|u3u5NI z8Qt`~kz4mfai6eb0=MOS+~(Z*<%jFuo16Kc`eWDLN=>mzsyw@1ddL&an74jOyF5DN zCHl(C`=zou*5q%FljpirN^-HCfA#y?qbvTIR;_yc@dv zYp>}ZV{<5_f5RBp`i)woHdtnV|HPU83wvDLKJc%=UQ?R4U2~Wp>Am?z70agIjoX{@ z>+v`0>Z**n|K%QwIeMq@7Qsr?(WoDL)P~2ZatCM1TXcUvHC&lJ1ue> zZNI)?^=Z$G?=@|m5PGU!#FN^Ihf=S{#=kt<2EXZB3g^}N{3$uOvblAVyM6a82hE;z z=CGa1uq#bm#`fOkX1TXwl$}S?lnPb5*;d%8`{2^O0jutx+r4B}eC+DHh7Ib!b7)+| z>Z>*0nvwGQ&Y>S28MMUmuZ%@spXwa5{m<2tmT&(4bn`u@K8U$>_0M(pzq7OSxzY5a zb3@1{0avDa`gt_5{?vC=R;|X%=5<*%scq{Uv2NBDo(Ywk4HFk+F21a}v2FH|z{~#J zzHM&yR^q9+;dN}Bgrj?!RhM78wC3v2iAyra4IS5Svs>MsOE0%~NO|DWkD-=fV!>$D}8UY_Y3UCeaSUuVt#qp|xfKKlR}bEhC{nLnL-A`|*{9am?8O_jOb z<~wekweq7gbt}x>xO8;Son1ZWYOJ-tp1HMi=NR3eUDML4?rVJY{BMthpi^BsgtboN zPv1Y7Jdh*zzNv~~*&uDNctMMmo-_8kXVdc<%Y0%9_ zcM;GqAhn-`FQ>H zTFb|HeY)=bsJNWtj!#ea+dtf^S$xY1?LXgj_Tl?8_nlg~rCqCCK^1K75BJVIU~?d; z)plW1*1*4x-LbUj^wxsIhwgrv{xsg+;t#j;U$^LyclUawq&k@iVU>=w8FS_H4a;{g z@6i6~tjKHCqF<|)w}0rdZ7scoawAChb%?PM4K-bIhwT|u$ zDmtXFS2S*QmUM9JJJL|_g)#r`9Gy3R&uk1A)eS+?sn7*W2@WVE(&evHu`R$5dy*pk0vUgcE)3%yWb=HGHJ|u2#Y9D>)z_jn$*pKqMRQd9V zomrz@CL~sSze}sh6`OCY<8b@^&K~34h2;-d)DK}r_uuOuZV}nG(tb2$LhxjZ$zD??O~&sl zS1??h=+Nn7_*s=hxH^Cr{$zr2bfmE(vlXNoC~t%S6620Q>B^IA%`h~)dP-LUm`8US zN|)=4xfS5XAy%FqFK$)x8US-bh*CgRaX`tr7taAWmIyNt@>H1Wq^|hZB`X2Q7zFC< zG53@@KEQe-oHPfjDl>_X^3@2j2u+No0GbCvD#CM*Qtvt9i!(*=(WIfOSsK!XeL&hr zRrXx6wD2h(Fb-ESKZP{C{!{u175%v+EvL_O#206DhDQ1AY*D?HD!)(Fd;z7a@UXM|g-w)Ir$B1sjWB4uU>I#s(3s(R32hCcYJXcJWFB1sjW zB4uU>I#oMI)Vr*zTOH~8s(gYfT_maEQ>4rcp%9<8M?Lj;4L=$HT6RJE3ugEjzE!w@ zhq-FTWybjG@lGt@ceZly)n+OsBVV5Qfhv6W0{n83 zKX8rLpB-pwc_gU%RwPOLN}nPH<_S7Oqx^Pi{p?HWXsVV+kU3T=KIWy&m%jQWnMHqYr_rH;86Z3iKwt9Y18>P+!MgS`mb5DIm_ zse0yUXgdc%k6`XGiEobYe^UlvYWHq2(}6O@SNaNkIwwWe3~1ApI^_`qF90C}L3w(W z2d)|ez*Y$EG^pvX(l3^PGHLlSRm(QAjQ>3$KSj7=BVX0ooSv(*xry+I)!Bp~v_n{p zu+At@8Z8T%i@FFmuc9sGVc#@n5hO)*n=1(!# z4UdgmHzHQ1VePO@<>J2CIAW_4@S+r4Ra~a-o5((UErB&-{fO8+6{cbAG{1KECY`a2 zN-Mu^#O5*UJYq9V;VQJUz>j`!Q*ZD;sbH9ki^E?xV$*7b*!9C=iql%(Q}-cy#3mo5%s4JBe9CA2@J->*_-{THHEf%~eFNHw zXY~9%q~uGAzhU48+qJ_s7rJl2cb~#L+9TF*eNghI;*#QnXA0%J-XqrFzKMBni!<`K z6s)zwzO1LDO~s{vzd_*}?XlV5zCqr%kTzn|1SM@ME-C&7j}4CCds*SV`n@gHqlay( zujFxtBq(W9aY^xMd+>cW-r=zZ_YG*-6c20vf+<{uRvP%~@#6e4xNk7-(*+n06)aP6 zY2eenuJDc?5o>VYlq-C3ms`azMeY0LA57-Ss zifl~9C7pkI*5~uxWN_caj*PW_MvIlHUceqWYYLmvN{UbM=$WVRp}I-IQqJG?X3ij` zozmv-#HREg<)g;NJ}lHfw9KG?N5m!@^QUF>F{Yc#o5C+xhXxzTSpViDn16@OGYIX{ z&EYC#rtk~Kuow2nHnr|Ik6N^J-SEwGfTLHiOvT0F7v=WPD62zJVhWqm${Jtk zHJuaS6xXYHclS-yuqdm4>;9$8$IBY$J5iMP(@4O@^2&Yl z>aTBJ)&>2~`duMGcBkQ=wf^U=D5m9MISxTKghaVq+&7jfvJ>#43UL+u1i4JzH_Tqy z(gI(ZV3{Q66~RUyED~hhKbNNYmK6@mV}O}y3Rj_(1-|7Gxi|QqR4~lN#o?pPYRE0t zBB|)7U!ZxQEY+B=A`N4@xx6WS^uJ+Yn`+!l!(I5w5~H#U$ka z^^Iksd_qOf-$SK^pCH?6k39S98{q6yuqq_ti_P-;^&F;BPGee5A2sboX|?<@rzx~P zVuSkza(BjfZz(*mp6e-TQ*l0e3GkET4Jy6{_YLOTSD{r%k|!u>Q*lZ0aW*=F?`4H| zl?1uEWvX0X$)hg`h3SGhSLaKLPur`+@1~{h+ zupSy?s`I6RPxpEu&qUeazCpg+@FD*|1z*w6$d`-!jn|)5l5F>!Jj!_eVVuwOGxlA< zdMuO&%7YZyn2Jj}|B!uJ0bhgrhWSahR?*}Fy>QkPHl>vmpW@LoPvJw)Mg>bbf6bji zN;{>^--*@duhO2zYHaW+)IWwY=wHy1jrl9>jp^p{rtk~aVZNR*(!UCZx!5969)x*I zH;1c~nZl>MQN9;p8(shAu*{V~kIg|p^a_@#xHx=seE*v=%Y(8L*31@D*pyb*_)1?3 z=A_7)fqpMn_YLMF0OQUmlt+?W?(Q3E%h9u4Io}l-y^3Ef0mX5XAHQ57<7DD(I$B`npLuOdfdy1Be5{H$ZThDsaYq^bLGCppYVDKm~s3!n1IN)8KG@jrDZ zVUFRiZ$LYtq8s**k}oNKc7o0}>quDPU*BNt`xM@Hl0yyd8zpZlE-C(BDYH{3U*H`I0M~wZl z!tX|cuKI&iU412wy_`^(E(3hpfAx58Cxsc@H^9s`;3kJ%C~N%Z#+wpmaNpo8IbDGJ zu&nXvURN+M7Y6rDdE#dsogJv)EBYDva*@CB`g@cVVyBizS+75}ex~b?uE*!(krEnI zD4Q}^|CsNz0{#Z~4aRP*qRCV*;2b<#TpwtE=~G;}DY{z!P&|6(<#S;eTBfuqJb%rc zK}tKN&EJXD_)2>ktFghSQ2)>}-!Ae~Yc|A?%kqu)*~I1YgakBhF!T1lA0M zyl0sCW2brhec`%dg;l}=`vXhI)QXSDG=;0s$^ySu{IcG)4lF&XV3>=G!$+Id2(k9@ z5k*Wlhxl+0`vVcF#(WiV8Pm<>P2ty$U)r#+P5ja{bsroKg!>eh6|7+;Ut0K-4{*X2 zzKBoRB}5tAH%OmQ(G7b@$(I!0F=4rFt$h)N?i?37+o{95}X zQYatHt-*a$CqCR6`CAHR&3)nZl(eb1r1%c;5gQb~*gFRI4bBW-h32q7VuF%36_*s> z{)dH**sqrr-VWbIRIih;tiF;*oS;fSH}{lYQheI}`SC6>xNpEay8!n>S>qdx*WkVZ z=4k_Ne8j`D#;1E-!9d#Jz9~<9U(4$Z(oQW8^rKAIpISfDbx7Ca zbMn|95v0h*R7~sB$5dHyH1+vk3uk>nJ%jtE>fT6e6-}mk0cX?M;&|nw|8snbN6$Qk z5A9naR>Ape?hI1e6}B;PMjMx@$FH=f@pITJ{X@&B{)KKxHs(dk=wnPbmp6rPScgjA zjr4Cmg8BDa`qIfpT@zK`XHm<@5&slM05p zxHxBYW{zo^7YO=p`w>6en3FBt)E|Rq5HQlMaNj6- zQ*lYhkFli~_A?l+HGv=r-T4*H>2uuR3p z;TPrh&nUjW_nly~Y%zsRX=RPC^txb9imVyfc;)K8fh+J9eKU3H9V^KF zU%7uN^YOCA|GN9e9lxw(_-1#R#`LkGzw9*V`Jaet<~ZDITF?}KzmBfXF7(yRvDEnH-c=q!O8S3xt<=1h%ORI^kC$^o~qQ!*PF5_B_qd(oo z*genIx$Bf*-*Ex7L_>df%91PmRVl-7Lp?!3$$#!GCjV!|eqEOT>y1yi^tsj2HoDmN zw_A`CKWgKf8@c(1bzSOx-Zpq|vnq3U%v;s}+jSe>sv`G^2)uVQ*uHJ=@An=b_gU(f z-;K7I7aH1aWUtFH(aU#D&fIG0xzKuRTx&<02F_bQ%+U7OYYptmyc@oAbQ6%c2K`H~Hh-Shq)yZdSZ%{kYa&J@)@H z_e~7or_hsk6ce@H6Rbhd{@tR_lG|Xy+8L%gDHQG^-ef9 z>x1|cU&Q@kIeb;6`}Vij_DlX`{{BYYHlD2-@@B(Pyu-(9BJH!QT7=Eb9TlWwg1X&X z%WGD@d!jY}$%U0qbDmszkQe8?=4dOITa~qghE$!tsCJi%?wcAM?=f>u6yGY<=6Z7f z8|;qP^dJKh+uY-8j5bbLM9kGi>i z`?Vhz-}rprjb&e5JFxfq{*|LfO!4dKKh1a4WM7}=zT<*|y{1vpM3B1q`vp()_vt@n z{Iqe?LVC;y_VT0W#3=vqQ%8088b5u~3o1GXOc+o5_rLUPtW>qIJNs$cu`v5wV!Nsy z!+g-qe_D4RpLfPh@na10@8#t@!NPs{1^ z#(eKity;C}%rLsnz54WYYd0>xOx;G|MPnr>{ZR6hr@~h$Q}XIM3SUa2t6YbR>6cCnP(+F~4c&t22ih`b^7|_DZbqQuxz4ub%(kCBQPa5P>}w`ty>Y zKRv)OE+*)-UT*{s$Er*yPjmTCDDR5IaApYe0p5EsgOTdPyvqzgz7O7eB2Axznrw;w z@}!2*J{PcX4UY!z>Z6wuyCbmRI*yqJK2sPU#tS_Cn2C%(EoSP26T=Ke={Qh>P(F?c zMm>Mz@}J$BbTDPnr(o2Y0{SEqoPIRaalyFrU#`q}Dg&k=V~Muiz|R*iFSHH@3d6*G z+-Oq3psze14_G;d;yA171sM7gf{~9iw4vq3_1hTgDZr+ZW>xX8*gj$#1$bwW*{dg)Ta^)Hq`Y)pL|q38)1+LmF6_`m5!6voQBwk>5sDU zNK@H|U|we!cu*P&+S0q`D4V>F;BrN2^Q_2t6`3wuWvk4 t#`EN6XwwBF4l;~?JVq1(CHJCsbZ!0prz%7L$n!+|zu)3j&Hp + /// 分档查询 + /// + /// + /// + /// + MesResponse GetMesIn(string code, string code2); + + ///

+ /// 结果加工参数 + /// + /// + /// + MesResponse ProductResultParameters(BlankingData m); + + /// + /// 产品进站(包装) + /// + /// + /// + RespArrivalStation PostProductArrivalStationData(ReqArrivalStation req); + + + /// + /// 产品出站(包装) + /// + /// + /// + RespExitStation PostProductExitStationData(ReqExitStation req); + } + + public class MESDataCombin : IMes + { + #region 1、 分档查询 + public MesResponse GetMesIn(string code, string code2) + { + MesResponse mesResponse = new MesResponse(); + DateTime nowTime = DateTime.Now; + string josnTxtMsg = string.Empty; + string BarCode = ""; + try + { + if (code.Contains("ERROR")) + { + BarCode = code2; + } + else + { + BarCode = code; + } + GradingParam gradingParam = new GradingParam + { + siteCode = Global.systemConfig.siteCode, + lineCode = Global.systemConfig.lineCode, + userName = "admin", + equipCode = Global.systemConfig.equipCode, + recordDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + qty = 1, + containerCode = "", + materialCode = Global.systemConfig.materialCode, + + + materiallotCodeList = new List() { BarCode } + }; + + string p = JsonConvert.SerializeObject(gradingParam); + + var sw = new Stopwatch(); + sw.Start(); + string mesRes = MESApiHelper.HttpPostJsonAPI(Global.systemConfig.GradingMesUrl, p, Global.systemConfig.MesRequestTime); + sw.Stop(); + + var res = JsonConvert.DeserializeObject(mesRes); + josnTxtMsg = $"{nowTime.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用电芯分档查询接口:{Global.systemConfig.GradingMesUrl},请求数据为:{p},\n{nowTime.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{mesRes}"; + TxtHelper.WriteTxt($@"D:\APILog\MesLogs\{nowTime.ToString("yyyyMMdd")}\调用电芯分档查询接口\{nowTime.ToString("HH")}.txt", josnTxtMsg);//前面是路径,后面是数据 + + mesResponse.success = res.success; + mesResponse.message = res.message; + mesResponse.error = res.error; + if (!res.success) + { + mesResponse.message = res.message; + mesResponse.error = res.error; + } + else + { + try + { + if (res.rows != null && res.rows.Count > 0) + { + List rowsls = new List(); + MesResponse.rowsListItem rows = new MesResponse.rowsListItem(); + rows.identification = res.rows[0].identification; + rows.level = res.rows[0].level; + rows.passage = res.rows[0].passage; + rows.rank = res.rows[0].rank; + rows.message = res.rows[0].message; + rowsls.Add(rows); + mesResponse.rows = rowsls; + } + } + catch (Exception ex) + { + } + } + } + catch (Exception ex) + { + mesResponse.success = false; + mesResponse.error = 9; + mesResponse.message = "电芯分档查询异常:" + ex.Message; + + } + + return mesResponse; + } + #endregion + + #region 2、结果加工参数 + public MesResponse ProductResultParameters(BlankingData m) + { + MesResponse mesResponse = new MesResponse(); + DateTime nowTime = DateTime.Now; + string josnTxtMsg = string.Empty; + try + { + ProductResultParameters prp = new ProductResultParameters(); + prp.equipNum = Global.systemConfig.equipCode; + prp.type = "DD"; + + Payload pl = new Payload(); + pl.siteCode = Global.systemConfig.siteCode; + pl.lineCode = Global.systemConfig.lineCode; + pl.userName = "admin"; + pl.materialCode = Global.systemConfig.materialCode; + pl.carCode = ""; + pl.collection = "JS"; + pl.recordDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + pl.qty = 1; + pl.containerCode = ""; + IdentificationItem iil = new IdentificationItem(); + if (m.DepartureBarCode.Contains("ERROR")) + iil.identification = m.ArrivalBarCode; + else + iil.identification = m.DepartureBarCode; + iil.qualityStatus = m.Result == "OK" ? "Y" : "N"; + pl.identification = iil; + + List tdvls = new List(); + TagDataVOListItem tag1; + + // 结果采集项 + + + tag1 = new TagDataVOListItem() { tagCode = "WGJA001", tagValue = m.ArrivalBarCode, tagTime = m.OutTime, tagCalculateResult = "Y", tagRemark = "入站条码" }; tdvls.Add(tag1); + tag1 = new TagDataVOListItem() { tagCode = "WGJA002", tagValue = m.DepartureBarCode, tagTime = m.OutTime, tagCalculateResult = "Y", tagRemark = "出站条码" }; tdvls.Add(tag1); + tag1 = new TagDataVOListItem() { tagCode = "WGJA003", tagValue = m.WorkShift, tagTime = m.OutTime, tagCalculateResult = "Y", tagRemark = "班次" }; tdvls.Add(tag1); + tag1 = new TagDataVOListItem() { tagCode = "WGJA004", tagValue = m.OutTime, tagTime = m.OutTime, tagCalculateResult = "Y", tagRemark = "出站时间" }; tdvls.Add(tag1); + + foreach (var item in m.PLCValDic) + { + // TODO 获取采集项配置 + var cfgItem = Global.systemConfig.CollectItemCfgList + .Where(it => it.IsEnable && it.PLCRelAddress == item.Key) + .FirstOrDefault(); + + if (cfgItem == null) + { + continue; + } + + // 生成TagDataVoListItem + tdvls.Add(new TagDataVOListItem() { + tagCode = cfgItem.MesItemCode, + tagValue = item.Value, + tagTime = m.OutTime, + tagCalculateResult = "Y", + tagRemark = cfgItem.MesItemName + }); + } + + tdvls.Add(new TagDataVOListItem() + { + tagCode = "WGJA021", + tagValue = m.Result, + tagTime = m.OutTime, + tagCalculateResult = "Y", + tagRemark = "电池总结果" + }); + //多个 + + pl.tagDataVOList = tdvls; + prp.payload = JsonConvert.SerializeObject(pl); + string p = JsonConvert.SerializeObject(prp); + + var sw = new Stopwatch(); + sw.Start(); + string mesRes = MESApiHelper.HttpPostJsonAPI(Global.systemConfig.ResultProcessMesUrl, p, Global.systemConfig.MesRequestTime); + sw.Stop(); + + var res = JsonConvert.DeserializeObject(mesRes); + mesResponse.success = res.success.Value; + if (!res.success.Value) + { + mesResponse.code = res.code.Value; + mesResponse.message = res.message.Value; + if (mesRes.Contains("category")) + mesResponse.category = res.category.Value; + if (res.error != null) + mesResponse.error = (int)res.error.Value; + } + + new MesLog().LogProductResult(nowTime, p, mesRes, sw.ElapsedMilliseconds); + } + catch (Exception ex) + { + mesResponse.success = false; + mesResponse.error = 9; + mesResponse.message = "结果加工参数上传异常:" + ex.Message; + } + return mesResponse; + } + #endregion + + #region 登录 + #endregion + + public RespArrivalStation PostProductArrivalStationData(ReqArrivalStation req) + { + if (req == null) + { + throw new ArgumentNullException("入站数据为空"); + } + + DateTime currentTime = DateTime.Now; + string reqUrl = Global.systemConfig.StationArrivalUrl; + RespArrivalStation resp = new RespArrivalStation(); + + try + { + string reqJsonStr = JsonConvert.SerializeObject(req); + var sw = new Stopwatch(); + sw.Start(); + string mesRes = MESApiHelper.HttpPostJsonAPI( + reqUrl, + reqJsonStr, + Global.systemConfig.MesRequestTime + ); + sw.Stop(); + + resp = JsonConvert.DeserializeObject(mesRes); + + new MesLog().LogArrivalStation(currentTime, reqJsonStr, mesRes, sw.ElapsedMilliseconds); + } + catch (Exception ex) + { + resp.Success = false; + resp.Message = "入站数据上传异常:" + ex.Message; + } + + return resp; + } + + public RespExitStation PostProductExitStationData(ReqExitStation req) + { + if (req == null) + { + throw new ArgumentNullException("出站请求数据为空"); + } + + DateTime currentTime = DateTime.Now; + string reqUrl = Global.systemConfig.StationExitUrl; + RespExitStation resp = new RespExitStation(); + + try + { + string reqJsonStr = JsonConvert.SerializeObject(req); + var sw = new Stopwatch(); + sw.Start(); + string mesRes = MESApiHelper.HttpPostJsonAPI( + reqUrl, + reqJsonStr, + Global.systemConfig.MesRequestTime + ); + sw.Stop(); + + resp = JsonConvert.DeserializeObject(mesRes); + + new MesLog().LogArrivalStation(currentTime, reqJsonStr, mesRes, sw.ElapsedMilliseconds); + } + catch (Exception ex) + { + resp.Success = false; + resp.Message = "出站数据上传异常:" + ex.Message; + } + + return resp; + } + } +} diff --git a/JY.Inspection/Mes/MesLog.cs b/JY.Inspection/Mes/MesLog.cs new file mode 100644 index 0000000..2b0ed9c --- /dev/null +++ b/JY.Inspection/Mes/MesLog.cs @@ -0,0 +1,66 @@ +using JY.Utility; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web.UI.WebControls; + +namespace JY.Inspection.Mes +{ + public interface IMesLog + { + void LogProductResult(DateTime curTime, string reqJsonStr, string respMes, long costTime); + void LogArrivalStation(DateTime curTime, string reqJsonStr, string respMes, long costTime); + + void LogExitStation(DateTime curTime, string reqJsonStr, string respMes, long costTime); + } + + public class MesLog : IMesLog + { + private void LogoutAction(string actionName, DateTime curTime, string reqJsonStr, string respMes, long costTime) + { + // 构建日志目录和文件路径 + string mesLogPath = @"D:\APILog\MesLogs"; + string logDate = curTime.ToString("yyyyMMdd"); + string logHour = curTime.ToString("HH"); + string logDirectory = Path.Combine(mesLogPath, logDate, actionName); + string logFilePath = Path.Combine(logDirectory, $"{logHour}.txt"); + + // 确保目录存在 + Directory.CreateDirectory(logDirectory); + + // 使用StringBuilder构建日志消息 + var logBuilder = new StringBuilder(); + logBuilder.AppendLine($"{curTime.ToString("yyyy-MM-dd HH:mm:ss.fff")}:{actionName}接口:{Global.systemConfig.ResultProcessMesUrl}"); + logBuilder.AppendLine($"请求数据为:{reqJsonStr}"); + logBuilder.AppendLine($"{curTime.AddMilliseconds(costTime).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{costTime}ms"); + logBuilder.AppendLine($"返回结果:{respMes}"); + + // 写入日志文件 + TxtHelper.WriteTxt(logFilePath, logBuilder.ToString()); + } + + public void LogArrivalStation(DateTime curTime, string reqJsonStr, string respMes, long costTime) + { + string actionName = "产品入站"; + + LogoutAction(actionName, curTime, reqJsonStr, respMes, costTime); + } + + public void LogExitStation(DateTime curTime, string reqJsonStr, string respMes, long costTime) + { + string actionName = "产品出站"; + + LogoutAction(actionName, curTime, reqJsonStr, respMes, costTime); + } + + public void LogProductResult(DateTime curTime, string reqJsonStr, string respMes, long costTime) + { + string actionName = "产品结果加工参数"; + + LogoutAction(actionName, curTime, reqJsonStr, respMes, costTime); + } + } +} diff --git a/JY.Inspection/MetroFramework.txt b/JY.Inspection/MetroFramework.txt new file mode 100644 index 0000000..81064ca --- /dev/null +++ b/JY.Inspection/MetroFramework.txt @@ -0,0 +1,25 @@ +MetroFramework - Modern UI for WinForms + +Copyright (c) 2013 Jens Thiel, http://thielj.github.io/MetroFramework + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in the +Software without restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +Portions of this software are: + + Copyright (c) 2011 Sven Walter, http://github.com/viperneo diff --git a/JY.Inspection/Program.cs b/JY.Inspection/Program.cs new file mode 100644 index 0000000..007f20c --- /dev/null +++ b/JY.Inspection/Program.cs @@ -0,0 +1,67 @@ +using HslCommunication; +using JY.Utility; +using System; +using System.Reflection; +using System.Threading; +using System.Windows.Forms; + +namespace JY.Inspection +{ + static class Program + { + + public delegate void RunWorkHandler(); + private static HomeForm mFrmMain; + + /// + /// 应用程序的主入口点。 + /// + [STAThread] + static void Main() + { + if (Authorization.SetAuthorizationCode("b5f8f9f7-c075-4913-ae6e-d7d2cc6f2de1")) + { + Console.WriteLine("注册成功"); + } + try + { + Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); + Application.ThreadException += Application_ThreadException; + AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + IniFileHelper.CreateIniFile(Application.StartupPath + "\\Config\\", "Configure.ini"); + string mutexName = Assembly.GetEntryAssembly().FullName; + string title = IniFileHelper.ReadIniData("SYSTEM_CONFIGURE", "Project_Name"); + mFrmMain = new HomeForm(); + bool isFirst; + using (new Mutex(false, mutexName, out isFirst)) + { + if (!isFirst) + { + MessageBox.Show(title + " 已运行,请勿重复启动!", "信息", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); + return; + } + else + { + Application.Run(mFrmMain); + } + } + } + catch (Exception ex) + { + LogHelper.WriteException(ex, string.Empty); + } + } + + private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) + { + LogHelper.WriteException(e.Exception, string.Empty); + } + + private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) + { + LogHelper.WriteException(e.ExceptionObject as Exception, e.ToString()); + } + } +} diff --git a/JY.Inspection/Properties/AssemblyInfo.cs b/JY.Inspection/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..f39daca --- /dev/null +++ b/JY.Inspection/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("JY-Inspection")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("JY-Inspection")] +[assembly: AssemblyCopyright("Copyright © 2021")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("607af967-65f7-483e-8bd9-2d92ad17d151")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/JY.Inspection/Properties/Resources.Designer.cs b/JY.Inspection/Properties/Resources.Designer.cs new file mode 100644 index 0000000..704704d --- /dev/null +++ b/JY.Inspection/Properties/Resources.Designer.cs @@ -0,0 +1,413 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace JY.Inspection.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.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() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [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("JY.Inspection.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap error { + get { + object obj = ResourceManager.GetObject("error", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap info { + get { + object obj = ResourceManager.GetObject("info", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap inlogo { + get { + object obj = ResourceManager.GetObject("inlogo", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap logo1 { + get { + object obj = ResourceManager.GetObject("logo1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap save { + get { + object obj = ResourceManager.GetObject("save", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap success { + get { + object obj = ResourceManager.GetObject("success", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap warning { + get { + object obj = ResourceManager.GetObject("warning", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap yiweidongli { + get { + object obj = ResourceManager.GetObject("yiweidongli", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 串口 { + get { + object obj = ResourceManager.GetObject("串口", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 主页 { + get { + object obj = ResourceManager.GetObject("主页", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 云上传 { + get { + object obj = ResourceManager.GetObject("云上传", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 停止 { + get { + object obj = ResourceManager.GetObject("停止", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 关于 { + get { + object obj = ResourceManager.GetObject("关于", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 切换 { + get { + object obj = ResourceManager.GetObject("切换", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 切换1 { + get { + object obj = ResourceManager.GetObject("切换1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 图表 { + get { + object obj = ResourceManager.GetObject("图表", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 存储设备 { + get { + object obj = ResourceManager.GetObject("存储设备", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 导入数据_操作_jurassic { + get { + object obj = ResourceManager.GetObject("导入数据_操作_jurassic", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 报警记录 { + get { + object obj = ResourceManager.GetObject("报警记录", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 数据导入 { + get { + object obj = ResourceManager.GetObject("数据导入", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 数据查询 { + get { + object obj = ResourceManager.GetObject("数据查询", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 查询 { + get { + object obj = ResourceManager.GetObject("查询", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 模块 { + get { + object obj = ResourceManager.GetObject("模块", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 清空__1_ { + get { + object obj = ResourceManager.GetObject("清空__1_", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 用户 { + get { + object obj = ResourceManager.GetObject("用户", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 用户管理 { + get { + object obj = ResourceManager.GetObject("用户管理", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 登录 { + get { + object obj = ResourceManager.GetObject("登录", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 白色X32 { + get { + object obj = ResourceManager.GetObject("白色X32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 系统构建 { + get { + object obj = ResourceManager.GetObject("系统构建", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 系统设置 { + get { + object obj = ResourceManager.GetObject("系统设置", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 维修 { + get { + object obj = ResourceManager.GetObject("维修", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 设备报警 { + get { + object obj = ResourceManager.GetObject("设备报警", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 设置 { + get { + object obj = ResourceManager.GetObject("设置", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 运行 { + get { + object obj = ResourceManager.GetObject("运行", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 运行中 { + get { + object obj = ResourceManager.GetObject("运行中", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/JY.Inspection/Properties/Resources.resx b/JY.Inspection/Properties/Resources.resx new file mode 100644 index 0000000..ce6090d --- /dev/null +++ b/JY.Inspection/Properties/Resources.resx @@ -0,0 +1,226 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\导入数据_操作_jurassic.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\设备报警.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resouces\模块.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resouces\用户.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resouces\主页.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resouces\数据查询.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\错误提示图标32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resouces\系统设置.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resouces\停止.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\白色勾48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resouces\设置.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resouces\图表.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\三角感叹号32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resouces\关于.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resouces\系统构建.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\白色X32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resouces\用户管理.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resouces\清空 (1).png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resouces\存储设备.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\报警记录.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resouces\切换.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resouces\维修.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resouces\查询.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resouces\云上传.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resouces\logo1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\inlogo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resouces\save.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resouces\运行.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\白色感叹号32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resouces\串口.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\数据导入.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resouces\登录.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resouces\运行中.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resouces\切换1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\yiweidongli.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/JY.Inspection/Properties/Settings.Designer.cs b/JY.Inspection/Properties/Settings.Designer.cs new file mode 100644 index 0000000..4db6059 --- /dev/null +++ b/JY.Inspection/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace JY.Inspection.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.11.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; + } + } + } +} diff --git a/JY.Inspection/Properties/Settings.settings b/JY.Inspection/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/JY.Inspection/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/JY.Inspection/Resouces/LFLog.png b/JY.Inspection/Resouces/LFLog.png new file mode 100644 index 0000000000000000000000000000000000000000..c951c47518ebf91be14fdc5146d42a101c1cb7df GIT binary patch literal 15827 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 literal 0 HcmV?d00001 diff --git a/JY.Inspection/Resouces/logo1.png b/JY.Inspection/Resouces/logo1.png new file mode 100644 index 0000000000000000000000000000000000000000..f629b6277cb80cd337a8a21c54ad167769d86714 GIT binary patch literal 5961 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 literal 0 HcmV?d00001 diff --git a/JY.Inspection/Resouces/save.png b/JY.Inspection/Resouces/save.png new file mode 100644 index 0000000000000000000000000000000000000000..a2e1a88f9cabc52f302fab39f663c0ce50b59c85 GIT binary patch literal 872 zcmV-u1DE`XP)Px&B1uF+RA@u(T0LkKK@|SpYehFY0eR5SQ*s*+teyWB;MuAz?I4ZjYV`#~ww<`V`02tFM9qKlON&B~M zKQ|}Nc#ZaPk)tPmF|_~?CQbQuu-c70PeD2qIU`ahST1{0Aoa$R5ptI2#j%? z3E(v|&IprM+s6!r0i`FK3{*<8A)%)GnLN)h;bvW0j8np-56vLL0Z`L)ZIX9hwMVuB z0Lv_s=c`P(Umu1sDok2%{)YmCb7PNu+T8F=0VVnUcSYs)K)IS@1e3Gyfi zPXVOm__HEM6B`DA6?FOm4-O;3R2Sw(vBGOc*^ z{ciyF#0zI1aZlvvnji2$0N8KIA`fvDr~Mo%wlB0V6GEHBiUEaY78nDeMd&kd3}C%7 z@A!=w*l-L;$_@e89#QbCV0?7j;%Z6ADDpfQV-W@3>W1)4Wa(VHZ)E^RfzJbYY%g1Z zcMSZB0tf-y7&t6_b$lOE2N3Z0A06;sJH;4)P9}S`jTx|)%$s2j3>JBR6)1smL`yD& zHwoalc}X(hvDSqJmFa!As+65(mFupwH_Hz;eEKj`#hoV2=)nfh3l{UZh3W zO^Z`_>GIJzevIm5x>ws^=0K4r!LX|~K~!RNz(fkbr~%chbP~!UORjaf$N;p}w{()+ zQX}YCaYi|b6-r8-z!lnbMSqrI)LeH`%33YYhccdTzM%CJJHeKEB y>BVpDVZDzs$o9TG?4g6z0?=2-ZFGVMQ1}Nz_FU3opzqiK0000Px$cu7P-R5(wSlf6&EP!z?_c}FYBC!?;vW;tTQ(d5HCGvNG?Ksy;T|k02Vx)zAl(HRJ$C1ng=%juLT(VU z96*4FP~6NpS6u+R^l}5pO21$Ohy?%EbZ0Hrbv*!AqK*~9bx>A2A;SSQT|*!#5GhOO z7=ZTwKHj>w-(nw;Qy55lx|yFU7(l$_RslA|SNlq}Un3yKzsX>v=q6$oXF(|nP$6&u zpwEM*>_c`gIYW19UY^z>1ffEcZeK3!TeD;g(O?_Hxd`z%2AJc8K-P oCv`CY5t_RY>@|SSYdZ|!6BeeRw=+T`?f?J)07*qoM6N<$f;2m~n*aa+ literal 0 HcmV?d00001 diff --git a/JY.Inspection/Resouces/主页.png b/JY.Inspection/Resouces/主页.png new file mode 100644 index 0000000000000000000000000000000000000000..02dfb323ac01d09b8d2cead052e7b3a7905e9d94 GIT binary patch literal 645 zcmV;00($+4P)Px%KS@MER7gv;l+SC_P!PwzFDul83Y!&ArKf$VAP9nZ@X+E)p;i$^s$K+-=56sJ zh<}0zB1reeqerV0Mf_1HR=P(K1VONQdlFAVXF)F(+>B(`#B`f%Uu(@R$;|ij<~uV_ z;6FcNEBckdTw!28`SPA^o;ASL<}n0@!T1`Blad#0AXb1xoP2pa7VW-ULN*2b5!*vb zPGwJQ3mFLLiHH)Z>V-TzT-}-nxHHJELO?7ofZeM~o*m?MMVsdg{49dx0?OLF6~G!P zIcd{KSDOU}hT2M==#Sq3aJ7l2WQCMGX(OJ*xZ1n{FiJ`eXYXL}HjY~J{Ftqsf^`SMb7 zfG(iqJSATaZD?|@7vXn~__8%Xhx4Sobjy1ch)1NneYt>g!+ZlrS8W01z&vaF@?5q8 z2Oz_{s0Z4-CM8d$i`HmO zLhyZ3(#r<~<|8_MgJ!%%J3zQd%9}_5v*83v;x75}a6tvFcS8KSwdx;SvH_H}S!yd; zOJXa*=Nj{_+oY<;iU3V;Cl!x_SUBT?qvgC^$o(fuwd`Hizi89o=+JiVp)^N0pW-Vb fw}O8XE=c|j{`Vy)B^>&v00000NkvXXu0mjfeX1Sq literal 0 HcmV?d00001 diff --git a/JY.Inspection/Resouces/云上传.png b/JY.Inspection/Resouces/云上传.png new file mode 100644 index 0000000000000000000000000000000000000000..87a179bd8787181d0d89bab90cef0751e0dd3be1 GIT binary patch literal 1157 zcmV;01bX|4P)Px(KS@MERA@u(S6ygaMHK$d-4+!@vv*U$Qfo=>Y%5}4R2rxcibab)6bgzDf<@3| zXH5_VMIsm>`k>f=>Af2(5+8(ueP}_H3Kjp5)Q2J{7_+mj(9|chvsOijP41B!lXczf z?wxz@Hfdl7_GRyPzWKg6XJ*b2Hu#_ot{)u(^%=B1)d%+XgRFf3cLS6G&<$V?;4(mS zVE;78I;EvJle7Zbk^%c|bpxenkS%^3j9tc}2tSceAMhfN>ml*Gaa;{Bv4M0!<%lr| z;I=pdmSd)wFkZ=tLR5}K25e7#2;h;ZleWMg*HSzhg)g=N+f}n5Y>P6P5teaL=fy2X zSRmdhWEa%;VBBFkNn{-12b~kUP2wVF!1mNz0G=};Pl!3JrFcG!Ba(sT4eN!Gw(C0+ zWZ1?wHV_<@*o5HRPIB5r^)`(K^tC!-jSXbn(l8T`Mpcj$PfRbD^UiC{c#I9$o;nAh zC#j$q@#nP^y@?E@kIXzomi2Lr$=edbzW;FLnVp|BA~VW>?Up7$+#gL16~T+gKy))e zPe+TbLo>aj^Ugqg1D*;t@17_k$g=j82YNpXVr)+Zw{>u9#~t5lDf(g?NP9{V;F!+N zpcg9Ad9xOu!~_GSiWDNY0oyAEZLn={~DYh7Az;Vd?@`d z1DPYmJxug2C}O9{d_w252TcWazjt9P&(D9wK+_AVj_VsO#XT)E5Ue`Ldc{=43XTZp z7B1t#OG6^Ksf|a*EgoW`Ns|BqhRagC-qb+X*w0*sUE}KBm2XxGTfn#-gz(ZOOtFve2=tN8JEy88d?niC zzZY=RpF`r;dK0!+JOKzD85*2KwSV} z{9tdXX}NsKc8kA&XzLmoFul>u%p% z7U-_3fu&B=!fAl6H&M9$7(S|Hwtv-w#`a3@1N_AL3v8jFrUz^IB3tT@K)XTyodE4^ z+wGZTRR~jHjA1jT^i$$uwHHdlc{Riuy@{^|q0KaO46Ju{IvMC>AmIvhN+{t1CJz4x X+B}K;!eZt#00000NkvXXu0mjfW4RTp literal 0 HcmV?d00001 diff --git a/JY.Inspection/Resouces/停止.png b/JY.Inspection/Resouces/停止.png new file mode 100644 index 0000000000000000000000000000000000000000..024bf521b6078b693f1cd766a962446825e3e982 GIT binary patch literal 985 zcmV;~119{5P)Px&lSxEDRA@upT03mhP!v7aO&wr>xhNk7syb~23k)#Pg*L!c@!Jp|iJ^di0Y=IQ z10bLS5>T=6sX76rEMFLX9zR+JK#!?ASivwc#XuY*AjUx4Iv@h_3>3grVB!J^Olk%5ODhhqDFAvbIs}CW z2sp?#m5bpJB(bP&PG+U#H&?9Lb8 zy2-l&$Rs0sh?V!Uj)Ih95_?m*(g!CWjsWK4YQI951kfF1U_NYT1!K53Z_d{0I0Dd< z>f^v#rH`nqLo&}J8CfrxY(ni_2Ijovtlx>~Ku@kX zWy@A&Ad~34OQ7>IhBU+UoFOuHY#BYFvWz@~@1=}C7hC|SSpv4p7-}B?ET#-|wL7k! zq8{(u1)`5K!CNxz0#J^RdAFAT^Ql}?cEEn04DAF^`NXKmK=dJqPlqD|^hnDW&s1eV zPpH;bG#Cm1z_ezVLsbA466&m|(G{fAoz5uL;5(@Vv z*5e^>qv0Q97U!ejb11ryz)qVxs(MlSxybFB1C=wNs*PG-^n`i?z!jM+v zb$m{*khQDJLOmcGD6+NLZOpcBZDqf?^iAgAAShi)1~;`*Mu6wdZe`XsRsxQ;WTmuD zAoNRp`7VT+Rw)Dc*HW#?95fRxRrUauATZ=aySpytD|Gr(Sr0+V3C3|Zy1g#5&<Px&Vo5|nR7gvmR$XWmR}}uvj6W!DH8=4gB1N0bL`+|bK4=m}!KY$hl-j;nDH_er zwxtQ8D1wTp_}~xf&c?)oC{i(PX$wB7Rs0wAMU0ren`mjP51Lt{B9dh9kvltUwsCiM zah_&4-#y>?yWbf?$WwK=*H*+|F!53XrU9r9;7=HMOu)&^*s(Ku!+_E8%&EOI+TVKw!j)eFIGqL3IdJAQOyjE8V%^U_ zJhi>o$|y8}R5KX!eKfGS-?4V*P0$A;Tv)b;( z>bB)Y+F%-n{j{Y?unm)aFa)ZhW_L^)|xQq6|THMz#;}6Pdl}%Mq`EB z`y-(C1Ki;`_Bxu}`Dms&G}H&ebuVf)lq!pGC1*3m#k6BBE`%3u>MX!Z3}w`jaHWp8 zlVL>DPEC6$g35SunIdDQ!RkbR%>JzqzS5O31`dO1J>^mcQ==EFy;h2#9J}t3Vd8?$ zQfJTuz&3d>@-$ZeDzyHIR3n%-02oL+);GnlReK&pRK$D%AgKxT%fFsu%`SF8bjs-% zL>maL0jAq?tWU#&2?DRy1Oov6D@LHB$wbUQOr{-*_^)h(`B2)ie<(@7n5YTv0jMuk zqKfw3&q=8>{^e0Tum3yyW*H^wBH^Zf2KehzP0rUS&#?-MWR5V`WDwd&B$CU)^h>ER z6>+&51g$yH1p1s8wSNsAQ-uba?B1;~G2tEve}`Q(k&vxm?DHKm9(pnBlY%8WD8~zv z&%q#5`^!qjh>8}Kigy^IV_vlO+oBWa%Dn*E0QiFE6I2~}RIM^YHvoKGj@T7-9#4G* z;#0^AVnnVJawRj4>%$)+*B>4IM~oSKa|o1zG$Fppl7prla3R!n2Y7Omt>R|@0000< KMNUMnLSTZOh`bR1 literal 0 HcmV?d00001 diff --git a/JY.Inspection/Resouces/切换.png b/JY.Inspection/Resouces/切换.png new file mode 100644 index 0000000000000000000000000000000000000000..3148fbe99ce08aafbfd12a2df4a01ab69f85c1ff GIT binary patch literal 681 zcmV;a0#^NrP)Px%V@X6oR7gw3l|N_{Q4q$z*)zsM&|OKTR(J0LDzQ4F5m74}wGpGFu@djzij7(d z21^x0-Mtelo1kZ>HdYp5B3yMr1G%>cf>;ILB8ZxVdn0=$@h3DRe(Pn&S7or7(r*9t zXx;JEJ1xbYL;%~bjS%RZmf~2P@o23Dz*>sf2V(o`6|pI4xBp3-M2=s(0brAs*{h3y zrsv=fVE)!Ez$pfIU^vvS7;OV=^VKs$G!_;zkE4yP_tX(<0}ktg7xoVP^k{ts8Fbtp^{k0TNe?N@cO#nZ%%wB5)bb6*u zN#X&~R-5q!`Cc;k(P9(quFyI}(CT?)-1d|t!ub@>9hz}>fBoxL5m&)m9;kGxfdEVg zwVN4VJo8VQopWCufQ4~}RS0Fe)apQdxhH7Xj;C&caGA+E5f;)fmPeO(;6w&^el};A zbHtPb$VyoxXYy$kCtdQ9`73i(fG3G)(w;{-xFlvfb=Lno^tNk P00000NkvXXu0mjf&_^}3 literal 0 HcmV?d00001 diff --git a/JY.Inspection/Resouces/切换1.png b/JY.Inspection/Resouces/切换1.png new file mode 100644 index 0000000000000000000000000000000000000000..2a4b2e3f77a54a6eb146b749e5dbfc76177ae919 GIT binary patch literal 546 zcmV+-0^R+IP)Px$+(|@1R7gv;RZUL9U=V%NH0sV;-3y73xKeI_H{b^15?BZ)5Ko{kz@_yB9zky) zZovfDYg2Y&ns3b1LP}|AEAlP-&G+8x{JbHgI7X*`3Zh+&P?m7TcmeaoX%u@&&nYgz zxEUJSj(Z8FD!{quI2wW2QeXO=)5<$hF_8pjchCfI1;9vB=-)fU-1=-3t#JGjf!Xa_ z0G+1^TjM(9)VZTZFd-v^9g_vfRl{G zj+*LuDZEEub_Q*bSJdDcE9Q!{qS+k?$zdiE#lAc{J zlw!bv;Gp?dA=A2>gc`b+g(JHnZ0i#>)pK*J@TXaJz-G*Drs`kp8vJP2i`BV%hf}g1 z$s)MtNKrZWcSAcvO(w+LOtms+gkIsd+$IR}yKz=M2E$U{`faAAAO0(8MO`C9F;3-9 kBlKLjBd2yOowxG*0HI&s>6*~Px%n@L1LR7gwJmETJgQ546&=k~)H*ySCQ(#nr58_s=v!p9gw6pkQPTZlbE!`iHK6syIhCAnT zzTb1sy@YjMw9fIdaR3GS>>fc&L(Fgq;ya08dB1dL%@imdW*rIK0@%&q;bdq>U`+vq zdh7u+?*!4zGI7sBP@BjLpmdmCK{%D@)$V3$2t_vy0-v-zT0H`^kiIXcMXGKx7-1%! zN`}h)e?t`AY$l+e7`ja;1#Bl~UKVZbGWTv`yq5qF>IfLLZFDF5w1^C%>d~Vh@e)iv zFyCmbQoTj0@D9HE4lATNpo|J+aKRV>>}P<8z(!aI7z|vNAOM1yj}Rf42$kPgJI&E+ z4MipO73%)lP%JwjJ$OoL${JY{A`CDgOh90nuum2=Z@{0KONqir1!o(+WSIn}nJe2x%f-LKLg~%Hdd<60KFKuys|qa^!y>W(R$2{)+cdH z%wz`y8j4DMndU$O`kG1{mpY!#JMAX{&4=BFzs8NW;W*w!vjeW5E-tR!U2tI4LCXYa zsrDEx)h@J;%;U|+g{&6!oGIQ`v#X$T1whr!5dckVdVR_RlF^;>H2q)b#s~ZWQay^t TRLw1U00000NkvXXu0mjfSVK$K literal 0 HcmV?d00001 diff --git a/JY.Inspection/Resouces/存储设备.png b/JY.Inspection/Resouces/存储设备.png new file mode 100644 index 0000000000000000000000000000000000000000..41fd3c5e5b67835483d1159e2887cebcf870b00d GIT binary patch literal 854 zcmV-c1F8IpP)Px&5J^NqR7gv`R?$n7Q5653yQQWx=V&!UVWu0El0-$&Ls=B|pkxpA9tg{cQbE+8 zPy`i) z3$c>3U^FnHDIM{8d&KAip+8?YefO(l-<-n72{vE*T+GF~7YyuKFNv1#1iYu2*x|{` zJ7(ep#x7sI(BZk3V67M#!;z_W+ra-JFx~O(f`mtFb((MjHKB91k13H&E?)}~t}vrY zQ-Ta2B8)KOYRGBpSr*ytFPn5&C)7siZEqtnodnRV^w&r>380sWABJ1)kK&E9lyg}F zA?t-c-<>2Jb;6RE2{i{C5HT5Gy_ksV3j#k{DniLZRAL!ja7ZZz z(uq7xz)Q(^EFj**#9}Z%vKah!sctsiNw!`eELt$+nRPPHEFt#`!U+Zr0VrA3MWwDU zy9u$uEY~p$P!N#81V)$vHUlWi6vNQfg`L|!q(m-tc{>TzuJO*Z!Wi5YcG^2qA}7(N z?%{(ZxQRJ#6*W1Md5F-*lKMhz)vuDVDUnGp4B^(Qcn2i9X}DHMX_p`i5tk{$TWNN2 zqhp#7;D8ju8*Z&0T8XeggXwZAw-GTLGxon67|T1PWks`R)NYo#VY{g5M80ZD-bs?DCxl zs0rYse@8^m0PYJpZMU+DZ0hutlTJ1RR3SkI5DcVNuptph5e7%VhzPZU$2cZ>Lmjs9 zM1y1!8R%D&%mTg233EAxa%7TdUYg_vEg~;ZFCz#czC*2vi#0>aE%7zORIeg1cY6#m z%6kgnKrU5h!M@h<;;~>`O(bO%1r;P)Px$`$EmXO|a5RaxdWOs?Mw-<=hOfq@%e)HbE_dUWf zFKYR(`q34`&GDi`0cCIfF_Rc> zC^=dbV13xT+PxU>t#$GMo33`FuxZI1K{<%#n0X*Cgoqlt=1k@W3=MQbPvNdFL2|_T8+1Dzd^j*8o z^W^1TZ>@Wmx`qX4fIuJqsYOYtDErZU2H(l1N&q``B_~?vaY{&x0r&)i_YnLHz=BqT z(;Z7ib@tmC^K*MuD|tETtm22u09NWsdL3y|&&zO}4DMUlI zgaMYaL#HsnzP!iVctk?j`ajRi>)gbXzmu_ay`e6=vo@)b37Dq`I++Eh&IoJSW=d6( zl^UWsV!l~-2N(AnsS<2nWAppQky1h8P(U165KWP34p|XQbn20=3mNPx&C`m*?R7gwRm0yTdbri=x=QnrV+RS#Z6ch!Db9ZZtGNK24ara3S6oOiaUNTUb zyCvaUz3eW&8yI`nATa1Hdr~O_p@Cr6kfH+n<6T)nQ9<|4*owNlGrtqR>&$d#-5p1v zm+sTO=XcKe+~4_~^Zf~#$3GOW!DAAUGf5%8tG?t;F4>RnPvZfT<9laI!l1F{N3o`UnPmR>U!#Z_Q7D$eU~omivj;CedaH9jgzDqg znqn5x+{J(y$AF&ESr<}gQ@O`Kh~8CFI@1W*wy{CtGkOWe-IS?D1Ix20k+DZvn>ax z+dfD2F+|?38Ezu-wW^&1*(Q*$*?&asNfon2V4xn{4q&D8YRmpV2Z-vf+2P(V+Nwpy zY3=yAcU9!beGl16WxeZ^2L-qeGwRLU7a(w4)&BgT05@>|VHe3MgiES=Mbs`hHE1;l zWrbf_2-ilSyS82yk&)R#{*Zq-?$;^?jpBoLC#h z#}syCd@n2JKq=gC*x95h2-#i=^WUztgPv%5o1ovgvziTqoqjYu1G-A!r&Mg=HQo3xg?E6oPt*~;Q}gsrIk9b?>e z`(0zuo*X~Bx+1HNXK$r;I;r6!jH2AIs>Skf?>#E;57qglzzEU#Hvj+t07*qoM6N<$ Ef`av&00000 literal 0 HcmV?d00001 diff --git a/JY.Inspection/Resouces/模块.png b/JY.Inspection/Resouces/模块.png new file mode 100644 index 0000000000000000000000000000000000000000..edd5912f1c05bdfb3410792ab329ab14568b60e4 GIT binary patch literal 1002 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 literal 0 HcmV?d00001 diff --git a/JY.Inspection/Resouces/系统构建.png b/JY.Inspection/Resouces/系统构建.png new file mode 100644 index 0000000000000000000000000000000000000000..8e125fa816298db78624fdf06a6c086ae4e3c598 GIT binary patch literal 832 zcmV-G1Hb%Px%`bk7VR7gwhm0d^_Q546|o!Obub!*(+5na=alzfQ9QWl~pg`ys;WKF>yv|b_% zf`sUy9(svN0$=(xf_&+Na@7qLOZ(n&$2 zOXXt-_#3=KmRvQN3;}OHhS?(2Jk&y!C)$<(LT^>w$+FvIt+7lYwHWo1b^o33$A9_jKRY%JNHl{uKtKT? z4KRk^VP#&Nsn5?9p4M2b*@MI%(G-JKElSqYU+XNfGab<0<$STNw$M5wVkpi>@S$&N z`o`Ih2Xw&wPj$9OFEJF@5Y%o5Xx-93s{<}R-aArMA<$v~U~?gYV+jT z<6)oyfr>Q^5&>s!R);h|ECrZkh&xY>XU%#J7my0hckh0H0g>tu0<2zbd0&zYAY+Mv z1qM+7NQu&jrXn;A?!N+gM9Bm*?DAIrHkv zm~LAk5zVnViiUutF%F7hF|mU7E@zH{mj=m%H0U@nD(ezmc(`YHL7`)6WSLZax%nNp zLL$8f!7xCs1q^%O5tlC1;yh&7gGdxX9uLMn*m-Ef_2r}Yw%>bNZ?dwenUm}Y2lWaV zmK|FDujoCJ9hV3Ir?^#7(mP-@|EbQ>z6bvraJm0~Kw1UYT%te0;8Q5BUD<{J0000< KMNUMnLSTaZ-gwCX literal 0 HcmV?d00001 diff --git a/JY.Inspection/Resouces/系统设置.png b/JY.Inspection/Resouces/系统设置.png new file mode 100644 index 0000000000000000000000000000000000000000..77fd481bfbaf1a2f833aebfcaafca792b0cedd4c GIT binary patch literal 888 zcmV-;1Bd*HP)Px&GD$>1R7gwJm03tsQ5?p9N6DEnv$526(t0YX1fz!*8tI`TDBBl(m=>aXundYY zq=l?#D2Fzr2#vJG9vWz&g36+x#d4$|2+B#@EU6o2&gkfgbFbI5CYv6DIxlz5z4v^- z|M#8$JtO$bL;PiZ{vE*JZ0Ys~n5-OIE!=#yU#ttqefJI)$s|q-pDvUs<&DjT`z$xv0t#}&)^!Eo?r7si|$r3|CWa$?t5)l`JyP=8NU?h`5 zK|%uJR?6yqnIxqSh4I^Ho|3|c>&La&ygTXRseqgksM?q#w>9SUt3z3z)9f^7vOY^#C2mc@k(3??Y#t>&Oor$kWlxw%rUNMd1#M(%%((? zcMBN4UT%M0N1l4=T#m6=YlNf(W0``b=ffMTV})7xzON;*cAq3;D!NuA!dB4fcg8WsxK6&VFAo|+S`(% zl`v`ujLrKFsLVGUR=oso4eaoA1DN5GyYD?`n(F_X^j7)E=o?M;6(v;b8|0L8lBX6C?^vy^}`p8pzRh*IVp;N-=jU&q z@%TP`?;`VKQ_-z1g2HP?bc=7sbGxYrt;@tuA8yE_B4)WfJ#QQfXQjd7Lj+=N1aoK7 zbL~{4KKEtVb)Lrh25fC@L@3DWJ9httW}CG&vn%A6r)kPYS^h>N_0ty|x~ibE%VF0_ zG7;E?;E@EOAY~QNwd>CGeov_w+x;g07$jhE%BCwD(U0hD-FC@De$nNbYe$)O4;dd_V|S;oSQF0p9=w2s0?z7RW#V O0000) literal 0 HcmV?d00001 diff --git a/JY.Inspection/Resouces/维修.png b/JY.Inspection/Resouces/维修.png new file mode 100644 index 0000000000000000000000000000000000000000..90b8a34a45c86d98f9639db5bc31d290a3808bdb GIT binary patch literal 826 zcmV-A1I7G_P)Px%^hrcPR7gveRzXr4K@@#|pv0XcW*?~ntFn@uAb5h{34%+;MdSqG2EsyI22UV4 zf#d}0*0D;mkBB=d$Ns6`(>=^IgPPd@P4|DVU%&r)2<9oD-uA%EilY9k{b^#yU;F%U z8a7@S-w9}%c~>5x^S50a+jS&g%7dFBK;P^j1ET_=pPuLfl~2Mh2tUmDBY=(gJD*L1 zomK)+9)w2#jsaW~bB~GS_ij9aCW_Vm>~QBQ4X`!1Z8G>Az@tZKD(03Uc&+Be2G*Z^ zsDdx+XzS#r#Y8{T$a?F*5i!1ks6TC21vGiegHQl>J;I)1)Ga|>eC>JLBf0?Kt9fzL zNEC|Z8){yx%sQ1>axR0AWf#++T5$kac03Jgbs?h|7a$sX;4{ULo%u3f2*dyjJv-B& z*0aSnPs5Sf#c}{D@6~k=4M zsF|S4E51te6v$YjeQOYolPoF^bX1FunFCJ&Yv!&6T{#4#PZ_+hH?K4E z!qM2ZYcCxs&QHabtk1-CaXqR>h$ioSZE?ZG?(Pf1KaL?LBzUz`UjP6A07*qoM6N<$ Ef<8!p8~^|S literal 0 HcmV?d00001 diff --git a/JY.Inspection/Resouces/设置.png b/JY.Inspection/Resouces/设置.png new file mode 100644 index 0000000000000000000000000000000000000000..e6bd915fe9ac0a57ffd2edd7222f6ade7073bc99 GIT binary patch literal 828 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 literal 0 HcmV?d00001 diff --git a/JY.Inspection/Resources/yiweidongli.png b/JY.Inspection/Resources/yiweidongli.png new file mode 100644 index 0000000000000000000000000000000000000000..25cfbea697e469351d0da4170c0fd73b8ab076c3 GIT binary patch literal 12576 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 literal 0 HcmV?d00001 diff --git a/JY.Inspection/Resources/三角感叹号32.png b/JY.Inspection/Resources/三角感叹号32.png new file mode 100644 index 0000000000000000000000000000000000000000..8803384a5f3044b77ca332ff52b91bf363d1344b GIT binary patch literal 559 zcmV+~0?_@5P)Px$=}AOER9HvtmOE<|Q51#O*9mH+SXijNb^%j_h~@`qt(A{L!3QL1BP!ae-~+Vq zQE452fC&)`19sZ0MT(%62JDvXaIakF-pTAaquj>R40q06>wL5BK4%7vc`)Yn^&g;9 z0=6B0AyDj7EVMl*>2|M&=7BpU{nQ0u^XdDeG=(An+fO8&tvvBl;9T1jS_9bLC+Ty| zLi>R)Z6Hbj-bp%Kv&bqi`Og4sACvUDVSyQ7DGSjm0oy+$ZErB&0CxO!0Ndv!J*pTl z_kJI(+`j-k&OoFRu)Ryt*Q#NE>-7($%KUENTN6YU;GU$*EdlNWS2_dOj*gGc9~un_ zMExYNx)nrY0=A>;qx(w$mVlXJ0NW=ey{I!tBoNY5z{^^Xx(VCcdMDnVjsWYD;)MJ; zGQ}+b79`zlYNF))Rp3?{!1h5&ACl(TvO~bfp`A2JZTp#|(+TGQjWJ|ALi-#z(+FVu zxTM9z;x~ZnQD-}@*Aki&z^lQ!p>1e;MbdP_EK1rW5cO|>BeejwXC)PVS|x#_Y!0~F zum7EZ?E{kDO4{4PtfX{J(iHG1#Df42BwZ|VEYLgzE>!{IBcl3RE$~iBmVwRVeK3KY xk|t8}?nUo`?|%Sv_bhX0d>fY8=2c?{_yqymogv%KNSFWs002ovPDHLkV1g#s{lfqN literal 0 HcmV?d00001 diff --git a/JY.Inspection/Resources/导入数据_操作_jurassic.png b/JY.Inspection/Resources/导入数据_操作_jurassic.png new file mode 100644 index 0000000000000000000000000000000000000000..5a5a40ba20670351e598f460def072736909ee22 GIT binary patch literal 718 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 literal 0 HcmV?d00001 diff --git a/JY.Inspection/Resources/数据导入.png b/JY.Inspection/Resources/数据导入.png new file mode 100644 index 0000000000000000000000000000000000000000..7e7233521c89de25f064cef23094af0c93638ad3 GIT binary patch literal 972 zcmV;-12g=IP)Px&hDk(0R9HvNS4(JAR~Y{ObEQqAHhoygoGe=USeQVexo1KOgQ%OjvLX~LeIT^S zPUj3tx+&B`SD`v*be9ki6)Ig6l`iZ?#f~V>y;EpuT-X+b&Y6IfR@x?M>Aios6DLk4 zcbuz+jCXm@|M<@NzyC!@_&q)9^>lTM?cm@|0=)>rvjF~HQ0H}E`i;TAfSl9wv*DTF zC)DjErm3A!Z|>@VfXE@l>qJ}xoMPa>pE)=<-Kg8UuiWqa7bq5#0V6};Z-XEx%p4hB zBG>Hio&cmSO@Zk(2r+K+gD2a8Z9JE`@-Bqo7>K{KCjCJx-If4S+WVfsUtyNU?Sz`W zALn&hIqG$zo5vWmvuf0ps}iPCmzIcvrbC;qXZteMm^Ow1X6o9tx?ad zgyUu#Qu}{ew)7B?*9qOL^xB*ldkjMs%4g?E=#_Yt(LfX3zB}yPVrstWo`~jIT6++NHDJwSOO< zAEK1@-x0tY7303YngIH=e=Gz}k<|W40?t;9d$bjRzO45a9Ga^fa=)(2M2vR8FI3D> ztlqss5ZUO{{%!`gk<5DKP=xQz literal 0 HcmV?d00001 diff --git a/JY.Inspection/Resources/白色X32.png b/JY.Inspection/Resources/白色X32.png new file mode 100644 index 0000000000000000000000000000000000000000..45ee56d099091658ee058d468d92373036103b76 GIT binary patch literal 604 zcmV-i0;BzjP)Px%7D+@wR9HvNmoZNkK@f(YH$tbxj*dcXtxQbRLZgL3VYCqbgEm?S(H{U&3T^a1 zD22pAw9sgQBqmn0YGG$*)DFy;N%qM1ExWgS@`dw~EiN}Z^W4nr?z^JrM?J@<8oX+g($AWos{$~y8^9tkRpS)+2HcnQq-5U;U}j^$3t*~jx*nH>VMDcdL1n4~|0 zK2iV=fICs3)$o435+G;4B55HDkg5BsB<}~z%?rUFI2QkX15g36 z8@$E#D{xZM54RZvxC%Vaq`1a$jZNeJnxwTD;306UrN(Umx&-$Sk0jlW0XBd$g(gb{ zqC<%q_a7vkjR8Ib(-mDl1Tkn|*`z+@i=^W*z%Sr%1%R9Ef#?w2=l_;;TmoJl&_;Aw((4$&CD&F$^>o=}YHVFCooFQ6&}kT?*W=t-P`T7f zhtbVJsg^p9UnV5jsE*@xNwXzA;5u--azpBBHXiH4oFp5i9&8|!y0A@@j#3vU_2AGd zNaZrbFoeI~o_-ghs qT+QA!lB<-es;gPa$$q}~4)7PA>$P0000Px&JV``BRA@u(nazt%Q5?s=-@kx=V1`(EFBA)kjS?0Xge;UY8I4j(SQsx+O3B+~ z7Ro|-DJhTCY&=CWHEKM>3K<(Kk(Jd?zv=E$iu(*_rBD7s=<>~K<0RK+0*J^003ZK>_}wJ$>bN5E8NmD; z4GT$rN`C*V0wOX5;7ZK^dr96g;(gvbhe=+|0=NO-V2uF#NZt+*uc0F(2eSZL0JhWw zu%G0uK=B&>gyhyNfDV9VH2@5d)Ju%6d7outOL|MP``@g05BvZy#{)o*vPl5v04(u{ zw?hU=jzo&rZa+!R&8mPez;=?4L}W1lok3rSA(Gb$h<5_`E};(qc9HA^KpY`?xuAIM zp1XuXHnF}h6k@^y;wZ^WC5U%!;?QGMy&Z*knFDc*CS-hs}w_UxoKXcCjgt}~+_!odZ zBwGqW@_hy3+ax#IvzrER9KdwhBie5R@vs8%n(_q63oZclJBwT=)q*(#V5Kp8BjzEq zi~B-jX0EwcN&`@|3T4iElFR>6KMSi6W~(H~HJQ1tYUP@}KGtHLrfx5c)8usmnB~-5 zbJtoV(5=@|wMM$`TFgc%9iWJaB7K85ago8Q=-YUJ YKYM3VK)Xxk!~g&Q07*qoM6N<$f|L1{HUIzs literal 0 HcmV?d00001 diff --git a/JY.Inspection/Resources/白色感叹号32.png b/JY.Inspection/Resources/白色感叹号32.png new file mode 100644 index 0000000000000000000000000000000000000000..f3b9ed8b710b5e30944b5f5ba26b900007e81900 GIT binary patch literal 594 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 literal 0 HcmV?d00001 diff --git a/JY.Inspection/Resources/错误提示图标32.png b/JY.Inspection/Resources/错误提示图标32.png new file mode 100644 index 0000000000000000000000000000000000000000..b67ab19a7846c5a098e33c6fb2a8df533914054f GIT binary patch literal 1073 zcmV-11kU@3P)Px&>q$gGR9HvFmwV`*V;ILjU*(V}tq9Rt{IN#LA#+-cl|m@Yp^>R!%QS7yiIqdv ze&mqDs8PmPp`8BNm}I6o{vkOuYW{GFKP*w|tMBW6e%-%k@ALlN*OaT?df)fCuj~5U z_kEon@jr`3^>6!dU?y-x`TPVlpN*0>j$(5t0NY0b=K<#c0T?7d0xturBz-s;%s>F! zdjdBA*8}-Js;mNTmGpC$Vkdy@8Nf3@cE2-{Q@BpjJN=CG1t`v=xW~?Tu5^C~E|;{f zZEptv+s6P~{v*e2GjrPz698=Q2YdnSGXUUA;1%FiU>oqAq(8IX_Cdh$z#QPp4jacw zdcS$r26zcLw?lC|aJQs;hB+PEM*~ZNi(Bj0NSe0;fbCO(4IRcm11^>H@i5NoHMZ|d z5VrKrkn~3W8$SWtPXm|raj-?wv7#zW}uLd5i)~}N^w}N=KiiyRN9&P|0 z?-R98Na~8@zD%}zJ8#MCra#zD57}IvKPhQJ1Mn7bN=xxfNv{vP`*M|^mIhU;jRTZ5 z>w(jNO_EOR0!VHjJc{#TJokTlrI&o4BPl7|6WdFG`+@C}_U;0BOwz(iDShEEV5+2* zgTP7I6ye)ulKF(?B8DmGJ{Rq$$ta*~w3|M=5f>}}u z(YSOCr8UGNNp*+oDVK`Zl-(80o%RDLqh98UsqN>3#`0W6t|W4Wq}8=@1u&kn9nQ}O zu94JkcD?13y_lpHB)F!f1OxZhZ#&89u2(VJdjU5CyGhDK)K?~bHM4yHa8)VQ2j-Ov zSS_jP>k|yyPE3pe9|5;XO3~?*NdX$o0+NY2y*vZ#U&&`6>6=eR`bft1g_7PJ8H=?=00000NkvXXu0mjf761bG literal 0 HcmV?d00001 diff --git a/JY.Inspection/ViewModel/FrmMesSettingVM.cs b/JY.Inspection/ViewModel/FrmMesSettingVM.cs new file mode 100644 index 0000000..3129022 --- /dev/null +++ b/JY.Inspection/ViewModel/FrmMesSettingVM.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.ComponentModel; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Inspection.ViewModel +{ + public class ObservableObject : INotifyPropertyChanged + { + public event PropertyChangedEventHandler PropertyChanged; + + protected void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + if (PropertyChanged != null) + { + PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); + } + } + } + + public class FrmMesSettingVM : ObservableObject + { + private string stationArrivalUrl; + + /// + /// Mes电池进站接口地址 + /// + public string StationArrivalUrl + { + get { return stationArrivalUrl; } + set { stationArrivalUrl = value; OnPropertyChanged(); } + } + + private string stationExitUrl; + + /// + /// Mes电池出站接口地址 + /// + public string StationExitUrl + { + get { return stationExitUrl; } + set { stationExitUrl = value; OnPropertyChanged(); } + } + + private string productType; + + /// + /// 产品型号 + /// + public string ProductType + { + get { return productType; } + set { productType = value; OnPropertyChanged(); } + } + } +} diff --git a/JY.Inspection/appini.manifest b/JY.Inspection/appini.manifest new file mode 100644 index 0000000..60a45a2 --- /dev/null +++ b/JY.Inspection/appini.manifest @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/JY.Inspection/log4net.xml b/JY.Inspection/log4net.xml new file mode 100644 index 0000000..ac8ed2c --- /dev/null +++ b/JY.Inspection/log4net.xml @@ -0,0 +1,32444 @@ + + + + log4net + + + + + Appender that logs to a database. + + + + appends logging events to a table within a + database. The appender can be configured to specify the connection + string by setting the property. + The connection type (provider) can be specified by setting the + property. For more information on database connection strings for + your specific database see http://www.connectionstrings.com/. + + + Records are written into the database either using a prepared + statement or a stored procedure. The property + is set to (System.Data.CommandType.Text) to specify a prepared statement + or to (System.Data.CommandType.StoredProcedure) to specify a stored + procedure. + + + The prepared statement text or the name of the stored procedure + must be set in the property. + + + The prepared statement or stored procedure can take a number + of parameters. Parameters are added using the + method. This adds a single to the + ordered list of parameters. The + type may be subclassed if required to provide database specific + functionality. The specifies + the parameter name, database type, size, and how the value should + be generated using a . + + + + An example of a SQL Server table that could be logged to: + + CREATE TABLE [dbo].[Log] ( + [ID] [int] IDENTITY (1, 1) NOT NULL , + [Date] [datetime] NOT NULL , + [Thread] [varchar] (255) NOT NULL , + [Level] [varchar] (20) NOT NULL , + [Logger] [varchar] (255) NOT NULL , + [Message] [varchar] (4000) NOT NULL + ) ON [PRIMARY] + + + + An example configuration to log to the above table: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Julian Biddle + Nicko Cadell + Gert Driesen + Lance Nehring + + + + Initializes a new instance of the class. + + + Public default constructor to initialize a new instance of this class. + + + + + Gets or sets the database connection string that is used to connect to + the database. + + + The database connection string used to connect to the database. + + + + The connections string is specific to the connection type. + See for more information. + + + Connection string for MS Access via ODBC: + "DSN=MS Access Database;UID=admin;PWD=;SystemDB=C:\data\System.mdw;SafeTransactions = 0;FIL=MS Access;DriverID = 25;DBQ=C:\data\train33.mdb" + + Another connection string for MS Access via ODBC: + "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Work\cvs_root\log4net-1.2\access.mdb;UID=;PWD=;" + + Connection string for MS Access via OLE DB: + "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;" + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + This property requires at least .NET 2.0. + + + + + Gets or sets the type name of the connection + that should be created. + + + The type name of the connection. + + + + The type name of the ADO.NET provider to use. + + + The default is to use the OLE DB provider. + + + Use the OLE DB Provider. This is the default value. + System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the MS SQL Server Provider. + System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the ODBC Provider. + Microsoft.Data.Odbc.OdbcConnection,Microsoft.Data.Odbc,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for ODBC .NET Data Provider. + + Use the Oracle Provider. + System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for .NET Managed Provider for Oracle. + + + + + Gets or sets the command text that is used to insert logging events + into the database. + + + The command text used to insert logging events into the database. + + + + Either the text of the prepared statement or the + name of the stored procedure to execute to write into + the database. + + + The property determines if + this text is a prepared statement or a stored procedure. + + + If this property is not set, the command text is retrieved by invoking + . + + + + + + Gets or sets the command type to execute. + + + The command type to execute. + + + + This value may be either (System.Data.CommandType.Text) to specify + that the is a prepared statement to execute, + or (System.Data.CommandType.StoredProcedure) to specify that the + property is the name of a stored procedure + to execute. + + + The default value is (System.Data.CommandType.Text). + + + + + + Should transactions be used to insert logging events in the database. + + + true if transactions should be used to insert logging events in + the database, otherwise false. The default value is true. + + + + Gets or sets a value that indicates whether transactions should be used + to insert logging events in the database. + + + When set a single transaction will be used to insert the buffered events + into the database. Otherwise each event will be inserted without using + an explicit transaction. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Should this appender try to reconnect to the database on error. + + + true if the appender should try to reconnect to the database after an + error has occurred, otherwise false. The default value is false, + i.e. not to try to reconnect. + + + + The default behaviour is for the appender not to try to reconnect to the + database if an error occurs. Subsequent logging events are discarded. + + + To force the appender to attempt to reconnect to the database set this + property to true. + + + When the appender attempts to connect to the database there may be a + delay of up to the connection timeout specified in the connection string. + This delay will block the calling application's thread. + Until the connection can be reestablished this potential delay may occur multiple times. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to insert + logging events into a database. Classes deriving from + can use this property to get or set this . Use the + underlying returned from if + you require access beyond that which provides. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Override the parent method to close the database + + + + Closes the database command and database connection. + + + + + + Inserts the events into the database. + + The events to insert into the database. + + + Insert all the events specified in the + array into the database. + + + + + + Adds a parameter to the command. + + The parameter to add to the command. + + + Adds a parameter to the ordered list of command parameters. + + + + + + Writes the events to the database using the transaction specified. + + The transaction that the events will be executed under. + The array of events to insert into the database. + + + The transaction argument can be null if the appender has been + configured not to use transactions. See + property for more information. + + + + + + Formats the log message into database statement text. + + The event being logged. + + This method can be overridden by subclasses to provide + more control over the format of the database statement. + + + Text that can be passed to a . + + + + + Creates an instance used to connect to the database. + + + This method is called whenever a new IDbConnection is needed (i.e. when a reconnect is necessary). + + The of the object. + The connectionString output from the ResolveConnectionString method. + An instance with a valid connection string. + + + + Resolves the connection string from the ConnectionString, ConnectionStringName, or AppSettingsKey + property. + + + ConnectiongStringName is only supported on .NET 2.0 and higher. + + Additional information describing the connection string. + A connection string used to connect to the database. + + + + Retrieves the class type of the ADO.NET provider. + + + + Gets the Type of the ADO.NET provider to use to connect to the + database. This method resolves the type specified in the + property. + + + Subclasses can override this method to return a different type + if necessary. + + + The of the ADO.NET provider + + + + Connects to the database. + + + + + Cleanup the existing connection. + + + Calls the IDbConnection's method. + + + + + The list of objects. + + + + The list of objects. + + + + + + The security context to use for privileged calls + + + + + The that will be used + to insert logging events into a database. + + + + + Database connection string. + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + + + String type name of the type name. + + + + + The text of the command. + + + + + The command type. + + + + + Indicates whether to use transactions when writing to the database. + + + + + Indicates whether to reconnect when a connection is lost. + + + + + The fully qualified type of the AdoNetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Parameter type used by the . + + + + This class provides the basic database parameter properties + as defined by the interface. + + This type can be subclassed to provide database specific + functionality. The two methods that are called externally are + and . + + + + + + Initializes a new instance of the class. + + + Default constructor for the AdoNetAppenderParameter class. + + + + + Gets or sets the name of this parameter. + + + The name of this parameter. + + + + The name of this parameter. The parameter name + must match up to a named parameter to the SQL stored procedure + or prepared statement. + + + + + + Gets or sets the database type for this parameter. + + + The database type for this parameter. + + + + The database type for this parameter. This property should + be set to the database type from the + enumeration. See . + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the type from the value. + + + + + + + Gets or sets the precision for this parameter. + + + The precision for this parameter. + + + + The maximum number of digits used to represent the Value. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the precision from the value. + + + + + + + Gets or sets the scale for this parameter. + + + The scale for this parameter. + + + + The number of decimal places to which Value is resolved. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the scale from the value. + + + + + + + Gets or sets the size for this parameter. + + + The size for this parameter. + + + + The maximum size, in bytes, of the data within the column. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the size from the value. + + + For BLOB data types like VARCHAR(max) it may be impossible to infer the value automatically, use -1 as the size in this case. + + + + + + + Gets or sets the to use to + render the logging event into an object for this + parameter. + + + The used to render the + logging event into an object for this parameter. + + + + The that renders the value for this + parameter. + + + The can be used to adapt + any into a + for use in the property. + + + + + + Prepare the specified database command object. + + The command to prepare. + + + Prepares the database command object by adding + this parameter to its collection of parameters. + + + + + + Renders the logging event and set the parameter value in the command. + + The command containing the parameter. + The event to be rendered. + + + Renders the logging event using this parameters layout + object. Sets the value of the parameter on the command object. + + + + + + The name of this parameter. + + + + + The database type for this parameter. + + + + + Flag to infer type rather than use the DbType + + + + + The precision for this parameter. + + + + + The scale for this parameter. + + + + + The size for this parameter. + + + + + The to use to render the + logging event into an object for this parameter. + + + + + Appends logging events to the terminal using ANSI color escape sequences. + + + + AnsiColorTerminalAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific level of message to be set. + + + This appender expects the terminal to understand the VT100 control set + in order to interpret the color codes. If the terminal or console does not + understand the control codes the behavior is not defined. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + When configuring the ANSI colored terminal appender, a mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + + These color values cannot be combined together to make new colors. + + + The attributes can be any combination of the following: + + Brightforeground is brighter + Dimforeground is dimmer + Underscoremessage is underlined + Blinkforeground is blinking (does not work on all terminals) + Reverseforeground and background are reversed + Hiddenoutput is hidden + Strikethroughmessage has a line through it + + While any of these attributes may be combined together not all combinations + work well together, for example setting both Bright and Dim attributes makes + no sense. + + + Patrick Wagstrom + Nicko Cadell + + + + The enum of possible display attributes + + + + The following flags can be combined together to + form the ANSI color attributes. + + + + + + + text is bright + + + + + text is dim + + + + + text is underlined + + + + + text is blinking + + + Not all terminals support this attribute + + + + + text and background colors are reversed + + + + + text is hidden + + + + + text is displayed with a strikethrough + + + + + text color is light + + + + + The enum of possible foreground or background color values for + use with the color mapping method + + + + The output can be in one for the following ANSI colors. + + + + + + + color is black + + + + + color is red + + + + + color is green + + + + + color is yellow + + + + + color is blue + + + + + color is magenta + + + + + color is cyan + + + + + color is white + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colours + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + Ansi code to reset terminal + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level + + + + + + The color attributes for the specified level + + + + Required property. + The color attributes for the specified level + + + + + + Initialize the options for the object + + + + Combine the and together + and append the attributes. + + + + + + The combined , and + suitable for setting the ansi terminal color. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a AppenderCollection instance. + + list to create a readonly wrapper arround + + An AppenderCollection wrapper that is read-only. + + + + + An empty readonly static AppenderCollection + + + + + Initializes a new instance of the AppenderCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the AppenderCollection class + that has the specified initial capacity. + + + The number of elements that the new AppenderCollection is initially capable of storing. + + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified AppenderCollection. + + The AppenderCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + + Gets the number of elements actually contained in the AppenderCollection. + + + + + Copies the entire AppenderCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire AppenderCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the AppenderCollection. + + The to be added to the end of the AppenderCollection. + The index at which the value has been added. + + + + Removes all elements from the AppenderCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the AppenderCollection. + + The to check for. + true if is found in the AppenderCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the AppenderCollection. + + The to locate in the AppenderCollection. + + The zero-based index of the first occurrence of + in the entire AppenderCollection, if found; otherwise, -1. + + + + + Inserts an element into the AppenderCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the AppenderCollection. + + The to remove from the AppenderCollection. + + The specified was not found in the AppenderCollection. + + + + + Removes the element at the specified index of the AppenderCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the AppenderCollection. + + An for the entire AppenderCollection. + + + + Gets or sets the number of elements the AppenderCollection can contain. + + + + + Adds the elements of another AppenderCollection to the current AppenderCollection. + + The AppenderCollection whose elements should be added to the end of the current AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a array to the current AppenderCollection. + + The array whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a collection to the current AppenderCollection. + + The collection whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Sets the capacity to the actual number of elements. + + + + + Return the collection elements as an array + + the array + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Abstract base class implementation of . + + + + This class provides the code for common functionality, such + as support for threshold filtering and support for general filters. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + Empty default constructor + + + + + Finalizes this appender by calling the implementation's + method. + + + + If this appender has not been closed then the Finalize method + will call . + + + + + + Gets or sets the threshold of this appender. + + + The threshold of the appender. + + + + All log events with lower level than the threshold level are ignored + by the appender. + + + In configuration files this option is specified by setting the + value of the option to a level + string, such as "DEBUG", "INFO" and so on. + + + + + + Gets or sets the for this appender. + + The of the appender + + + The provides a default + implementation for the property. + + + + + + The filter chain. + + The head of the filter chain filter chain. + + + Returns the head Filter. The Filters are organized in a linked list + and so all Filters on this Appender are available through the result. + + + + + + Gets or sets the for this appender. + + The layout of the appender. + + + See for more information. + + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + + The name uniquely identifies the appender. + + + + + + Closes the appender and release resources. + + + + Release any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + This method cannot be overridden by subclasses. This method + delegates the closing of the appender to the + method which must be overridden in the subclass. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The event to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the abstract method. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The array of events to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the method. + + + + + + Test if the logging event should we output by this appender + + the event to test + true if the event should be output, false if the event should be ignored + + + This method checks the logging event against the threshold level set + on this appender and also against the filters specified on this + appender. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + + + + + Adds a filter to the end of the filter chain. + + the filter to add to this appender + + + The Filters are organized in a linked list. + + + Setting this property causes the new filter to be pushed onto the + back of the filter chain. + + + + + + Clears the filter list for this appender. + + + + Clears the filter list for this appender. + + + + + + Checks if the message level is below this appender's threshold. + + to test against. + + + If there is no threshold set, then the return value is always true. + + + + true if the meets the + requirements of this appender. + + + + + Is called when the appender is closed. Derived classes should override + this method if resources need to be released. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Subclasses of should implement this method + to perform actual logging. + + The event to append. + + + A subclass must implement this method to perform + logging of the . + + This method will be called by + if all the conditions listed for that method are met. + + + To restrict the logging of events in the appender + override the method. + + + + + + Append a bulk array of logging events. + + the array of logging events + + + This base class implementation calls the + method for each element in the bulk array. + + + A sub class that can better process a bulk array of events should + override this method in addition to . + + + + + + Called before as a precondition. + + + + This method is called by + before the call to the abstract method. + + + This method can be overridden in a subclass to extend the checks + made before the event is passed to the method. + + + A subclass should ensure that they delegate this call to + this base class if it is overridden. + + + true if the call to should proceed. + + + + Renders the to a string. + + The event to render. + The event rendered as a string. + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Where possible use the alternative version of this method + . + That method streams the rendering onto an existing Writer + which can give better performance if the caller already has + a open and ready for writing. + + + + + + Renders the to a string. + + The event to render. + The TextWriter to write the formatted event to + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Use this method in preference to + where possible. If, however, the caller needs to render the event + to a string then does + provide an efficient mechanism for doing so. + + + + + + Tests if this appender requires a to be set. + + + + In the rather exceptional case, where the appender + implementation admits a layout but can also work without it, + then the appender should return true. + + + This default implementation always returns false. + + + + true if the appender requires a layout object, otherwise false. + + + + + Flushes any buffered log data. + + + This implementation doesn't flush anything and always returns true + + True if all logging events were flushed successfully, else false. + + + + The layout of this appender. + + + See for more information. + + + + + The name of this appender. + + + See for more information. + + + + + The level threshold of this appender. + + + + There is no level threshold filtering by default. + + + See for more information. + + + + + + It is assumed and enforced that errorHandler is never null. + + + + It is assumed and enforced that errorHandler is never null. + + + See for more information. + + + + + + The first filter in the filter chain. + + + + Set to null initially. + + + See for more information. + + + + + + The last filter in the filter chain. + + + See for more information. + + + + + Flag indicating if this appender is closed. + + + See for more information. + + + + + The guard prevents an appender from repeatedly calling its own DoAppend method + + + + + StringWriter used to render events + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + The fully qualified type of the AppenderSkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + + Appends log events to the ASP.NET system. + + + + + Diagnostic information and tracing messages that you specify are appended to the output + of the page that is sent to the requesting browser. Optionally, you can view this information + from a separate trace viewer (Trace.axd) that displays trace information for every page in a + given application. + + + Trace statements are processed and displayed only when tracing is enabled. You can control + whether tracing is displayed to a page, to the trace viewer, or both. + + + The logging event is passed to the or + method depending on the level of the logging event. + The event's logger name is the default value for the category parameter of the Write/Warn method. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Write the logging event to the ASP.NET trace + + the event to log + + + Write the logging event to the ASP.NET trace + HttpContext.Current.Trace + (). + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + + + Defaults to %logger + + + + + Abstract base class implementation of that + buffers events in a fixed size buffer. + + + + This base class should be used by appenders that need to buffer a + number of events before logging them. + For example the + buffers events and then submits the entire contents of the buffer to + the underlying database in one go. + + + Subclasses should override the + method to deliver the buffered events. + + The BufferingAppenderSkeleton maintains a fixed size cyclic + buffer of events. The size of the buffer is set using + the property. + + A is used to inspect + each event as it arrives in the appender. If the + triggers, then the current buffer is sent immediately + (see ). Otherwise the event + is stored in the buffer. For example, an evaluator can be used to + deliver the events immediately when an ERROR event arrives. + + + The buffering appender can be configured in a mode. + By default the appender is NOT lossy. When the buffer is full all + the buffered events are sent with . + If the property is set to true then the + buffer will not be sent when it is full, and new events arriving + in the appender will overwrite the oldest event in the buffer. + In lossy mode the buffer will only be sent when the + triggers. This can be useful behavior when you need to know about + ERROR events but not about events with a lower level, configure an + evaluator that will trigger when an ERROR event arrives, the whole + buffer will be sent which gives a history of events leading up to + the ERROR event. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Protected default constructor to allow subclassing. + + + + + + Initializes a new instance of the class. + + the events passed through this appender must be + fixed by the time that they arrive in the derived class' SendBuffer method. + + + Protected constructor to allow subclassing. + + + The should be set if the subclass + expects the events delivered to be fixed even if the + is set to zero, i.e. when no buffering occurs. + + + + + + Gets or sets a value that indicates whether the appender is lossy. + + + true if the appender is lossy, otherwise false. The default is false. + + + + This appender uses a buffer to store logging events before + delivering them. A triggering event causes the whole buffer + to be send to the remote sink. If the buffer overruns before + a triggering event then logging events could be lost. Set + to false to prevent logging events + from being lost. + + If is set to true then an + must be specified. + + + + + Gets or sets the size of the cyclic buffer used to hold the + logging events. + + + The size of the cyclic buffer used to hold the logging events. + + + + The option takes a positive integer + representing the maximum number of logging events to collect in + a cyclic buffer. When the is reached, + oldest events are deleted as new events are added to the + buffer. By default the size of the cyclic buffer is 512 events. + + + If the is set to a value less than + or equal to 1 then no buffering will occur. The logging event + will be delivered synchronously (depending on the + and properties). Otherwise the event will + be buffered. + + + + + + Gets or sets the that causes the + buffer to be sent immediately. + + + The that causes the buffer to be + sent immediately. + + + + The evaluator will be called for each event that is appended to this + appender. If the evaluator triggers then the current buffer will + immediately be sent (see ). + + If is set to true then an + must be specified. + + + + + Gets or sets the value of the to use. + + + The value of the to use. + + + + The evaluator will be called for each event that is discarded from this + appender. If the evaluator triggers then the current buffer will immediately + be sent (see ). + + + + + + Gets or sets a value indicating if only part of the logging event data + should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the + event data to be fixed and serialized. This will improve performance. + + + See for more information. + + + + + + Gets or sets a the fields that will be fixed in the event + + + The event fields that will be fixed before the event is buffered + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Flush the currently buffered events + + + + Flushes any events that have been buffered. + + + If the appender is buffering in mode then the contents + of the buffer will NOT be flushed to the appender. + + + + + + Flush the currently buffered events + + set to true to flush the buffer of lossy events + + + Flushes events that have been buffered. If is + false then events will only be flushed if this buffer is non-lossy mode. + + + If the appender is buffering in mode then the contents + of the buffer will only be flushed if is true. + In this case the contents of the buffer will be tested against the + and if triggering will be output. All other buffered + events will be discarded. + + + If is true then the buffer will always + be emptied by calling this method. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Close this appender instance. + + + + Close this appender instance. If this appender is marked + as not then the remaining events in + the buffer must be sent when the appender is closed. + + + + + + This method is called by the method. + + the event to log + + + Stores the in the cyclic buffer. + + + The buffer will be sent (i.e. passed to the + method) if one of the following conditions is met: + + + + The cyclic buffer is full and this appender is + marked as not lossy (see ) + + + An is set and + it is triggered for the + specified. + + + + Before the event is stored in the buffer it is fixed + (see ) to ensure that + any data referenced by the event will be valid when the buffer + is processed. + + + + + + Sends the contents of the buffer. + + The first logging event. + The buffer containing the events that need to be send. + + + The subclass must override . + + + + + + Sends the events. + + The events that need to be send. + + + The subclass must override this method to process the buffered events. + + + + + + The default buffer size. + + + The default size of the cyclic buffer used to store events. + This is set to 512 by default. + + + + + The size of the cyclic buffer used to hold the logging events. + + + Set to by default. + + + + + The cyclic buffer used to store the logging events. + + + + + The triggering event evaluator that causes the buffer to be sent immediately. + + + The object that is used to determine if an event causes the entire + buffer to be sent immediately. This field can be null, which + indicates that event triggering is not to be done. The evaluator + can be set using the property. If this appender + has the ( property) set to + true then an must be set. + + + + + Indicates if the appender should overwrite events in the cyclic buffer + when it becomes full, or if the buffer should be flushed when the + buffer is full. + + + If this field is set to true then an must + be set. + + + + + The triggering event evaluator filters discarded events. + + + The object that is used to determine if an event that is discarded should + really be discarded or if it should be sent to the appenders. + This field can be null, which indicates that all discarded events will + be discarded. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + The events delivered to the subclass must be fixed. + + + + + Buffers events and then forwards them to attached appenders. + + + + The events are buffered in this appender until conditions are + met to allow the appender to deliver the events to the attached + appenders. See for the + conditions that cause the buffer to be sent. + + The forwarding appender can be used to specify different + thresholds and filters for the same appender at different locations + within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Send the events. + + The events that need to be send. + + + Forwards the events to the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this buffering appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Appends logging events to the console. + + + + ColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes directly to the application's attached console + not to the System.Console.Out or System.Console.Error TextWriter. + The System.Console.Out and System.Console.Error streams can be + programmatically redirected (for example NUnit does this to capture program output). + This appender will ignore these redirections because it needs to use Win32 + API calls to colorize the output. To respect these redirections the + must be used. + + + When configuring the colored console appender, mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + combination of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + HighIntensity + + + + Rick Hobbs + Nicko Cadell + + + + The enum of possible color values for use with the color mapping method + + + + The following flags can be combined together to + form the colors. + + + + + + + color is blue + + + + + color is green + + + + + color is red + + + + + color is white + + + + + color is yellow + + + + + color is purple + + + + + color is cyan + + + + + color is intensified + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + The console output stream writer to write to + + + + This writer is not thread safe. + + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level. + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level. + + + + + + Initialize the options for the object + + + + Combine the and together. + + + + + + The combined and suitable for + setting the console color. + + + + + Appends logging events to the console. + + + + ConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + debug system. + + + Events are written using the + method. The event's logger name is passed as the value for the category name to the Write method. + + + Nicko Cadell + + + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + Formats the category parameter sent to the Debug method. + + + + Defaults to a with %logger as the pattern which will use the logger name of the current + as the category parameter. + + + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + If is true then the + is called. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Defaults to a with %logger as the pattern. + + + + + Writes events to the system event log. + + + + The appender will fail if you try to write using an event source that doesn't exist unless it is running with local administrator privileges. + See also http://logging.apache.org/log4net/release/faq.html#trouble-EventLog + + + The EventID of the event log entry can be + set using the EventID property () + on the . + + + The Category of the event log entry can be + set using the Category property () + on the . + + + There is a limit of 32K characters for an event log message + + + When configuring the EventLogAppender a mapping can be + specified to map a logging level to an event log entry type. For example: + + + <mapping> + <level value="ERROR" /> + <eventLogEntryType value="Error" /> + </mapping> + <mapping> + <level value="DEBUG" /> + <eventLogEntryType value="Information" /> + </mapping> + + + The Level is the standard log4net logging level and eventLogEntryType can be any value + from the enum, i.e.: + + Erroran error event + Warninga warning event + Informationan informational event + + + + Aspi Havewala + Douglas de la Torre + Nicko Cadell + Gert Driesen + Thomas Voss + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class + with the specified . + + The to use with this appender. + + + Obsolete constructor. + + + + + + The name of the log where messages will be stored. + + + The string name of the log where messages will be stored. + + + This is the name of the log as it appears in the Event Viewer + tree. The default value is to log into the Application + log, this is where most applications write their events. However + if you need a separate log for your application (or applications) + then you should set the appropriately. + This should not be used to distinguish your event log messages + from those of other applications, the + property should be used to distinguish events. This property should be + used to group together events into a single log. + + + + + + Property used to set the Application name. This appears in the + event logs when logging. + + + The string used to distinguish events from different sources. + + + Sets the event log source property. + + + + + This property is used to return the name of the computer to use + when accessing the event logs. Currently, this is the current + computer, denoted by a dot "." + + + The string name of the machine holding the event log that + will be logged into. + + + This property cannot be changed. It is currently set to '.' + i.e. the local machine. This may be changed in future. + + + + + Add a mapping of level to - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the event log entry type for a level. + + + + + + Gets or sets the used to write to the EventLog. + + + The used to write to the EventLog. + + + + The system security context used to write to the EventLog. + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the EventId to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The EventID of the event log entry will normally be + set using the EventID property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + Gets or sets the Category to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The Category of the event log entry will normally be + set using the Category property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create an event log source + + + Uses different API calls under NET_2_0 + + + + + This method is called by the + method. + + the event to log + + Writes the event to the system event log using the + . + + If the event has an EventID property (see ) + set then this integer will be used as the event log event id. + + + There is a limit of 32K characters for an event log message + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Get the equivalent for a + + the Level to convert to an EventLogEntryType + The equivalent for a + + Because there are fewer applicable + values to use in logging levels than there are in the + this is a one way mapping. There is + a loss of information during the conversion. + + + + + The log name is the section in the event logs where the messages + are stored. + + + + + Name of the application to use when logging. This appears in the + application column of the event log named by . + + + + + The name of the machine which holds the event log. This is + currently only allowed to be '.' i.e. the current machine. + + + + + Mapping from level object to EventLogEntryType + + + + + The security context to use for privileged calls + + + + + The event ID to use unless one is explicitly specified via the LoggingEvent's properties. + + + + + The event category to use unless one is explicitly specified via the LoggingEvent's properties. + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and its event log entry type. + + + + + + The for this entry + + + + Required property. + The for this entry + + + + + + The fully qualified type of the EventLogAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The maximum size supported by default. + + + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx + The 32766 documented max size is two bytes shy of 32K (I'm assuming 32766 + may leave space for a two byte null terminator of #0#0). The 32766 max + length is what the .NET 4.0 source code checks for, but this is WRONG! + Strings with a length > 31839 on Windows Vista or higher can CORRUPT + the event log! See: System.Diagnostics.EventLogInternal.InternalWriteEvent() + for the use of the 32766 max size. + + + + + The maximum size supported by a windows operating system that is vista + or newer. + + + See ReportEvent API: + http://msdn.microsoft.com/en-us/library/aa363679(VS.85).aspx + ReportEvent's lpStrings parameter: + "A pointer to a buffer containing an array of + null-terminated strings that are merged into the message before Event Viewer + displays the string to the user. This parameter must be a valid pointer + (or NULL), even if wNumStrings is zero. Each string is limited to 31,839 characters." + + Going beyond the size of 31839 will (at some point) corrupt the event log on Windows + Vista or higher! It may succeed for a while...but you will eventually run into the + error: "System.ComponentModel.Win32Exception : A device attached to the system is + not functioning", and the event log will then be corrupt (I was able to corrupt + an event log using a length of 31877 on Windows 7). + + The max size for Windows Vista or higher is documented here: + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx. + Going over this size may succeed a few times but the buffer will overrun and + eventually corrupt the log (based on testing). + + The maxEventMsgSize size is based on the max buffer size of the lpStrings parameter of the ReportEvent API. + The documented max size for EventLog.WriteEntry for Windows Vista and higher is 31839, but I'm leaving room for a + terminator of #0#0, as we cannot see the source of ReportEvent (though we could use an API monitor to examine the + buffer, given enough time). + + + + + The maximum size that the operating system supports for + a event log message. + + + Used to determine the maximum string length that can be written + to the operating system event log and eventually truncate a string + that exceeds the limits. + + + + + This method determines the maximum event log message size allowed for + the current environment. + + + + + + Appends logging events to a file. + + + + Logging events are sent to the file specified by + the property. + + + The file can be opened in either append or overwrite mode + by specifying the property. + If the file path is relative it is taken as relative from + the application base directory. The file encoding can be + specified by setting the property. + + + The layout's and + values will be written each time the file is opened and closed + respectively. If the property is + then the file may contain multiple copies of the header and footer. + + + This appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + The supports pluggable file locking models via + the property. + The default behavior, implemented by + is to obtain an exclusive write lock on the file until this appender is closed. + The alternative models only hold a + write lock while the appender is writing a logging event () + or synchronize by using a named system wide Mutex (). + + + All locking strategies have issues and you should seriously consider using a different strategy that + avoids having multiple processes logging to the same file. + + + Nicko Cadell + Gert Driesen + Rodrigo B. de Oliveira + Douglas de la Torre + Niall Daley + + + + Write only that uses the + to manage access to an underlying resource. + + + + + True asynchronous writes are not supported, the implementation forces a synchronous write. + + + + + Locking model base class + + + + Base class for the locking models available to the derived loggers. + + + + + + Open the output file + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Gets or sets the for this LockingModel + + + The for this LockingModel + + + + The file appender this locking model is attached to and working on + behalf of. + + + The file appender is used to locate the security context and the error handler to use. + + + The value of this property will be set before is + called. + + + + + + Helper method that creates a FileStream under CurrentAppender's SecurityContext. + + + + Typically called during OpenFile or AcquireLock. + + + If the directory portion of the does not exist, it is created + via Directory.CreateDirecctory. + + + + + + + + + + Helper method to close under CurrentAppender's SecurityContext. + + + Does not set to null. + + + + + + Hold an exclusive lock on the output file + + + + Open the file once for writing and hold it open until is called. + Maintains an exclusive lock on the file during this time. + + + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Release the lock on the file + + + + Does nothing. The lock will be released when the file is closed. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquires the file lock for each write + + + + Opens the file once for each / cycle, + thus holding the lock for the minimal amount of time. This method of locking + is considerably slower than but allows + other processes to move/delete the log file whilst logging continues. + + + + + + Prepares to open the file when the first message is logged. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Provides cross-process file locking. + + Ron Grabowski + Steve Wranovsky + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + - and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Releases the lock and allows others to acquire a lock. + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Default constructor + + + + Default constructor + + + + + + Construct a new appender using the layout, file and append mode. + + the layout to use with this appender + the full path to the file to write to + flag to indicate if the file should be appended to + + + Obsolete constructor. + + + + + + Construct a new appender using the layout and file specified. + The file will be appended to. + + the layout to use with this appender + the full path to the file to write to + + + Obsolete constructor. + + + + + + Gets or sets the path to the file that logging will be written to. + + + The path to the file that logging will be written to. + + + + If the path is relative it is taken as relative from + the application base directory. + + + + + + Gets or sets a flag that indicates whether the file should be + appended to or overwritten. + + + Indicates whether the file should be appended to or overwritten. + + + + If the value is set to false then the file will be overwritten, if + it is set to true then the file will be appended to. + + The default value is true. + + + + + Gets or sets used to write to the file. + + + The used to write to the file. + + + + The default encoding set is + which is the encoding for the system's current ANSI code page. + + + + + + Gets or sets the used to write to the file. + + + The used to write to the file. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the used to handle locking of the file. + + + The used to lock the file. + + + + Gets or sets the used to handle locking of the file. + + + There are three built in locking models, , and . + The first locks the file from the start of logging to the end, the + second locks only for the minimal amount of time when logging each message + and the last synchronizes processes using a named system wide Mutex. + + + The default locking model is the . + + + + + + Activate the options on the file appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This will cause the file to be opened. + + + + + + Closes any previously opened file and calls the parent's . + + + + Resets the filename and the file stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + + + Called to initialize the file writer + + + + Will be called for each logged message until the file is + successfully opened. + + + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + Acquires the output file locks once before writing all the events to + the stream. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Closes the previously opened file. + + + + Writes the to the file and then + closes the file. + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + Calls but guarantees not to throw an exception. + Errors are passed to the . + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + If there was already an opened file, then the previous file + is closed first. + + + This method will ensure that the directory structure + for the specified exists. + + + + + + Sets the quiet writer used for file output + + the file stream that has been opened for writing + + + This implementation of creates a + over the and passes it to the + method. + + + This method can be overridden by sub classes that want to wrap the + in some way, for example to encrypt the output + data using a System.Security.Cryptography.CryptoStream. + + + + + + Sets the quiet writer being used. + + the writer over the file stream that has been opened for writing + + + This method can be overridden by sub classes that want to + wrap the in some way. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + Flag to indicate if we should append to the file + or overwrite the file. The default is to append. + + + + + The name of the log file. + + + + + The encoding to use for the file stream. + + + + + The security context to use for privileged calls + + + + + The stream to log to. Has added locking semantics + + + + + The locking model to use + + + + + The fully qualified type of the FileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This appender forwards logging events to attached appenders. + + + + The forwarding appender can be used to specify different thresholds + and filters for the same appender at different locations within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Forward the logging event to the attached appenders + + The event to log. + + + Delivers the logging event to all the attached appenders. + + + + + + Forward the logging events to the attached appenders + + The array of events to log. + + + Delivers the logging events to all the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Implement this interface for your own strategies for printing log statements. + + + + Implementors should consider extending the + class which provides a default implementation of this interface. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Log the logging event in Appender specific way. + + The event to log + + + This method is called to log a message into this appender. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + The name uniquely identifies the appender. + + + + + Interface for appenders that support bulk logging. + + + + This interface extends the interface to + support bulk logging of objects. Appenders + should only implement this interface if they can bulk log efficiently. + + + Nicko Cadell + + + + Log the array of logging events in Appender specific way. + + The events to log + + + This method is called to log an array of events into this appender. + + + + + + Interface that can be implemented by Appenders that buffer logging data and expose a method. + + + + + Flushes any buffered log data. + + + Appenders that implement the method must do so in a thread-safe manner: it can be called concurrently with + the method. + + Typically this is done by locking on the Appender instance, e.g.: + + + + + + The parameter is only relevant for appenders that process logging events asynchronously, + such as . + + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Logs events to a local syslog service. + + + + This appender uses the POSIX libc library functions openlog, syslog, and closelog. + If these functions are not available on the local system then this appender will not work! + + + The functions openlog, syslog, and closelog are specified in SUSv2 and + POSIX 1003.1-2001 standards. These are used to log messages to the local syslog service. + + + This appender talks to a local syslog service. If you need to log to a remote syslog + daemon and you cannot configure your local syslog service to do this you may be + able to use the to log via UDP. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + syslog severities + + + + The log4net Level maps to a syslog severity using the + method and the + class. The severity is set on . + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facility defines which subsystem the logging comes from. + This is set on the property. + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a local syslog service. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Adds a to this appender. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Close the syslog when the appender is closed + + + + Close the syslog when the appender is closed + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + + The facility. The default facility is . + + + + + The message identity + + + + + Marshaled handle to the identity string. We have to hold on to the + string as the openlog and syslog APIs just hold the + pointer to the ident and dereference it for each log message. + + + + + Mapping from level object to syslog severity + + + + + Open connection to system logger. + + + + + Generate a log message. + + + + The libc syslog method takes a format string and a variable argument list similar + to the classic printf function. As this type of vararg list is not supported + by C# we need to specify the arguments explicitly. Here we have specified the + format string with a single message argument. The caller must set the format + string to "%s". + + + + + + Close descriptor used to write to system logger. + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Appends colorful logging events to the console, using the .NET 2 + built-in capabilities. + + + + ManagedColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + When configuring the colored console appender, mappings should be + specified to map logging levels to colors. For example: + + + + + + + + + + + + + + + + + + + + + + The Level is the standard log4net logging level while + ForeColor and BackColor are the values of + enumeration. + + + Based on the ColoredConsoleAppender + + + Rick Hobbs + Nicko Cadell + Pavlos Touboulidis + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level. + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level. + + + + + + Stores logging events in an array. + + + + The memory appender stores all the logging events + that are appended in an in-memory array. + + + Use the method to get + and clear the current list of events that have been appended. + + + Use the method to get the current + list of events that have been appended. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Use the method to clear the + current list of events. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Julian Biddle + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Gets the events that have been logged. + + The events that have been logged + + + Gets the events that have been logged. + + + + + + Gets or sets a value indicating whether only part of the logging event + data should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the event + data to be fixed and stored in the appender, hereby improving performance. + + + See for more information. + + + + + + Gets or sets the fields that will be fixed in the event + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + This method is called by the method. + + the event to log + + Stores the in the events list. + + + + + Clear the list of events + + + Clear the list of events + + + + + Gets the events that have been logged and clears the list of events. + + The events that have been logged + + + Gets the events that have been logged and clears the list of events. + + + + + + The list of events that have been appended. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + Logs entries by sending network messages using the + native function. + + + + You can send messages only to names that are active + on the network. If you send the message to a user name, + that user must be logged on and running the Messenger + service to receive the message. + + + The receiver will get a top most window displaying the + messages one at a time, therefore this appender should + not be used to deliver a high volume of messages. + + + The following table lists some possible uses for this appender : + + + + + Action + Property Value(s) + + + Send a message to a user account on the local machine + + + = <name of the local machine> + + + = <user name> + + + + + Send a message to a user account on a remote machine + + + = <name of the remote machine> + + + = <user name> + + + + + Send a message to a domain user account + + + = <name of a domain controller | uninitialized> + + + = <user name> + + + + + Send a message to all the names in a workgroup or domain + + + = <workgroup name | domain name>* + + + + + Send a message from the local machine to a remote machine + + + = <name of the local machine | uninitialized> + + + = <name of the remote machine> + + + + + + + Note : security restrictions apply for sending + network messages, see + for more information. + + + + + An example configuration section to log information + using this appender from the local machine, named + LOCAL_PC, to machine OPERATOR_PC : + + + + + + + + + + Nicko Cadell + Gert Driesen + + + + The DNS or NetBIOS name of the server on which the function is to execute. + + + + + The sender of the network message. + + + + + The message alias to which the message should be sent. + + + + + The security context to use for privileged calls + + + + + Initializes the appender. + + + The default constructor initializes all fields to their default values. + + + + + Gets or sets the sender of the message. + + + The sender of the message. + + + If this property is not specified, the message is sent from the local computer. + + + + + Gets or sets the message alias to which the message should be sent. + + + The recipient of the message. + + + This property should always be specified in order to send a message. + + + + + Gets or sets the DNS or NetBIOS name of the remote server on which the function is to execute. + + + DNS or NetBIOS name of the remote server on which the function is to execute. + + + + For Windows NT 4.0 and earlier, the string should begin with \\. + + + If this property is not specified, the local computer is used. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified. + + + The required property was not specified. + + + + This method is called by the method. + + The event to log. + + + Sends the event using a network message. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Sends a buffer of information to a registered message alias. + + The DNS or NetBIOS name of the server on which the function is to execute. + The message alias to which the message buffer should be sent + The originator of the message. + The message text. + The length, in bytes, of the message text. + + + The following restrictions apply for sending network messages: + + + + + Platform + Requirements + + + Windows NT + + + No special group membership is required to send a network message. + + + Admin, Accounts, Print, or Server Operator group membership is required to + successfully send a network message on a remote server. + + + + + Windows 2000 or later + + + If you send a message on a domain controller that is running Active Directory, + access is allowed or denied based on the access control list (ACL) for the securable + object. The default ACL permits only Domain Admins and Account Operators to send a network message. + + + On a member server or workstation, only Administrators and Server Operators can send a network message. + + + + + + + For more information see Security Requirements for the Network Management Functions. + + + + + If the function succeeds, the return value is zero. + + + + + + Appends log events to the OutputDebugString system. + + + + OutputDebugStringAppender appends log events to the + OutputDebugString system. + + + The string is passed to the native OutputDebugString + function. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Write the logging event to the output debug string API + + the event to log + + + Write the logging event to the output debug string API + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Stub for OutputDebugString native method + + the string to output + + + Stub for OutputDebugString native method + + + + + + Logs events to a remote syslog daemon. + + + + The BSD syslog protocol is used to remotely log to + a syslog daemon. The syslogd listens for for messages + on UDP port 514. + + + The syslog UDP protocol is not authenticated. Most syslog daemons + do not accept remote log messages because of the security implications. + You may be able to use the LocalSyslogAppender to talk to a local + syslog service. + + + There is an RFC 3164 that claims to document the BSD Syslog Protocol. + This RFC can be seen here: http://www.faqs.org/rfcs/rfc3164.html. + This appender generates what the RFC calls an "Original Device Message", + i.e. does not include the TIMESTAMP or HOSTNAME fields. By observation + this format of message will be accepted by all current syslog daemon + implementations. The daemon will attach the current time and the source + hostname or IP address to any messages received. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + Syslog port 514 + + + + + syslog severities + + + + The syslog severities. + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facilities + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a remote syslog daemon. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Add a mapping to this appender. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Initialize the options for this appender + + + + Initialize the level to syslog severity mappings set on this appender. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + Generate a syslog priority. + + + + + + The facility. The default facility is . + + + + + The message identity + + + + + Mapping from level object to syslog severity + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Delivers logging events to a remote logging sink. + + + + This Appender is designed to deliver events to a remote sink. + That is any object that implements the + interface. It delivers the events using .NET remoting. The + object to deliver events to is specified by setting the + appenders property. + + The RemotingAppender buffers events before sending them. This allows it to + make more efficient use of the remoting infrastructure. + + Once the buffer is full the events are still not sent immediately. + They are scheduled to be sent using a pool thread. The effect is that + the send occurs asynchronously. This is very important for a + number of non obvious reasons. The remoting infrastructure will + flow thread local variables (stored in the ), + if they are marked as , across the + remoting boundary. If the server is not contactable then + the remoting infrastructure will clear the + objects from the . To prevent a logging failure from + having side effects on the calling application the remoting call must be made + from a separate thread to the one used by the application. A + thread is used for this. If no thread is available then + the events will block in the thread pool manager until a thread is available. + + Because the events are sent asynchronously using pool threads it is possible to close + this appender before all the queued events have been sent. + When closing the appender attempts to wait until all the queued events have been sent, but + this will timeout after 30 seconds regardless. + + If this appender is being closed because the + event has fired it may not be possible to send all the queued events. During process + exit the runtime limits the time that a + event handler is allowed to run for. If the runtime terminates the threads before + the queued events have been sent then they will be lost. To ensure that all events + are sent the appender must be closed before the application exits. See + for details on how to shutdown + log4net programmatically. + + + Nicko Cadell + Gert Driesen + Daniel Cazzulino + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Gets or sets the URL of the well-known object that will accept + the logging events. + + + The well-known URL of the remote sink. + + + + The URL of the remoting sink that will accept logging events. + The sink must implement the + interface. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Send the contents of the buffer to the remote sink. + + + The events are not sent immediately. They are scheduled to be sent + using a pool thread. The effect is that the send occurs asynchronously. + This is very important for a number of non obvious reasons. The remoting + infrastructure will flow thread local variables (stored in the ), + if they are marked as , across the + remoting boundary. If the server is not contactable then + the remoting infrastructure will clear the + objects from the . To prevent a logging failure from + having side effects on the calling application the remoting call must be made + from a separate thread to the one used by the application. A + thread is used for this. If no thread is available then + the events will block in the thread pool manager until a thread is available. + + The events to send. + + + + Override base class close. + + + + This method waits while there are queued work items. The events are + sent asynchronously using work items. These items + will be sent once a thread pool thread is available to send them, therefore + it is possible to close the appender before all the queued events have been + sent. + + This method attempts to wait until all the queued events have been sent, but this + method will timeout after 30 seconds regardless. + + If the appender is being closed because the + event has fired it may not be possible to send all the queued events. During process + exit the runtime limits the time that a + event handler is allowed to run for. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + A work item is being queued into the thread pool + + + + + A work item from the thread pool has completed + + + + + Send the contents of the buffer to the remote sink. + + + This method is designed to be used with the . + This method expects to be passed an array of + objects in the state param. + + the logging events to send + + + + The URL of the remote sink. + + + + + The local proxy (.NET remoting) for the remote logging sink. + + + + + The number of queued callbacks currently waiting or executing + + + + + Event used to signal when there are no queued work items + + + This event is set when there are no queued work items. In this + state it is safe to close the appender. + + + + + Interface used to deliver objects to a remote sink. + + + This interface must be implemented by a remoting sink + if the is to be used + to deliver logging events to the sink. + + + + + Delivers logging events to the remote sink + + Array of events to log. + + + Delivers logging events to the remote sink + + + + + + Appender that rolls log files based on size or date or both. + + + + RollingFileAppender can roll log files based on size or date or both + depending on the setting of the property. + When set to the log file will be rolled + once its size exceeds the . + When set to the log file will be rolled + once the date boundary specified in the property + is crossed. + When set to the log file will be + rolled once the date boundary specified in the property + is crossed, but within a date boundary the file will also be rolled + once its size exceeds the . + When set to the log file will be rolled when + the appender is configured. This effectively means that the log file can be + rolled once per program execution. + + + A of few additional optional features have been added: + + Attach date pattern for current log file + Backup number increments for newer files + Infinite number of backups by file size + + + + + + For large or infinite numbers of backup files a + greater than zero is highly recommended, otherwise all the backup files need + to be renamed each time a new backup is created. + + + When Date/Time based rolling is used setting + to will reduce the number of file renamings to few or none. + + + + + + Changing or without clearing + the log file directory of backup files will cause unexpected and unwanted side effects. + + + + + If Date/Time based rolling is enabled this appender will attempt to roll existing files + in the directory without a Date/Time tag based on the last write date of the base log file. + The appender only rolls the log file when a message is logged. If Date/Time based rolling + is enabled then the appender will not roll the log file at the Date/Time boundary but + at the point when the next message is logged after the boundary has been crossed. + + + + The extends the and + has the same behavior when opening the log file. + The appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + When rolling a backup file necessitates deleting an older backup file the + file to be deleted is moved to a temporary name before being deleted. + + + + + A maximum number of backup files when rolling on date/time boundaries is not supported. + + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + Edward Smit + + + + Style of rolling to use + + + + Style of rolling to use + + + + + + Roll files once per program execution + + + + Roll files once per program execution. + Well really once each time this appender is + configured. + + + Setting this option also sets AppendToFile to + false on the RollingFileAppender, otherwise + this appender would just be a normal file appender. + + + + + + Roll files based only on the size of the file + + + + + Roll files based only on the date + + + + + Roll files based on both the size and date of the file + + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + + + Roll the log not based on the date + + + + + Roll the log for each minute + + + + + Roll the log for each hour + + + + + Roll the log twice a day (midday and midnight) + + + + + Roll the log each day (midnight) + + + + + Roll the log each week + + + + + Roll the log each month + + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Cleans up all resources used by this appender. + + + + + Gets or sets the strategy for determining the current date and time. The default + implementation is to use LocalDateTime which internally calls through to DateTime.Now. + DateTime.UtcNow may be used on frameworks newer than .NET 1.0 by specifying + . + + + An implementation of the interface which returns the current date and time. + + + + Gets or sets the used to return the current date and time. + + + There are two built strategies for determining the current date and time, + + and . + + + The default strategy is . + + + + + + Gets or sets the date pattern to be used for generating file names + when rolling over on date. + + + The date pattern to be used for generating file names when rolling + over on date. + + + + Takes a string in the same format as expected by + . + + + This property determines the rollover schedule when rolling over + on date. + + + + + + Gets or sets the maximum number of backup files that are kept before + the oldest is erased. + + + The maximum number of backup files that are kept before the oldest is + erased. + + + + If set to zero, then there will be no backup files and the log file + will be truncated when it reaches . + + + If a negative number is supplied then no deletions will be made. Note + that this could result in very slow performance as a large number of + files are rolled over unless is used. + + + The maximum applies to each time based group of files and + not the total. + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size in bytes that the output file is allowed to reach before being + rolled over to backup files. + + + + This property is equivalent to except + that it is required for differentiating the setter taking a + argument from the setter taking a + argument. + + + The default maximum file size is 10MB (10*1024*1024). + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size that the output file is allowed to reach before being + rolled over to backup files. + + + + This property allows you to specify the maximum size with the + suffixes "KB", "MB" or "GB" so that the size is interpreted being + expressed respectively in kilobytes, megabytes or gigabytes. + + + For example, the value "10KB" will be interpreted as 10240 bytes. + + + The default maximum file size is 10MB. + + + If you have the option to set the maximum file size programmatically + consider using the property instead as this + allows you to set the size in bytes as a . + + + + + + Gets or sets the rolling file count direction. + + + The rolling file count direction. + + + + Indicates if the current file is the lowest numbered file or the + highest numbered file. + + + By default newer files have lower numbers ( < 0), + i.e. log.1 is most recent, log.5 is the 5th backup, etc... + + + >= 0 does the opposite i.e. + log.1 is the first backup made, log.5 is the 5th backup made, etc. + For infinite backups use >= 0 to reduce + rollover costs. + + The default file count direction is -1. + + + + + Gets or sets the rolling style. + + The rolling style. + + + The default rolling style is . + + + When set to this appender's + property is set to false, otherwise + the appender would append to a single file rather than rolling + the file each time it is opened. + + + + + + Gets or sets a value indicating whether to preserve the file name extension when rolling. + + + true if the file name extension should be preserved. + + + + By default file.log is rolled to file.log.yyyy-MM-dd or file.log.curSizeRollBackup. + However, under Windows the new file name will loose any program associations as the + extension is changed. Optionally file.log can be renamed to file.yyyy-MM-dd.log or + file.curSizeRollBackup.log to maintain any program associations. + + + + + + Gets or sets a value indicating whether to always log to + the same file. + + + true if always should be logged to the same file, otherwise false. + + + + By default file.log is always the current file. Optionally + file.log.yyyy-mm-dd for current formatted datePattern can by the currently + logging file (or file.log.curSizeRollBackup or even + file.log.yyyy-mm-dd.curSizeRollBackup). + + + This will make time based rollovers with a large number of backups + much faster as the appender it won't have to rename all the backups! + + + + + + The fully qualified type of the RollingFileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Sets the quiet writer being used. + + + This method can be overridden by sub classes. + + the writer to set + + + + Write out a logging event. + + the event to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Write out an array of logging events. + + the events to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Performs any required rolling before outputting the next event + + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Creates and opens the file for logging. If + is false then the fully qualified name is determined and used. + + the name of the file to open + true to append to existing file + + This method will ensure that the directory structure + for the specified exists. + + + + + Get the current output file name + + the base file name + the output file name + + The output file name is based on the base fileName specified. + If is set then the output + file name is the same as the base file passed in. Otherwise + the output file depends on the date pattern, on the count + direction or both. + + + + + Determines curSizeRollBackups (only within the current roll point) + + + + + Generates a wildcard pattern that can be used to find all files + that are similar to the base file name. + + + + + + + Builds a list of filenames for all files matching the base filename plus a file + pattern. + + + + + + + Initiates a roll over if needed for crossing a date boundary since the last run. + + + + + Initializes based on existing conditions at time of . + + + + Initializes based on existing conditions at time of . + The following is done + + determine curSizeRollBackups (only within the current roll point) + initiates a roll over if needed for crossing a date boundary since the last run. + + + + + + + Does the work of bumping the 'current' file counter higher + to the highest count when an incremental file name is seen. + The highest count is either the first file (when count direction + is greater than 0) or the last file (when count direction less than 0). + In either case, we want to know the highest count that is present. + + + + + + + Attempts to extract a number from the end of the file name that indicates + the number of the times the file has been rolled over. + + + Certain date pattern extensions like yyyyMMdd will be parsed as valid backup indexes. + + + + + + + Takes a list of files and a base file name, and looks for + 'incremented' versions of the base file. Bumps the max + count up to the highest count seen. + + + + + + + Calculates the RollPoint for the datePattern supplied. + + the date pattern to calculate the check period for + The RollPoint that is most accurate for the date pattern supplied + + Essentially the date pattern is examined to determine what the + most suitable roll point is. The roll point chosen is the roll point + with the smallest period that can be detected using the date pattern + supplied. i.e. if the date pattern only outputs the year, month, day + and hour then the smallest roll point that can be detected would be + and hourly roll point as minutes could not be detected. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Sets initial conditions including date/time roll over information, first check, + scheduledFilename, and calls to initialize + the current number of backups. + + + + + + + + + .1, .2, .3, etc. + + + + + Rollover the file(s) to date/time tagged file(s). + + set to true if the file to be rolled is currently open + + + Rollover the file(s) to date/time tagged file(s). + Resets curSizeRollBackups. + If fileIsOpen is set then the new file is opened (through SafeOpenFile). + + + + + + Renames file to file . + + Name of existing file to roll. + New name for file. + + + Renames file to file . It + also checks for existence of target file and deletes if it does. + + + + + + Test if a file exists at a specified path + + the path to the file + true if the file exists + + + Test if a file exists at a specified path + + + + + + Deletes the specified file if it exists. + + The file to delete. + + + Delete a file if is exists. + The file is first moved to a new filename then deleted. + This allows the file to be removed even when it cannot + be deleted, but it still can be moved. + + + + + + Implements file roll base on file size. + + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. Moreover, File is + renamed File.1 and closed. + + + A new file is created to receive further log output. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + + + + Implements file roll. + + the base name to rename + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + This is called by to rename the files. + + + + + + Get the start time of the next window for the current rollpoint + + the current date + the type of roll point we are working with + the start time for the next roll point an interval after the currentDateTime date + + + Returns the date of the next roll point after the currentDateTime date passed to the method. + + + The basic strategy is to subtract the time parts that are less significant + than the rollpoint from the current time. This should roll the time back to + the start of the time window for the current rollpoint. Then we add 1 window + worth of time and get the start time of the next window for the rollpoint. + + + + + + This object supplies the current date/time. Allows test code to plug in + a method to control this class when testing date/time based rolling. The default + implementation uses the underlying value of DateTime.Now. + + + + + The date pattern. By default, the pattern is set to ".yyyy-MM-dd" + meaning daily rollover. + + + + + The actual formatted filename that is currently being written to + or will be the file transferred to on roll over + (based on staticLogFileName). + + + + + The timestamp when we shall next recompute the filename. + + + + + Holds date of last roll over + + + + + The type of rolling done + + + + + The default maximum file size is 10MB + + + + + There is zero backup files by default + + + + + How many sized based backups have been made so far + + + + + The rolling file count direction. + + + + + The rolling mode used in this appender. + + + + + Cache flag set if we are rolling by date. + + + + + Cache flag set if we are rolling by size. + + + + + Value indicating whether to always log to the same file. + + + + + Value indicating whether to preserve the file name extension when rolling. + + + + + FileName provided in configuration. Used for rolling properly + + + + + A mutex that is used to lock rolling of files. + + + + + The 1st of January 1970 in UTC + + + + + This interface is used to supply Date/Time information to the . + + + This interface is used to supply Date/Time information to the . + Used primarily to allow test classes to plug themselves in so they can + supply test date/times. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Default implementation of that returns the current time. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Implementation of that returns the current time as the coordinated universal time (UTC). + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Send an e-mail when a specific logging event occurs, typically on errors + or fatal errors. + + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Authentication and setting the server Port are only available on the MS .NET 1.1 runtime. + For these features to be enabled you need to ensure that you are using a version of + the log4net assembly that is built against the MS .NET 1.1 framework and that you are + running the your application on the MS .NET 1.1 runtime. On all other platforms only sending + unauthenticated messages to a server listening on port 25 (the default) is supported. + + + Authentication is supported by setting the property to + either or . + If using authentication then the + and properties must also be set. + + + To set the SMTP server port use the property. The default port is 25. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses (use semicolon on .NET 1.1 and comma for later versions). + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + + Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses + that will be carbon copied (use semicolon on .NET 1.1 and comma for later versions). + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses + that will be blind carbon copied. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of recipient e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the name of the SMTP relay mail server to use to send + the e-mail messages. + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + + + Obsolete + + + Use the BufferingAppenderSkeleton Fix methods instead + + + + Obsolete property. + + + + + + The mode to use to authentication with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + Valid Authentication mode values are: , + , and . + The default value is . When using + you must specify the + and to use to authenticate. + When using the Windows credentials for the current + thread, if impersonating, or the process will be used to authenticate. + + + + + + The username to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the username will be ignored. + + + + + + The password to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the password will be ignored. + + + + + + The port on which the SMTP server is listening + + + Server Port is only available on the MS .NET 1.1 runtime. + + The port on which the SMTP server is listening. The default + port is 25. The Port can only be changed when running on + the MS .NET 1.1 runtime. + + + + + + Gets or sets the priority of the e-mail message + + + One of the values. + + + + Sets the priority of the e-mails generated by this + appender. The default priority is . + + + If you are using this appender to report errors then + you may want to set the priority to . + + + + + + Enable or disable use of SSL when sending e-mail message + + + This is available on MS .NET 2.0 runtime and higher + + + + + Gets or sets the reply-to e-mail address. + + + This is available on MS .NET 2.0 runtime and higher + + + + + Gets or sets the subject encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Gets or sets the body encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Send the email message + + the body text to include in the mail + + + + Values for the property. + + + + SMTP authentication modes. + + + + + + No authentication + + + + + Basic authentication. + + + Requires a username and password to be supplied + + + + + Integrated authentication + + + Uses the Windows credentials from the current thread or process to authenticate. + + + + + trims leading and trailing commas or semicolons + + + + + Send an email when a specific logging event occurs, typically on errors + or fatal errors. Rather than sending via smtp it writes a file into the + directory specified by . This allows services such + as the IIS SMTP agent to manage sending the messages. + + + + The configuration for this appender is identical to that of the SMTPAppender, + except that instead of specifying the SMTPAppender.SMTPHost you specify + . + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Niall Daley + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the path to write the messages to. + + + + Gets or sets the path to write the messages to. This should be the same + as that used by the agent sending the messages. + + + + + + Gets or sets the file extension for the generated files + + + The file extension for the generated files + + + + The file extension for the generated files + + + + + + Gets or sets the used to write to the pickup directory. + + + The used to write to the pickup directory. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + Sends the contents of the cyclic buffer as an e-mail message. + + + + + + Activate the options on this appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + The security context to use for privileged calls + + + + + Appender that allows clients to connect via Telnet to receive log messages + + + + The TelnetAppender accepts socket connections and streams logging messages + back to the client. + The output is provided in a telnet-friendly way so that a log can be monitored + over a TCP/IP socket. + This allows simple remote monitoring of application logging. + + + The default is 23 (the telnet port). + + + Keith Long + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + The fully qualified type of the TelnetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the TCP port number on which this will listen for connections. + + + An integer value in the range to + indicating the TCP port number on which this will listen for connections. + + + + The default value is 23 (the telnet port). + + + The value specified is less than + or greater than . + + + + Overrides the parent method to close the socket handler + + + + Closes all the outstanding connections. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Create the socket handler and wait for connections + + + + + + Writes the logging event to each connected client. + + The event to log. + + + Writes the logging event to each connected client. + + + + + + Helper class to manage connected clients + + + + The SocketHandler class is used to accept connections from + clients. It is threaded so that clients can connect/disconnect + asynchronously. + + + + + + Class that represents a client connected to this handler + + + + Class that represents a client connected to this handler + + + + + + Create this for the specified + + the client's socket + + + Opens a stream writer on the socket. + + + + + + Write a string to the client + + string to send + + + Write a string to the client + + + + + + Cleanup the clients connection + + + + Close the socket connection. + + + + + + Opens a new server port on + + the local port to listen on for connections + + + Creates a socket handler on the specified local server port. + + + + + + Sends a string message to each of the connected clients + + the text to send + + + Sends a string message to each of the connected clients + + + + + + Add a client to the internal clients list + + client to add + + + + Remove a client from the internal clients list + + client to remove + + + + Test if this handler has active connections + + + true if this handler has active connections + + + + This property will be true while this handler has + active connections, that is at least one connection that + the handler will attempt to send a message to. + + + + + + Callback used to accept a connection on the server socket + + The result of the asynchronous operation + + + On connection adds to the list of connections + if there are two many open connections you will be disconnected + + + + + + Close all network connections + + + + Make sure we close all network connections + + + + + + Sends logging events to a . + + + + An Appender that writes to a . + + + This appender may be used stand alone if initialized with an appropriate + writer, however it is typically used as a base class for an appender that + can open a to write to. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class and + sets the output destination to a new initialized + with the specified . + + The layout to use with this appender. + The to output to. + + + Obsolete constructor. + + + + + + Initializes a new instance of the class and sets + the output destination to the specified . + + The layout to use with this appender + The to output to + + The must have been previously opened. + + + + Obsolete constructor. + + + + + + Gets or set whether the appender will flush at the end + of each append operation. + + + + The default behavior is to flush at the end of each + append operation. + + + If this option is set to false, then the underlying + stream can defer persisting the logging event to a later + time. + + + + Avoiding the flush operation at the end of each append results in + a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + Sets the where the log output will go. + + + + The specified must be open and writable. + + + The will be closed when the appender + instance is closed. + + + Note: Logging to an unopened will fail. + + + + + + This method determines if there is a sense in attempting to append. + + + + This method checks if an output target has been set and if a + layout has been set. + + + false if any of the preconditions fail. + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + This method writes all the bulk logged events to the output writer + before flushing the stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + Closed appenders cannot be reused. + + + + + Gets or set the and the underlying + , if any, for this appender. + + + The for this appender. + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Writes the footer and closes the underlying . + + + + Writes the footer and closes the underlying . + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Clears internal references to the underlying + and other variables. + + + + Subclasses can override this method for an alternate closing behavior. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Called to allow a subclass to lazily initialize the writer + + + + This method is called when an event is logged and the or + have not been set. This allows a subclass to + attempt to initialize the writer multiple times. + + + + + + Gets or sets the where logging events + will be written to. + + + The where logging events are written. + + + + This is the where logging events + will be written to. + + + + + + This is the where logging events + will be written to. + + + + + Immediate flush means that the underlying + or output stream will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logging events are not actually persisted if and when the application + crashes. + + + The default value is true. + + + + + + The fully qualified type of the TextWriterAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + trace system. + + + Events are written using the System.Diagnostics.Trace.Write(string,string) + method. The event's logger name is the default value for the category parameter + of the Write method. + + + Compact Framework
+ The Compact Framework does not support the + class for any operation except Assert. When using the Compact Framework this + appender will write to the system rather than + the Trace system. This appender will therefore behave like the . +
+
+ Douglas de la Torre + Nicko Cadell + Gert Driesen + Ron Grabowski +
+ + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Defaults to %logger + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Sends logging events as connectionless UDP datagrams to a remote host or a + multicast group using an . + + + + UDP guarantees neither that messages arrive, nor that they arrive in the correct order. + + + To view the logging results, a custom application can be developed that listens for logging + events. + + + When decoding events send via this appender remember to use the same encoding + to decode the events as was used to send the events. See the + property to specify the encoding to use. + + + + This example shows how to log receive logging events that are sent + on IP address 244.0.0.1 and port 8080 to the console. The event is + encoded in the packet as a unicode string and it is decoded as such. + + IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + UdpClient udpClient; + byte[] buffer; + string loggingEvent; + + try + { + udpClient = new UdpClient(8080); + + while(true) + { + buffer = udpClient.Receive(ref remoteEndPoint); + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer); + Console.WriteLine(loggingEvent); + } + } + catch(Exception e) + { + Console.WriteLine(e.ToString()); + } + + + Dim remoteEndPoint as IPEndPoint + Dim udpClient as UdpClient + Dim buffer as Byte() + Dim loggingEvent as String + + Try + remoteEndPoint = new IPEndPoint(IPAddress.Any, 0) + udpClient = new UdpClient(8080) + + While True + buffer = udpClient.Receive(ByRef remoteEndPoint) + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer) + Console.WriteLine(loggingEvent) + Wend + Catch e As Exception + Console.WriteLine(e.ToString()) + End Try + + + An example configuration section to log information using this appender to the + IP 224.0.0.1 on port 8080: + + + + + + + + + + Gert Driesen + Nicko Cadell + + + + Initializes a new instance of the class. + + + The default constructor initializes all fields to their default values. + + + + + Gets or sets the IP address of the remote host or multicast group to which + the underlying should sent the logging event. + + + The IP address of the remote host or multicast group to which the logging event + will be sent. + + + + Multicast addresses are identified by IP class D addresses (in the range 224.0.0.0 to + 239.255.255.255). Multicast packets can pass across different networks through routers, so + it is possible to use multicasts in an Internet scenario as long as your network provider + supports multicasting. + + + Hosts that want to receive particular multicast messages must register their interest by joining + the multicast group. Multicast messages are not sent to networks where no host has joined + the multicast group. Class D IP addresses are used for multicast groups, to differentiate + them from normal host addresses, allowing nodes to easily detect if a message is of interest. + + + Static multicast addresses that are needed globally are assigned by IANA. A few examples are listed in the table below: + + + + + IP Address + Description + + + 224.0.0.1 + + + Sends a message to all system on the subnet. + + + + + 224.0.0.2 + + + Sends a message to all routers on the subnet. + + + + + 224.0.0.12 + + + The DHCP server answers messages on the IP address 224.0.0.12, but only on a subnet. + + + + + + + A complete list of actually reserved multicast addresses and their owners in the ranges + defined by RFC 3171 can be found at the IANA web site. + + + The address range 239.0.0.0 to 239.255.255.255 is reserved for administrative scope-relative + addresses. These addresses can be reused with other local groups. Routers are typically + configured with filters to prevent multicast traffic in this range from flowing outside + of the local network. + + + + + + Gets or sets the TCP port number of the remote host or multicast group to which + the underlying should sent the logging event. + + + An integer value in the range to + indicating the TCP port number of the remote host or multicast group to which the logging event + will be sent. + + + The underlying will send messages to this TCP port number + on the remote host or multicast group. + + The value specified is less than or greater than . + + + + Gets or sets the TCP port number from which the underlying will communicate. + + + An integer value in the range to + indicating the TCP port number from which the underlying will communicate. + + + + The underlying will bind to this port for sending messages. + + + Setting the value to 0 (the default) will cause the udp client not to bind to + a local port. + + + The value specified is less than or greater than . + + + + Gets or sets used to write the packets. + + + The used to write the packets. + + + + The used to write the packets. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to send logging events + over a network. Classes deriving from can use this + property to get or set this . Use the underlying + returned from if you require access beyond that which + provides. + + + + + Gets or sets the cached remote endpoint to which the logging events should be sent. + + + The cached remote endpoint to which the logging events will be sent. + + + The method will initialize the remote endpoint + with the values of the and + properties. + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified or + an invalid remote or local TCP port number was specified. + + + The required property was not specified. + The TCP port number assigned to or is less than or greater than . + + + + This method is called by the method. + + The event to log. + + + Sends the event using an UDP datagram. + + + Exceptions are passed to the . + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Closes the UDP connection and releases all resources associated with + this instance. + + + + Disables the underlying and releases all managed + and unmanaged resources associated with the . + + + + + + Initializes the underlying connection. + + + + The underlying is initialized and binds to the + port number from which you intend to communicate. + + + Exceptions are passed to the . + + + + + + The IP address of the remote host or multicast group to which + the logging event will be sent. + + + + + The TCP port number of the remote host or multicast group to + which the logging event will be sent. + + + + + The cached remote endpoint to which the logging events will be sent. + + + + + The TCP port number from which the will communicate. + + + + + The instance that will be used for sending the + logging events. + + + + + The encoding to use for the packet. + + + + + Assembly level attribute that specifies a domain to alias to this assembly's repository. + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's domain to its repository by + specifying this attribute with the name of the target domain. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required domains. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified domain to alias to this assembly's repository. + + The domain to alias to this assemby's repository. + + + Obsolete. Use instead of . + + + + + + Assembly level attribute that specifies a repository to alias to this assembly's repository. + + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's repository to its repository by + specifying this attribute with the name of the target repository. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required repositories. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + The repository to alias to this assemby's repository. + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + + + + + Gets or sets the repository to alias to this assemby's repository. + + + The repository to alias to this assemby's repository. + + + + The name of the repository to alias to this assemby's repository. + + + + + + Use this class to quickly configure a . + + + + Allows very simple programmatic configuration of log4net. + + + Only one appender can be configured using this configurator. + The appender is set at the root of the hierarchy and all logging + events will be delivered to that appender. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + The fully qualified type of the BasicConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Initializes the log4net system with a default configuration. + + + + Initializes the log4net logging system using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the log4net system using the specified appenders. + + The appenders to use to log all logging events. + + + Initializes the log4net system using the specified appenders. + + + + + + Initializes the log4net system using the specified appender. + + The appender to use to log all logging events. + + + Initializes the log4net system using the specified appender. + + + + + + Initializes the with a default configuration. + + The repository to configure. + + + Initializes the specified repository using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the using the specified appender. + + The repository to configure. + The appender to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Initializes the using the specified appenders. + + The repository to configure. + The appenders to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Base class for all log4net configuration attributes. + + + This is an abstract class that must be extended by + specific configurators. This attribute allows the + configurator to be parameterized by an assembly level + attribute. + + Nicko Cadell + Gert Driesen + + + + Constructor used by subclasses. + + the ordering priority for this configurator + + + The is used to order the configurator + attributes before they are invoked. Higher priority configurators are executed + before lower priority ones. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Abstract method implemented by a subclass. When this method is called + the subclass should configure the . + + + + + + Compare this instance to another ConfiguratorAttribute + + the object to compare to + see + + + Compares the priorities of the two instances. + Sorts by priority in descending order. Objects with the same priority are + randomly ordered. + + + + + + Assembly level attribute that specifies the logging domain for the assembly. + + + + DomainAttribute is obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + Assemblies are mapped to logging domains. Each domain has its own + logging repository. This attribute specified on the assembly controls + the configuration of the domain. The property specifies the name + of the domain that this assembly is a part of. The + specifies the type of the repository objects to create for the domain. If + this attribute is not specified and a is not specified + then the assembly will be part of the default shared logging domain. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Initialize a new instance of the class + with the name of the domain. + + The name of the domain. + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + The repository to configure. + + + + Configures log4net using a log4net element + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Loads the log4net configuration from the XML element + supplied as . + + The element to parse. + + + + Configures the using the specified XML + element. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration file. + + A stream to load the XML configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Assembly level attribute to configure the . + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + Gert Driesen + + + + Class to register for the log4net section of the configuration file + + + The log4net section of the configuration file needs to have a section + handler registered. This is the section handler used. It simply returns + the XML element that is the root of the section. + + + Example of registering the log4net section handler : + + + +
+ + + log4net configuration XML goes here + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Parses the configuration section. + + The configuration settings in a corresponding parent configuration section. + The configuration context when called from the ASP.NET configuration system. Otherwise, this parameter is reserved and is a null reference. + The for the log4net section. + The for the log4net section. + + + Returns the containing the configuration data, + + + + + + Assembly level attribute that specifies a plugin to attach to + the repository. + + + + Specifies the type of a plugin to create and attach to the + assembly's repository. The plugin type must implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class + with the specified type. + + The type name of plugin to create. + + + Create the attribute with the plugin type specified. + + + Where possible use the constructor that takes a . + + + + + + Initializes a new instance of the class + with the specified type. + + The type of plugin to create. + + + Create the attribute with the plugin type specified. + + + + + + Gets or sets the type for the plugin. + + + The type for the plugin. + + + + The type for the plugin. + + + + + + Gets or sets the type name for the plugin. + + + The type name for the plugin. + + + + The type name for the plugin. + + + Where possible use the property instead. + + + + + + Creates the plugin object defined by this attribute. + + + + Creates the instance of the object as + specified by this attribute. + + + The plugin object. + + + + Returns a representation of the properties of this object. + + + + Overrides base class method to + return a representation of the properties of this object. + + + A representation of the properties of this object + + + + Assembly level attribute that specifies the logging repository for the assembly. + + + + Assemblies are mapped to logging repository. This attribute specified + on the assembly controls + the configuration of the repository. The property specifies the name + of the repository that this assembly is a part of. The + specifies the type of the object + to create for the assembly. If this attribute is not specified or a + is not specified then the assembly will be part of the default shared logging repository. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initialize a new instance of the class + with the name of the repository. + + The name of the repository. + + + Initialize the attribute with the name for the assembly's repository. + + + + + + Gets or sets the name of the logging repository. + + + The string name to use as the name of the repository associated with this + assembly. + + + + This value does not have to be unique. Several assemblies can share the + same repository. They will share the logging configuration of the repository. + + + + + + Gets or sets the type of repository to create for this assembly. + + + The type of repository to create for this assembly. + + + + The type of the repository to create for the assembly. + The type must implement the + interface. + + + This will be the type of repository created when + the repository is created. If multiple assemblies reference the + same repository then the repository is only created once using the + of the first assembly to call into the + repository. + + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + + + + Construct provider attribute with type specified + + the type of the provider to use + + + The provider specified must subclass the + class. + + + + + + Gets or sets the type of the provider to use. + + + the type of the provider to use. + + + + The provider specified must subclass the + class. + + + + + + Configures the SecurityContextProvider + + The assembly that this attribute was defined on. + The repository to configure. + + + Creates a provider instance from the specified. + Sets this as the default security context provider . + + + + + + The fully qualified type of the SecurityContextProviderAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + The repository to configure. + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + + + + + Configures log4net using a log4net element + + + + Loads the log4net configuration from the XML element + supplied as . + + + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration URI. + + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The must support the URI scheme specified. + + + + + + Configures log4net using the specified configuration data stream. + + A stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified XML + element. + + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + URI. + + The repository to configure. + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The must support the URI scheme specified. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Class used to watch config files. + + + + Uses the to monitor + changes to a specified file. Because multiple change notifications + may be raised when the file is modified, a timer is used to + compress the notifications into a single event. The timer + waits for time before delivering + the event notification. If any further + change notifications arrive while the timer is waiting it + is reset and waits again for to + elapse. + + + + + + Holds the FileInfo used to configure the XmlConfigurator + + + + + Holds the repository being configured. + + + + + The timer used to compress the notification events. + + + + + The default amount of time to wait after receiving notification + before reloading the config file. + + + + + Watches file for changes. This object should be disposed when no longer + needed to free system handles on the watched resources. + + + + + Initializes a new instance of the class to + watch a specified config file used to configure a repository. + + The repository to configure. + The configuration file to watch. + + + Initializes a new instance of the class. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Called by the timer when the configuration has been updated. + + null + + + + Release the handles held by the watcher and timer. + + + + + Configures the specified repository using a log4net element. + + The hierarchy to configure. + The element to parse. + + + Loads the log4net configuration from the XML element + supplied as . + + + This method is ultimately called by one of the Configure methods + to load the configuration from an . + + + + + + Maps repository names to ConfigAndWatchHandler instances to allow a particular + ConfigAndWatchHandler to dispose of its FileSystemWatcher when a repository is + reconfigured. + + + + + The fully qualified type of the XmlConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + If neither of the or + properties are set the configuration is loaded from the application's .config file. + If set the property takes priority over the + property. The property + specifies a path to a file to load the config from. The path is relative to the + application's base directory; . + The property is used as a postfix to the assembly file name. + The config file must be located in the application's base directory; . + For example in a console application setting the to + config has the same effect as not specifying the or + properties. + + + The property can be set to cause the + to watch the configuration file for changes. + + + + Log4net will only look for assembly level configuration attributes once. + When using the log4net assembly level attributes to control the configuration + of log4net you must ensure that the first call to any of the + methods is made from the assembly with the configuration + attributes. + + + If you cannot guarantee the order in which log4net calls will be made from + different assemblies you must use programmatic configuration instead, i.e. + call the method directly. + + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets the filename of the configuration file. + + + The filename of the configuration file. + + + + If specified, this is the name of the configuration file to use with + the . This file path is relative to the + application base directory (). + + + The takes priority over the . + + + + + + Gets or sets the extension of the configuration file. + + + The extension of the configuration file. + + + + If specified this is the extension for the configuration file. + The path to the config file is built by using the application + base directory (), + the assembly file name and the config file extension. + + + If the is set to MyExt then + possible config file names would be: MyConsoleApp.exe.MyExt or + MyClassLibrary.dll.MyExt. + + + The takes priority over the . + + + + + + Gets or sets a value indicating whether to watch the configuration file. + + + true if the configuration should be watched, false otherwise. + + + + If this flag is specified and set to true then the framework + will watch the configuration file and will reload the config each time + the file is modified. + + + The config file can only be watched if it is loaded from local disk. + In a No-Touch (Smart Client) deployment where the application is downloaded + from a web server the config file may not reside on the local disk + and therefore it may not be able to watch it. + + + Watching configuration is not supported on the SSCLI. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Configure the repository using the . + The specified must extend the + class otherwise the will not be able to + configure it. + + + The does not extend . + + + + Attempt to load configuration from the local file system + + The assembly that this attribute was defined on. + The repository to configure. + + + + Configure the specified repository using a + + The repository to configure. + the FileInfo pointing to the config file + + + + Attempt to load configuration from a URI + + The assembly that this attribute was defined on. + The repository to configure. + + + + The fully qualified type of the XmlConfiguratorAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The implementation of the interface suitable + for use with the compact framework + + + + This implementation is a simple + mapping between repository name and + object. + + + The .NET Compact Framework 1.0 does not support retrieving assembly + level attributes therefore unlike the DefaultRepositorySelector + this selector does not examine the calling assembly for attributes. + + + Nicko Cadell + + + + Create a new repository selector + + the type of the repositories to create, must implement + + + Create an new compact repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + throw if is null + throw if does not implement + + + + Get the for the specified assembly + + not used + The default + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Get the named + + the name of the repository to lookup + The named + + + Get the named . The default + repository is log4net-default-repository. Other repositories + must be created using the . + If the named repository does not exist an exception is thrown. + + + throw if is null + throw if the does not exist + + + + Create a new repository for the assembly specified + + not used + the type of repository to create, must implement + the repository created + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + If the is null then the + default repository type specified to the constructor is used. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Create a new repository for the repository specified + + the repository to associate with the + the type of repository to create, must implement . + If this param is null then the default repository type is used. + the repository created + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + If the named repository already exists an exception will be thrown. + + + If is null then the default + repository type specified to the constructor is used. + + + throw if is null + throw if the already exists + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + The fully qualified type of the CompactRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Notify the registered listeners that the repository has been created + + The repository that has been created + + + Raises the LoggerRepositoryCreatedEvent + event. + + + + + + The default implementation of the interface. + + + + Uses attributes defined on the calling assembly to determine how to + configure the hierarchy for the repository. + + + Nicko Cadell + Gert Driesen + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Creates a new repository selector. + + The type of the repositories to create, must implement + + + Create an new repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + is . + does not implement . + + + + Gets the for the specified assembly. + + The assembly use to lookup the . + + + The type of the created and the repository + to create can be overridden by specifying the + attribute on the . + + + The default values are to use the + implementation of the interface and to use the + as the name of the repository. + + + The created will be automatically configured using + any attributes defined on + the . + + + The for the assembly + is . + + + + Gets the for the specified repository. + + The repository to use to lookup the . + The for the specified repository. + + + Returns the named repository. If is null + a is thrown. If the repository + does not exist a is thrown. + + + Use to create a repository. + + + is . + does not exist. + + + + Create a new repository for the assembly specified + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the assembly specified. + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The name to assign to the created repository + Set to true to read and apply the assembly attributes + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the specified repository. + + The repository to associate with the . + The type of repository to create, must implement . + If this param is then the default repository type is used. + The new repository. + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + is . + already exists. + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + Aliases a repository to an existing repository. + + The repository to alias. + The repository that the repository is aliased to. + + + The repository specified will be aliased to the repository when created. + The repository must not already exist. + + + When the repository is created it must utilize the same repository type as + the repository it is aliased to, otherwise the aliasing will fail. + + + + is . + -or- + is . + + + + + Notifies the registered listeners that the repository has been created. + + The repository that has been created. + + + Raises the event. + + + + + + Gets the repository name and repository type for the specified assembly. + + The assembly that has a . + in/out param to hold the repository name to use for the assembly, caller should set this to the default value before calling. + in/out param to hold the type of the repository to create for the assembly, caller should set this to the default value before calling. + is . + + + + Configures the repository using information from the assembly. + + The assembly containing + attributes which define the configuration for the repository. + The repository to configure. + + is . + -or- + is . + + + + + Loads the attribute defined plugins on the assembly. + + The assembly that contains the attributes. + The repository to add the plugins to. + + is . + -or- + is . + + + + + Loads the attribute defined aliases on the assembly. + + The assembly that contains the attributes. + The repository to alias to. + + is . + -or- + is . + + + + + The fully qualified type of the DefaultRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Defined error codes that can be passed to the method. + + + + Values passed to the method. + + + Nicko Cadell + + + + A general error + + + + + Error while writing output + + + + + Failed to flush file + + + + + Failed to close file + + + + + Unable to open output file + + + + + No layout specified + + + + + Failed to parse address + + + + + An evaluator that triggers on an Exception type + + + + This evaluator will trigger if the type of the Exception + passed to + is equal to a Type in . /// + + + Drew Schaeffer + + + + The type that causes the trigger to fire. + + + + + Causes subclasses of to cause the trigger to fire. + + + + + Default ctor to allow dynamic creation through a configurator. + + + + + Constructs an evaluator and initializes to trigger on + + the type that triggers this evaluator. + If true, this evaluator will trigger on subclasses of . + + + + The type that triggers this evaluator. + + + + + If true, this evaluator will trigger on subclasses of . + + + + + Is this the triggering event? + + The event to check + This method returns true, if the logging event Exception + Type is . + Otherwise it returns false + + + This evaluator will trigger if the Exception Type of the event + passed to + is . + + + + + + Interface for attaching appenders to objects. + + + + Interface for attaching, removing and retrieving appenders. + + + Nicko Cadell + Gert Driesen + + + + Attaches an appender. + + The appender to add. + + + Add the specified appender. The implementation may + choose to allow or deny duplicate appenders. + + + + + + Gets all attached appenders. + + + A collection of attached appenders. + + + + Gets a collection of attached appenders. + If there are no attached appenders the + implementation should return an empty + collection rather than null. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Returns an attached appender with the specified. + If no appender with the specified name is found null will be + returned. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Appenders may delegate their error handling to an . + + + + Error handling is a particularly tedious to get right because by + definition errors are hard to predict and to reproduce. + + + Nicko Cadell + Gert Driesen + + + + Handles the error and information about the error condition is passed as + a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + The error code associated with the error. + + + Handles the error and information about the error condition is passed as + a parameter. + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + + + See . + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + + + See . + + + + + + Interface for objects that require fixing. + + + + Interface that indicates that the object requires fixing before it + can be taken outside the context of the appender's + method. + + + When objects that implement this interface are stored + in the context properties maps + and + are fixed + (see ) the + method will be called. + + + Nicko Cadell + + + + Get a portable version of this object + + the portable instance of this object + + + Get a portable instance object that represents the current + state of this object. The portable object can be stored + and logged from any thread with identical results. + + + + + + Interface that all loggers implement + + + + This interface supports logging events and testing if a level + is enabled for logging. + + + These methods will not throw exceptions. Note to implementor, ensure + that the implementation of these methods cannot allow an exception + to be thrown to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the logger. + + + The name of the logger. + + + + The name of this logger + + + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + the exception to log, including its stack trace. Pass null to not log an exception. + + + Generates a logging event for the specified using + the and . + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Base interface for all wrappers + + + + Base interface for all wrappers. + + + All wrappers must implement this interface. + + + Nicko Cadell + + + + Get the implementation behind this wrapper object. + + + The object that in implementing this object. + + + + The object that in implementing this + object. The Logger object may not + be the same object as this object because of logger decorators. + This gets the actual underlying objects that is used to process + the log events. + + + + + + Interface used to delay activate a configured object. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then the method + must be called by the container after its all the configured properties have been set + and before the component can be used. + + + Nicko Cadell + + + + Activate the options that were previously set with calls to properties. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then this method must be called + after its properties have been set before the component can be used. + + + + + + Delegate used to handle logger repository creation event notifications + + The which created the repository. + The event args + that holds the instance that has been created. + + + Delegate used to handle logger repository creation event notifications. + + + + + + Provides data for the event. + + + + A + event is raised every time a is created. + + + + + + The created + + + + + Construct instance using specified + + the that has been created + + + Construct instance using specified + + + + + + The that has been created + + + The that has been created + + + + The that has been created + + + + + + Interface used by the to select the . + + + + The uses a + to specify the policy for selecting the correct + to return to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the for the specified assembly. + + The assembly to use to lookup to the + The for the assembly. + + + Gets the for the specified assembly. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. The results of this method must be repeatable, i.e. + when called again with the same arguments the result must be the + save value. + + + + + + Gets the named . + + The name to use to lookup to the . + The named + + Lookup a named . This is the repository created by + calling . + + + + + Creates a new repository for the assembly specified. + + The assembly to use to create the domain to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the domain + specified such that a call to with the + same assembly specified will return the same repository instance. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. + + + + + + Creates a new repository with the name specified. + + The name to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the name + specified such that a call to with the + same name will return the same repository instance. + + + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets an array of all currently defined repositories. + + + An array of the instances created by + this . + + + Gets an array of all of the repositories created by this selector. + + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Test if an triggers an action + + + + Implementations of this interface allow certain appenders to decide + when to perform an appender specific action. + + + The action or behavior triggered is defined by the implementation. + + + Nicko Cadell + + + + Test if this event triggers the action + + The event to check + true if this event triggers the action, otherwise false + + + Return true if this event triggers the action + + + + + + Defines the default set of levels recognized by the system. + + + + Each has an associated . + + + Levels have a numeric that defines the relative + ordering between levels. Two Levels with the same + are deemed to be equivalent. + + + The levels that are recognized by log4net are set for each + and each repository can have different levels defined. The levels are stored + in the on the repository. Levels are + looked up by name from the . + + + When logging at level INFO the actual level used is not but + the value of LoggerRepository.LevelMap["INFO"]. The default value for this is + , but this can be changed by reconfiguring the level map. + + + Each level has a in addition to its . The + is the string that is written into the output log. By default + the display name is the same as the level name, but this can be used to alias levels + or to localize the log output. + + + Some of the predefined levels recognized by the system are: + + + + . + + + . + + + . + + + . + + + . + + + . + + + . + + + + Nicko Cadell + Gert Driesen + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + The display name for this level. This may be localized or otherwise different from the name + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Gets the name of this level. + + + The name of this level. + + + + Gets the name of this level. + + + + + + Gets the value of this level. + + + The value of this level. + + + + Gets the value of this level. + + + + + + Gets the display name of this level. + + + The display name of this level. + + + + Gets the display name of this level. + + + + + + Returns the representation of the current + . + + + A representation of the current . + + + + Returns the level . + + + + + + Compares levels. + + The object to compare against. + true if the objects are equal. + + + Compares the levels of instances, and + defers to base class if the target object is not a + instance. + + + + + + Returns a hash code + + A hash code for the current . + + + Returns a hash code suitable for use in hashing algorithms and data + structures like a hash table. + + + Returns the hash code of the level . + + + + + + Compares this instance to a specified object and returns an + indication of their relative values. + + A instance or to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the + values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + This instance is less than . + + + Zero + This instance is equal to . + + + Greater than zero + + This instance is greater than . + -or- + is . + + + + + + + must be an instance of + or ; otherwise, an exception is thrown. + + + is not a . + + + + Returns a value indicating whether a specified + is greater than another specified . + + A + A + + true if is greater than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than another specified . + + A + A + + true if is less than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is greater than or equal to another specified . + + A + A + + true if is greater than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than or equal to another specified . + + A + A + + true if is less than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have the same value. + + A or . + A or . + + true if the value of is the same as the + value of ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have different values. + + A or . + A or . + + true if the value of is different from + the value of ; otherwise, false. + + + + Compares two levels. + + + + + + Compares two specified instances. + + The first to compare. + The second to compare. + + A 32-bit signed integer that indicates the relative order of the + two values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + is less than . + + + Zero + is equal to . + + + Greater than zero + is greater than . + + + + + + Compares two levels. + + + + + + The level designates a higher level than all the rest. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events + that will presumably lead the application to abort. + + + + + The level designates very severe error events. + Take immediate action, alerts. + + + + + The level designates very severe error events. + Critical condition, critical. + + + + + The level designates very severe error events. + + + + + The level designates error events that might + still allow the application to continue running. + + + + + The level designates potentially harmful + situations. + + + + + The level designates informational messages + that highlight the progress of the application at the highest level. + + + + + The level designates informational messages that + highlight the progress of the application at coarse-grained level. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates the lowest level possible. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a LevelCollection instance. + + list to create a readonly wrapper arround + + A LevelCollection wrapper that is read-only. + + + + + Initializes a new instance of the LevelCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the LevelCollection class + that has the specified initial capacity. + + + The number of elements that the new LevelCollection is initially capable of storing. + + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified LevelCollection. + + The LevelCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + Gets the number of elements actually contained in the LevelCollection. + + + + + Copies the entire LevelCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire LevelCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the LevelCollection. + + The to be added to the end of the LevelCollection. + The index at which the value has been added. + + + + Removes all elements from the LevelCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the LevelCollection. + + The to check for. + true if is found in the LevelCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the LevelCollection. + + The to locate in the LevelCollection. + + The zero-based index of the first occurrence of + in the entire LevelCollection, if found; otherwise, -1. + + + + + Inserts an element into the LevelCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the LevelCollection. + + The to remove from the LevelCollection. + + The specified was not found in the LevelCollection. + + + + + Removes the element at the specified index of the LevelCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the LevelCollection. + + An for the entire LevelCollection. + + + + Gets or sets the number of elements the LevelCollection can contain. + + + + + Adds the elements of another LevelCollection to the current LevelCollection. + + The LevelCollection whose elements should be added to the end of the current LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a array to the current LevelCollection. + + The array whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a collection to the current LevelCollection. + + The collection whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + An evaluator that triggers at a threshold level + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + Nicko Cadell + + + + The threshold for triggering + + + + + Create a new evaluator using the threshold. + + + + Create a new evaluator using the threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Create a new evaluator using the specified threshold. + + the threshold to trigger at + + + Create a new evaluator using the specified threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + the threshold to trigger at + + + The that will cause this evaluator to trigger + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the event level + is equal or higher than the . + Otherwise it returns false + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Mapping between string name and Level object + + + + Mapping between string name and object. + This mapping is held separately for each . + The level name is case insensitive. + + + Nicko Cadell + + + + Mapping from level name to Level object. The + level name is case insensitive + + + + + Construct the level map + + + + Construct the level map. + + + + + + Clear the internal maps of all levels + + + + Clear the internal maps of all levels + + + + + + Lookup a by name + + The name of the Level to lookup + a Level from the map with the name specified + + + Returns the from the + map with the name specified. If the no level is + found then null is returned. + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + + + Create a new Level and add it to the map + + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + the display name to give to the Level + + + Create a new Level and add it to the map + + + + + + Add a Level to the map + + the Level to add + + + Add a Level to the map + + + + + + Return all possible levels as a list of Level objects. + + all possible levels as a list of Level objects + + + Return all possible levels as a list of Level objects. + + + + + + Lookup a named level from the map + + the name of the level to lookup is taken from this level. + If the level is not set on the map then this level is added + the level in the map with the name specified + + + Lookup a named level from the map. The name of the level to lookup is taken + from the property of the + argument. + + + If no level with the specified name is found then the + argument is added to the level map + and returned. + + + + + + The internal representation of caller location information. + + + + This class uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. + + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The declaring type of the method that is + the stack boundary into the logging system for this call. + + + Initializes a new instance of the + class based on the current thread. + + + + + + Constructor + + The fully qualified class name. + The method name. + The file name. + The line number of the method within the file. + + + Initializes a new instance of the + class with the specified data. + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + Gets the stack frames from the stack trace of the caller making the log request + + + + + The fully qualified type of the LocationInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + Exception base type for log4net. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class with + the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Static manager that controls the creation of repositories + + + + Static manager that controls the creation of repositories + + + This class is used by the wrapper managers (e.g. ) + to provide access to the objects. + + + This manager also holds the that is used to + lookup and create repositories. The selector can be set either programmatically using + the property, or by setting the log4net.RepositorySelector + AppSetting in the applications config file to the fully qualified type name of the + selector to use. + + + Nicko Cadell + Gert Driesen + + + + Private constructor to prevent instances. Only static methods should be used. + + + + Private constructor to prevent instances. Only static methods should be used. + + + + + + Hook the shutdown event + + + + On the full .NET runtime, the static constructor hooks up the + AppDomain.ProcessExit and AppDomain.DomainUnload> events. + These are used to shutdown the log4net system as the application exits. + + + + + + Register for ProcessExit and DomainUnload events on the AppDomain + + + + This needs to be in a separate method because the events make + a LinkDemand for the ControlAppDomain SecurityPermission. Because + this is a LinkDemand it is demanded at JIT time. Therefore we cannot + catch the exception in the method itself, we have to catch it in the + caller. + + + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + Returns the default instance. + + + + + + Returns the named logger if it exists. + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified repository. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns the named logger if it exists. + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified assembly's repository. + + + + If the named logger exists (in the specified assembly's repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Retrieves or creates a named logger. + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Retrieves or creates a named logger. + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Shorthand for . + + The repository to lookup in. + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shorthand for . + + the assembly to use to lookup the repository + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The repository to shutdown. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The assembly to use to lookup the repository. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Resets all values contained in this repository instance to their defaults. + + The repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + The assembly to use to lookup the repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Gets an array of all currently defined repositories. + + An array of all the known objects. + + + Gets an array of all currently defined repositories. + + + + + + Gets or sets the repository selector used by the . + + + The repository selector used by the . + + + + The repository selector () is used by + the to create and select repositories + (). + + + The caller to supplies either a string name + or an assembly (if not supplied the assembly is inferred using + ). + + + This context is used by the selector to lookup a specific repository. + + + For the full .NET Framework, the default repository is DefaultRepositorySelector; + for the .NET Compact Framework CompactRepositorySelector is the default + repository. + + + + + + Internal method to get pertinent version info. + + A string of version info. + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + The fully qualified type of the LoggerManager class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initialize the default repository selector + + + + + Implementation of the interface. + + + + This class should be used as the base for all wrapper implementations. + + + Nicko Cadell + Gert Driesen + + + + Constructs a new wrapper for the specified logger. + + The logger to wrap. + + + Constructs a new wrapper for the specified logger. + + + + + + Gets the implementation behind this wrapper object. + + + The object that this object is implementing. + + + + The Logger object may not be the same object as this object + because of logger decorators. + + + This gets the actual underlying objects that is used to process + the log events. + + + + + + The logger that this object is wrapping + + + + + Portable data structure used by + + + + Portable data structure used by + + + Nicko Cadell + + + + The logger name. + + + + The logger name. + + + + + + Level of logging event. + + + + Level of logging event. Level cannot be Serializable + because it is a flyweight. Due to its special serialization it + cannot be declared final either. + + + + + + The application supplied message. + + + + The application supplied message of logging event. + + + + + + The name of thread + + + + The name of thread in which this logging event was generated + + + + + + Gets or sets the local time the event was logged + + + + Prefer using the setter, since local time can be ambiguous. + + + + + + Gets or sets the UTC time the event was logged + + + + The TimeStamp is stored in the UTC time zone. + + + + + + Location information for the caller. + + + + Location information for the caller. + + + + + + String representation of the user + + + + String representation of the user's windows name, + like DOMAIN\username + + + + + + String representation of the identity. + + + + String representation of the current thread's principal identity. + + + + + + The string representation of the exception + + + + The string representation of the exception + + + + + + String representation of the AppDomain. + + + + String representation of the AppDomain. + + + + + + Additional event specific properties + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + + + + Flags passed to the property + + + + Flags passed to the property + + + Nicko Cadell + + + + Fix the MDC + + + + + Fix the NDC + + + + + Fix the rendered message + + + + + Fix the thread name + + + + + Fix the callers location information + + + CAUTION: Very slow to generate + + + + + Fix the callers windows user name + + + CAUTION: Slow to generate + + + + + Fix the domain friendly name + + + + + Fix the callers principal name + + + CAUTION: May be slow to generate + + + + + Fix the exception text + + + + + Fix the event properties. Active properties must implement in order to be eligible for fixing. + + + + + No fields fixed + + + + + All fields fixed + + + + + Partial fields fixed + + + + This set of partial fields gives good performance. The following fields are fixed: + + + + + + + + + + + + + The internal representation of logging events. + + + + When an affirmative decision is made to log then a + instance is created. This instance + is passed around to the different log4net components. + + + This class is of concern to those wishing to extend log4net. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino + + + + Initializes a new instance of the class + from the supplied parameters. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + The name of the logger of this event. + The level of this event. + The message of this event. + The exception for this event. + + + Except , and , + all fields of LoggingEvent are filled when actually needed. Call + to cache all data locally + to prevent inconsistencies. + + This method is called by the log4net framework + to create a logging event. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + The fields in the struct that have already been fixed. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + The parameter should be used to specify which fields in the + struct have been preset. Fields not specified in the + will be captured from the environment if requested or fixed. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Initializes a new instance of the class + using specific data. + + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the time when the current process started. + + + This is the time when this process started. + + + + The TimeStamp is stored internally in UTC and converted to the local time zone for this computer. + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the UTC time when the current process started. + + + This is the UTC time when this process started. + + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the of the logging event. + + + The of the logging event. + + + + Gets the of the logging event. + + + + + + Gets the time of the logging event. + + + The time of the logging event. + + + + The TimeStamp is stored in UTC and converted to the local time zone for this computer. + + + + + + Gets UTC the time of the logging event. + + + The UTC time of the logging event. + + + + + Gets the name of the logger that logged the event. + + + The name of the logger that logged the event. + + + + Gets the name of the logger that logged the event. + + + + + + Gets the location information for this logging event. + + + The location information for this logging event. + + + + The collected information is cached for future use. + + + See the class for more information on + supported frameworks and the different behavior in Debug and + Release builds. + + + + + + Gets the message object used to initialize this event. + + + The message object used to initialize this event. + + + + Gets the message object used to initialize this event. + Note that this event may not have a valid message object. + If the event is serialized the message object will not + be transferred. To get the text of the message the + property must be used + not this property. + + + If there is no defined message object for this event then + null will be returned. + + + + + + Gets the exception object used to initialize this event. + + + The exception object used to initialize this event. + + + + Gets the exception object used to initialize this event. + Note that this event may not have a valid exception object. + If the event is serialized the exception object will not + be transferred. To get the text of the exception the + method must be used + not this property. + + + If there is no defined exception object for this event then + null will be returned. + + + + + + The that this event was created in. + + + + The that this event was created in. + + + + + + Ensure that the repository is set. + + the value for the repository + + + + Gets the message, rendered through the . + + + The message rendered through the . + + + + The collected information is cached for future use. + + + + + + Write the rendered message to a TextWriter + + the writer to write the message to + + + Unlike the property this method + does store the message data in the internal cache. Therefore + if called only once this method should be faster than the + property, however if the message is + to be accessed multiple times then the property will be more efficient. + + + + + + Gets the name of the current thread. + + + The name of the current thread, or the thread ID when + the name is not available. + + + + The collected information is cached for future use. + + + + + + Gets the name of the current user. + + + The name of the current user, or NOT AVAILABLE when the + underlying runtime has no support for retrieving the name of the + current user. + + + + Calls WindowsIdentity.GetCurrent().Name to get the name of + the current windows user. + + + To improve performance, we could cache the string representation of + the name, and reuse that as long as the identity stayed constant. + Once the identity changed, we would need to re-assign and re-render + the string. + + + However, the WindowsIdentity.GetCurrent() call seems to + return different objects every time, so the current implementation + doesn't do this type of caching. + + + Timing for these operations: + + + + Method + Results + + + WindowsIdentity.GetCurrent() + 10000 loops, 00:00:00.2031250 seconds + + + WindowsIdentity.GetCurrent().Name + 10000 loops, 00:00:08.0468750 seconds + + + + This means we could speed things up almost 40 times by caching the + value of the WindowsIdentity.GetCurrent().Name property, since + this takes (8.04-0.20) = 7.84375 seconds. + + + + + + Gets the identity of the current thread principal. + + + The string name of the identity of the current thread principal. + + + + Calls System.Threading.Thread.CurrentPrincipal.Identity.Name to get + the name of the current thread principal. + + + + + + Gets the AppDomain friendly name. + + + The AppDomain friendly name. + + + + Gets the AppDomain friendly name. + + + + + + Additional event specific properties. + + + Additional event specific properties. + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + This property is for events that have been added directly to + this event. The aggregate properties (which include these + event properties) can be retrieved using + and . + + + Once the properties have been fixed this property + returns the combined cached properties. This ensures that updates to + this property are always reflected in the underlying storage. When + returning the combined properties there may be more keys in the + Dictionary than expected. + + + + + + The fixed fields in this event + + + The set of fields that are fixed in this event + + + + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + The data in this event must be fixed before it can be serialized. + + + The method must be called during the + method call if this event + is to be used outside that method. + + + + + + Gets the portable data for this . + + The for this event. + + + A new can be constructed using a + instance. + + + Does a fix of the data + in the logging event before returning the event data. + + + + + + Gets the portable data for this . + + The set of data to ensure is fixed in the LoggingEventData + The for this event. + + + A new can be constructed using a + instance. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Obsolete. Use instead. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Returns this event's exception's rendered using the + . + + + + + + Fix instance fields that hold volatile data. + + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + incurred by calling but it + is essential to maintaining data consistency. + + + Calling is equivalent to + calling passing the parameter + false. + + + See for more + information. + + + + + + Fixes instance fields that hold volatile data. + + Set to true to not fix data that takes a long time to fix. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + The param controls the data that + is fixed. Some of the data that can be fixed takes a long time to + generate, therefore if you do not require those settings to be fixed + they can be ignored by setting the param + to true. This setting will ignore the + and settings. + + + Set to false to ensure that all + settings are fixed. + + + + + + Fix the fields specified by the parameter + + the fields to fix + + + Only fields specified in the will be fixed. + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Lookup a composite property in this event + + the key for the property to lookup + the value for the property + + + This event has composite properties that combine together properties from + several different contexts in the following order: + + + this events properties + + This event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + + Get all the composite properties in this event + + the containing all the properties + + + See for details of the composite properties + stored by the event. + + + This method returns a single containing all the + properties defined for this event. + + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The fully qualified Type of the calling + logger class in the stack frame (i.e. the declaring type of the method). + + + + + The application supplied message of logging event. + + + + + The exception that was thrown. + + + This is not serialized. The string representation + is serialized instead. + + + + + The repository that generated the logging event + + + This is not serialized. + + + + + The fix state for this event + + + These flags indicate which fields have been fixed. + Not serialized. + + + + + Indicated that the internal cache is updateable (ie not fixed) + + + This is a seperate flag to m_fixFlags as it allows incrementel fixing and simpler + changes in the caching strategy. + + + + + The key into the Properties map for the host name value. + + + + + The key into the Properties map for the thread identity value. + + + + + The key into the Properties map for the user name value. + + + + + Implementation of wrapper interface. + + + + This implementation of the interface + forwards to the held by the base class. + + + This logger has methods to allow the caller to log at the following + levels: + + + + DEBUG + + The and methods log messages + at the DEBUG level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + INFO + + The and methods log messages + at the INFO level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + WARN + + The and methods log messages + at the WARN level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + ERROR + + The and methods log messages + at the ERROR level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + FATAL + + The and methods log messages + at the FATAL level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + + The values for these levels and their semantic meanings can be changed by + configuring the for the repository. + + + Nicko Cadell + Gert Driesen + + + + Construct a new wrapper for the specified logger. + + The logger to wrap. + + + Construct a new wrapper for the specified logger. + + + + + + Virtual method called when the configuration of the repository changes + + the repository holding the levels + + + Virtual method called when the configuration of the repository changes + + + + + + Logs a message object with the DEBUG level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + DEBUG level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the DEBUG level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the DEBUG level including + the stack trace of the passed + as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + INFO level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the INFO level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the WARN level. + + the message object to log + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + WARN level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the WARN level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the WARN level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the ERROR level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + ERROR level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the ERROR level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the ERROR level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the FATAL level. + + The message object to log. + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + FATAL level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the FATAL level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the FATAL level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Checks if this logger is enabled for the DEBUG + level. + + + true if this logger is enabled for DEBUG events, + false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + + For some log Logger object, when you write: + + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed, then you should write: + + + if (log.IsDebugEnabled()) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in IsDebugEnabled and once in + the Debug. This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. + + + + + + Checks if this logger is enabled for the INFO level. + + + true if this logger is enabled for INFO events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the WARN level. + + + true if this logger is enabled for WARN events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the ERROR level. + + + true if this logger is enabled for ERROR events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Checks if this logger is enabled for the FATAL level. + + + true if this logger is enabled for FATAL events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Event handler for the event + + the repository + Empty + + + + The fully qualified name of this declaring type not the type of any subclass. + + + + + provides method information without actually referencing a System.Reflection.MethodBase + as that would require that the containing assembly is loaded. + + + + + + constructs a method item for an unknown method. + + + + + constructs a method item from the name of the method. + + + + + + constructs a method item from the name of the method and its parameters. + + + + + + + constructs a method item from a method base by determining the method name and its parameters. + + + + + + Gets the method name of the caller making the logging + request. + + + The method name of the caller making the logging + request. + + + + Gets the method name of the caller making the logging + request. + + + + + + Gets the method parameters of the caller making + the logging request. + + + The method parameters of the caller making + the logging request + + + + Gets the method parameters of the caller making + the logging request. + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + A SecurityContext used by log4net when interacting with protected resources + + + + A SecurityContext used by log4net when interacting with protected resources + for example with operating system services. This can be used to impersonate + a principal that has been granted privileges on the system resources. + + + Nicko Cadell + + + + Impersonate this SecurityContext + + State supplied by the caller + An instance that will + revoke the impersonation of this SecurityContext, or null + + + Impersonate this security context. Further calls on the current + thread should now be made in the security context provided + by this object. When the result + method is called the security + context of the thread should be reverted to the state it was in + before was called. + + + + + + The providers default instances. + + + + A configured component that interacts with potentially protected system + resources uses a to provide the elevated + privileges required. If the object has + been not been explicitly provided to the component then the component + will request one from this . + + + By default the is + an instance of which returns only + objects. This is a reasonable default + where the privileges required are not know by the system. + + + This default behavior can be overridden by subclassing the + and overriding the method to return + the desired objects. The default provider + can be replaced by programmatically setting the value of the + property. + + + An alternative is to use the log4net.Config.SecurityContextProviderAttribute + This attribute can be applied to an assembly in the same way as the + log4net.Config.XmlConfiguratorAttribute". The attribute takes + the type to use as the as an argument. + + + Nicko Cadell + + + + The default provider + + + + + Gets or sets the default SecurityContextProvider + + + The default SecurityContextProvider + + + + The default provider is used by configured components that + require a and have not had one + given to them. + + + By default this is an instance of + that returns objects. + + + The default provider can be set programmatically by setting + the value of this property to a sub class of + that has the desired behavior. + + + + + + Protected default constructor to allow subclassing + + + + Protected default constructor to allow subclassing + + + + + + Create a SecurityContext for a consumer + + The consumer requesting the SecurityContext + An impersonation context + + + The default implementation is to return a . + + + Subclasses should override this method to provide their own + behavior. + + + + + + provides stack frame information without actually referencing a System.Diagnostics.StackFrame + as that would require that the containing assembly is loaded. + + + + + + returns a stack frame item from a stack frame. This + + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + An evaluator that triggers after specified number of seconds. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + Robert Sevcik + + + + The time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + The UTC time of last check. This gets updated when the object is created and when the evaluator triggers. + + + + + The default time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + Create a new evaluator using the time threshold in seconds. + + + + Create a new evaluator using the time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Create a new evaluator using the specified time threshold in seconds. + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + Create a new evaluator using the specified time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + The time threshold in seconds to trigger after + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the specified time period + has passed since last check.. + Otherwise it returns false + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Delegate used to handle creation of new wrappers. + + The logger to wrap in a wrapper. + + + Delegate used to handle creation of new wrappers. This delegate + is called from the + method to construct the wrapper for the specified logger. + + + The delegate to use is supplied to the + constructor. + + + + + + Maps between logger objects and wrapper objects. + + + + This class maintains a mapping between objects and + objects. Use the method to + lookup the for the specified . + + + New wrapper instances are created by the + method. The default behavior is for this method to delegate construction + of the wrapper to the delegate supplied + to the constructor. This allows specialization of the behavior without + requiring subclassing of this type. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the + + The handler to use to create the wrapper objects. + + + Initializes a new instance of the class with + the specified handler to create the wrapper objects. + + + + + + Gets the wrapper object for the specified logger. + + The wrapper object for the specified logger + + + If the logger is null then the corresponding wrapper is null. + + + Looks up the wrapper it it has previously been requested and + returns it. If the wrapper has never been requested before then + the virtual method is + called. + + + + + + Gets the map of logger repositories. + + + Map of logger repositories. + + + + Gets the hashtable that is keyed on . The + values are hashtables keyed on with the + value being the corresponding . + + + + + + Creates the wrapper object for the specified logger. + + The logger to wrap in a wrapper. + The wrapper object for the logger. + + + This implementation uses the + passed to the constructor to create the wrapper. This method + can be overridden in a subclass. + + + + + + Called when a monitored repository shutdown event is received. + + The that is shutting down + + + This method is called when a that this + is holding loggers for has signaled its shutdown + event . The default + behavior of this method is to release the references to the loggers + and their wrappers generated for this repository. + + + + + + Event handler for repository shutdown event. + + The sender of the event. + The event args. + + + + Map of logger repositories to hashtables of ILogger to ILoggerWrapper mappings + + + + + The handler to use to create the extension wrapper objects. + + + + + Internal reference to the delegate used to register for repository shutdown events. + + + + + Formats a as "HH:mm:ss,fff". + + + + Formats a in the format "HH:mm:ss,fff" for example, "15:49:37,459". + + + Nicko Cadell + Gert Driesen + + + + Renders the date into a string. Format is "HH:mm:ss". + + The date to render into a string. + The string builder to write to. + + + Subclasses should override this method to render the date + into a string using a precision up to the second. This method + will be called at most once per second and the result will be + reused if it is needed again during the same second. + + + + + + Renders the date into a string. Format is "HH:mm:ss,fff". + + The date to render into a string. + The writer to write to. + + + Uses the method to generate the + time string up to the seconds and then appends the current + milliseconds. The results from are + cached and is called at most once + per second. + + + Sub classes should override + rather than . + + + + + + String constant used to specify AbsoluteTimeDateFormat in layouts. Current value is ABSOLUTE. + + + + + String constant used to specify DateTimeDateFormat in layouts. Current value is DATE. + + + + + String constant used to specify ISO8601DateFormat in layouts. Current value is ISO8601. + + + + + Last stored time with precision up to the second. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Formats a as "dd MMM yyyy HH:mm:ss,fff" + + + + Formats a in the format + "dd MMM yyyy HH:mm:ss,fff" for example, + "06 Nov 1994 15:49:37,459". + + + Nicko Cadell + Gert Driesen + Angelika Schnagl + + + + Default constructor. + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats a DateTime in the format "dd MMM yyyy HH:mm:ss" + for example, "06 Nov 1994 15:49:37". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + The format info for the invariant culture. + + + + + Render a as a string. + + + + Interface to abstract the rendering of a + instance into a string. + + + The method is used to render the + date to a text writer. + + + Nicko Cadell + Gert Driesen + + + + Formats the specified date as a string. + + The date to format. + The writer to write to. + + + Format the as a string and write it + to the provided. + + + + + + Formats the as "yyyy-MM-dd HH:mm:ss,fff". + + + + Formats the specified as a string: "yyyy-MM-dd HH:mm:ss,fff". + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats the date specified as a string: "yyyy-MM-dd HH:mm:ss". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + Formats the using the method. + + + + Formats the using the method. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The format string. + + + Initializes a new instance of the class + with the specified format string. + + + The format string must be compatible with the options + that can be supplied to . + + + + + + Formats the date using . + + The date to convert to a string. + The writer to write to. + + + Uses the date format string supplied to the constructor to call + the method to format the date. + + + + + + The format string used to format the . + + + + The format string must be compatible with the options + that can be supplied to . + + + + + + This filter drops all . + + + + You can add this filter to the end of a filter chain to + switch from the default "accept all unless instructed otherwise" + filtering behavior to a "deny all unless instructed otherwise" + behavior. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + + Always returns the integer constant + + the LoggingEvent to filter + Always returns + + + Ignores the event being logged and just returns + . This can be used to change the default filter + chain behavior from to . This filter + should only be used as the last filter in the chain + as any further filters will be ignored! + + + + + + The return result from + + + + The return result from + + + + + + The log event must be dropped immediately without + consulting with the remaining filters, if any, in the chain. + + + + + This filter is neutral with respect to the log event. + The remaining filters, if any, should be consulted for a final decision. + + + + + The log event must be logged immediately without + consulting with the remaining filters, if any, in the chain. + + + + + Subclass this type to implement customized logging event filtering + + + + Users should extend this class to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Points to the next filter in the filter chain. + + + + See for more information. + + + + + + Initialize the filter with the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Typically filter's options become active immediately on set, + however this method must still be called. + + + + + + Decide if the should be logged through an appender. + + The to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + This method is marked abstract and must be implemented + in a subclass. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + Implement this interface to provide customized logging event filtering + + + + Users should implement this interface to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Decide if the logging event should be logged through an appender. + + The LoggingEvent to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + This is a very simple filter based on matching. + + + + The filter admits two options and + . If there is an exact match between the value + of the option and the of the + , then the method returns in + case the option value is set + to true, if it is false then + is returned. If the does not match then + the result will be . + + + Nicko Cadell + Gert Driesen + + + + flag to indicate if the filter should on a match + + + + + the to match against + + + + + Default constructor + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + The level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Tests if the of the logging event matches that of the filter + + the event to filter + see remarks + + + If the of the event matches the level of the + filter then the result of the function depends on the + value of . If it is true then + the function will return , it it is false then it + will return . If the does not match then + the result will be . + + + + + + This is a simple filter based on matching. + + + + The filter admits three options and + that determine the range of priorities that are matched, and + . If there is a match between the range + of priorities and the of the , then the + method returns in case the + option value is set to true, if it is false + then is returned. If there is no match, is returned. + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when matching a + + + + + the minimum value to match + + + + + the maximum value to match + + + + + Default constructor + + + + + when matching and + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Set the minimum matched + + + + The minimum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Sets the maximum matched + + + + The maximum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Check if the event should be logged. + + the logging event to check + see remarks + + + If the of the logging event is outside the range + matched by this filter then + is returned. If the is matched then the value of + is checked. If it is true then + is returned, otherwise + is returned. + + + + + + Simple filter to match a string in the event's logger name. + + + + The works very similar to the . It admits two + options and . If the + of the starts + with the value of the option, then the + method returns in + case the option value is set to true, + if it is false then is returned. + + + Daniel Cazzulino + + + + Flag to indicate the behavior when we have a match + + + + + The logger name string to substring match against the event + + + + + Default constructor + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + This filter will attempt to match this value against logger name in + the following way. The match will be done against the beginning of the + logger name (using ). The match is + case sensitive. If a match is found then + the result depends on the value of . + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the equals the beginning of + the incoming () + then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a keyed string in the + + + + Simple filter to match a keyed string in the + + + As the MDC has been replaced with layered properties the + should be used instead. + + + Nicko Cadell + Gert Driesen + + + + Simple filter to match a string in the + + + + Simple filter to match a string in the + + + As the MDC has been replaced with named stacks stored in the + properties collections the should + be used instead. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Sets the to "NDC". + + + + + + Simple filter to match a string an event property + + + + Simple filter to match a string in the value for a + specific event property + + + Nicko Cadell + + + + The key to use to lookup the string from the event properties + + + + + Default constructor + + + + + The key to lookup in the event properties and then match against. + + + + The key name to use to lookup in the properties map of the + . The match will be performed against + the value of this property if it exists. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The event property for the is matched against + the . + If the occurs as a substring within + the property value then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a string in the rendered message + + + + Simple filter to match a string in the rendered message + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when we have a match + + + + + The string to substring match against the message + + + + + A string regex to match + + + + + A regex object to match (generated from m_stringRegexToMatch) + + + + + Default constructor + + + + + Initialize and precompile the Regex if required + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + when matching or + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Sets the static string to match + + + + The string that will be substring matched against + the rendered message. If the message contains this + string then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Sets the regular expression to match + + + + The regular expression pattern that will be matched against + the rendered message. If the message matches this + pattern then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the occurs as a substring within + the message then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + The log4net Global Context. + + + + The GlobalContext provides a location for global debugging + information to be stored. + + + The global context has a properties map and these properties can + be included in the output of log messages. The + supports selecting and outputing these properties. + + + By default the log4net:HostName property is set to the name of + the current machine. + + + + + GlobalContext.Properties["hostname"] = Environment.MachineName; + + + + Nicko Cadell + + + + Private Constructor. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + The global properties map. + + + The global properties map. + + + + The global properties map. + + + + + + The global context properties instance + + + + + The ILog interface is use by application to log messages into + the log4net framework. + + + + Use the to obtain logger instances + that implement this interface. The + static method is used to get logger instances. + + + This class contains methods for logging at different levels and also + has properties for determining if those logging levels are + enabled in the current configuration. + + + This interface can be implemented in different ways. This documentation + specifies reasonable behavior that a caller can expect from the actual + implementation, however different implementations reserve the right to + do things differently. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + Log a message object with the level. + + Log a message object with the level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Logs a message object with the INFO level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + For some ILog interface log, when you write: + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, string construction and concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed (who isn't), then you should write: + + + if (log.IsDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in and once in + the . This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. This is the preferred style of logging. + + Alternatively if your logger is available statically then the is debug + enabled state can be stored in a static variable like this: + + + private static readonly bool isDebugEnabled = log.IsDebugEnabled; + + + Then when you come to log you can write: + + + if (isDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way the debug enabled state is only queried once + when the class is loaded. Using a private static readonly + variable is the most efficient because it is a run time constant + and can be heavily optimized by the JIT compiler. + + + Of course if you use a static readonly variable to + hold the enabled state of the logger then you cannot + change the enabled state at runtime to vary the logging + that is produced. You have to decide if you need absolute + speed or runtime flexibility. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + A flexible layout configurable with pattern string that re-evaluates on each call. + + + This class is built on and provides all the + features and capabilities of PatternLayout. PatternLayout is a 'static' class + in that its layout is done once at configuration time. This class will recreate + the layout on each reference. + One important difference between PatternLayout and DynamicPatternLayout is the + treatment of the Header and Footer parameters in the configuration. The Header and Footer + parameters for DynamicPatternLayout must be syntactically in the form of a PatternString, + but should not be marked as type log4net.Util.PatternString. Doing so causes the + pattern to be statically converted at configuration time and causes DynamicPatternLayout + to perform the same as PatternLayout. + Please see for complete documentation. + + <layout type="log4net.Layout.DynamicPatternLayout"> + <param name="Header" value="%newline**** Trace Opened Local: %date{yyyy-MM-dd HH:mm:ss.fff} UTC: %utcdate{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + <param name="Footer" value="**** Trace Closed %date{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + </layout> + + + + + + The header PatternString + + + + + The footer PatternString + + + + + Constructs a DynamicPatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + + + + Constructs a DynamicPatternLayout using the supplied conversion pattern + + the pattern to use + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + The pattern will be formatted on each get operation. + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + The pattern will be formatted on each get operation. + + + + + A Layout that renders only the Exception text from the logging event + + + + A Layout that renders only the Exception text from the logging event. + + + This Layout should only be used with appenders that utilize multiple + layouts (e.g. ). + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Constructs a ExceptionLayout + + + + + + Activate component options + + + + Part of the component activation + framework. + + + This method does nothing as options become effective immediately. + + + + + + Gets the exception text from the logging event + + The TextWriter to write the formatted event to + the event being logged + + + Write the exception string to the . + The exception string is retrieved from . + + + + + + Interface implemented by layout objects + + + + An object is used to format a + as text. The method is called by an + appender to transform the into a string. + + + The layout can also supply and + text that is appender before any events and after all the events respectively. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text and output to a writer. + + + If the caller does not have a and prefers the + event to be formatted as a then the following + code can be used to format the event into a . + + + StringWriter writer = new StringWriter(); + Layout.Format(writer, loggingEvent); + string formattedEvent = writer.ToString(); + + + + + + The content type output by this layout. + + The content type + + + The content type output by this layout. + + + This is a MIME type e.g. "text/plain". + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handle exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + + + + Interface for raw layout objects + + + + Interface used to format a + to an object. + + + This interface should not be confused with the + interface. This interface is used in + only certain specialized situations where a raw object is + required rather than a formatted string. The + is not generally useful than this interface. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The event to format + returns the formatted event + + + Implement this method to create your own layout format. + + + + + + Adapts any to a + + + + Where an is required this adapter + allows a to be specified. + + + Nicko Cadell + Gert Driesen + + + + The layout to adapt + + + + + Construct a new adapter + + the layout to adapt + + + Create the adapter for the specified . + + + + + + Format the logging event as an object. + + The event to format + returns the formatted event + + + Format the logging event as an object. + + + Uses the object supplied to + the constructor to perform the formatting. + + + + + + Extend this abstract class to create your own log layout format. + + + + This is the base implementation of the + interface. Most layout objects should extend this class. + + + + + + Subclasses must implement the + method. + + + Subclasses should set the in their default + constructor. + + + + Nicko Cadell + Gert Driesen + + + + The header text + + + + See for more information. + + + + + + The footer text + + + + See for more information. + + + + + + Flag indicating if this layout handles exceptions + + + + false if this layout handles exceptions + + + + + + Empty default constructor + + + + Empty default constructor + + + + + + Activate component options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This method must be implemented by the subclass. + + + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text. + + + + + + Convenience method for easily formatting the logging event into a string variable. + + + + Creates a new StringWriter instance to store the formatted logging event. + + + + + The content type output by this layout. + + The content type is "text/plain" + + + The content type output by this layout. + + + This base class uses the value "text/plain". + To change this value a subclass must override this + property. + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handles exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + Set this value to override a this default setting. The default + value is true, this layout does not handle the exception. + + + + + + A flexible layout configurable with pattern string. + + + + The goal of this class is to a + as a string. The results + depend on the conversion pattern. + + + The conversion pattern is closely related to the conversion + pattern of the printf function in C. A conversion pattern is + composed of literal text and format control expressions called + conversion specifiers. + + + You are free to insert any literal text within the conversion + pattern. + + + Each conversion specifier starts with a percent sign (%) and is + followed by optional format modifiers and a conversion + pattern name. The conversion pattern name specifies the type of + data, e.g. logger, level, date, thread name. The format + modifiers control such things as field width, padding, left and + right justification. The following is a simple example. + + + Let the conversion pattern be "%-5level [%thread]: %message%newline" and assume + that the log4net environment was set to use a PatternLayout. Then the + statements + + + ILog log = LogManager.GetLogger(typeof(TestApp)); + log.Debug("Message 1"); + log.Warn("Message 2"); + + would yield the output + + DEBUG [main]: Message 1 + WARN [main]: Message 2 + + + Note that there is no explicit separator between text and + conversion specifiers. The pattern parser knows when it has reached + the end of a conversion specifier when it reads a conversion + character. In the example above the conversion specifier + %-5level means the level of the logging event should be left + justified to a width of five characters. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + a + Equivalent to appdomain + + + appdomain + + Used to output the friendly name of the AppDomain where the + logging event was generated. + + + + aspnet-cache + + + Used to output all cache items in the case of %aspnet-cache or just one named item if used as %aspnet-cache{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-context + + + Used to output all context items in the case of %aspnet-context or just one named item if used as %aspnet-context{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-request + + + Used to output all request parameters in the case of %aspnet-request or just one named param if used as %aspnet-request{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-session + + + Used to output all session items in the case of %aspnet-session or just one named item if used as %aspnet-session{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + c + Equivalent to logger + + + C + Equivalent to type + + + class + Equivalent to type + + + d + Equivalent to date + + + date + + + Used to output the date of the logging event in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + exception + + + Used to output the exception passed in with the log message. + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + + + F + Equivalent to file + + + file + + + Used to output the file name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + WARNING Generating caller information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + l + Equivalent to location + + + L + Equivalent to line + + + location + + + Used to output location information of the caller which generated + the logging event. + + + The location information depends on the CLI implementation but + usually consists of the fully qualified name of the calling + method followed by the callers source the file name and line + number between parentheses. + + + The location information can be very useful. However, its + generation is extremely slow. Its use should be avoided + unless execution speed is not an issue. + + + See the note below on the availability of caller location information. + + + + + level + + + Used to output the level of the logging event. + + + + + line + + + Used to output the line number from where the logging request + was issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + logger + + + Used to output the logger of the logging event. The + logger conversion specifier can be optionally followed by + precision specifier, that is a decimal constant in + brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the logger name will be + printed. By default the logger name is printed in full. + + + For example, for the logger name "a.b.c" the pattern + %logger{2} will output "b.c". + + + + + m + Equivalent to message + + + M + Equivalent to method + + + message + + + Used to output the application supplied message associated with + the logging event. + + + + + mdc + + + The MDC (old name for the ThreadContext.Properties) is now part of the + combined event properties. This pattern is supported for compatibility + but is equivalent to property. + + + + + method + + + Used to output the method name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + n + Equivalent to newline + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + ndc + + + Used to output the NDC (nested diagnostic context) associated + with the thread that generated the logging event. + + + + + p + Equivalent to level + + + P + Equivalent to property + + + properties + Equivalent to property + + + property + + + Used to output the an event specific property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are added to events by loggers or appenders. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the event properties + + The event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + r + Equivalent to timestamp + + + stacktrace + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktrace{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + This pattern is not available for Compact Framework assemblies. + + + + + stacktracedetail + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktracedetail{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + This pattern is not available for Compact Framework assemblies. + + + + + t + Equivalent to thread + + + timestamp + + + Used to output the number of milliseconds elapsed since the start + of the application until the creation of the logging event. + + + + + thread + + + Used to output the name of the thread that generated the + logging event. Uses the thread number if no name is available. + + + + + type + + + Used to output the fully qualified type name of the caller + issuing the logging request. This conversion specifier + can be optionally followed by precision specifier, that + is a decimal constant in brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the class name will be + printed. By default the class name is output in fully qualified form. + + + For example, for the class name "log4net.Layout.PatternLayout", the + pattern %type{1} will output "PatternLayout". + + + WARNING Generating the caller class information is + slow. Thus, its use should be avoided unless execution speed is + not an issue. + + + See the note below on the availability of caller location information. + + + + + u + Equivalent to identity + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + WARNING Generating caller WindowsIdentity information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + w + Equivalent to username + + + x + Equivalent to ndc + + + X + Equivalent to mdc + + + % + + + The sequence %% outputs a single percent sign. + + + + + + The single letter patterns are deprecated in favor of the + longer more descriptive pattern names. + + + By default the relevant information is output as is. However, + with the aid of format modifiers it is possible to change the + minimum field width, the maximum field width and justification. + + + The optional format modifier is placed between the percent sign + and the conversion pattern name. + + + The first optional format modifier is the left justification + flag which is just the minus (-) character. Then comes the + optional minimum field width modifier. This is a decimal + constant that represents the minimum number of characters to + output. If the data item requires fewer characters, it is padded on + either the left or the right until the minimum width is + reached. The default is to pad on the left (right justify) but you + can specify right padding with the left justification flag. The + padding character is space. If the data item is larger than the + minimum field width, the field is expanded to accommodate the + data. The value is never truncated. + + + This behavior can be changed using the maximum field + width modifier which is designated by a period followed by a + decimal constant. If the data item is longer than the maximum + field, then the extra characters are removed from the + beginning of the data item and not from the end. For + example, it the maximum field width is eight and the data item is + ten characters long, then the first two characters of the data item + are dropped. This behavior deviates from the printf function in C + where truncation is done from the end. + + + Below are various format modifier examples for the logger + conversion specifier. + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Format modifierleft justifyminimum widthmaximum widthcomment
%20loggerfalse20none + + Left pad with spaces if the logger name is less than 20 + characters long. + +
%-20loggertrue20none + + Right pad with spaces if the logger + name is less than 20 characters long. + +
%.30loggerNAnone30 + + Truncate from the beginning if the logger + name is longer than 30 characters. + +
%20.30loggerfalse2030 + + Left pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
%-20.30loggertrue2030 + + Right pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
+
+ + Note about caller location information.
+ The following patterns %type %file %line %method %location %class %C %F %L %l %M + all generate caller location information. + Location information uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. +
+ + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + + Additional pattern converters may be registered with a specific + instance using the method. + +
+ + This is a more detailed pattern. + %timestamp [%thread] %level %logger %ndc - %message%newline + + + A similar pattern except that the relative time is + right padded if less than 6 digits, thread name is right padded if + less than 15 characters and truncated if longer and the logger + name is left padded if shorter than 30 characters and truncated if + longer. + %-6timestamp [%15.15thread] %-5level %30.30logger %ndc - %message%newline + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino +
+ + + Default pattern string for log output. + + + + Default pattern string for log output. + Currently set to the string "%message%newline" + which just prints the application supplied message. + + + + + + A detailed conversion pattern + + + + A conversion pattern which includes Time, Thread, Logger, and Nested Context. + Current value is %timestamp [%thread] %level %logger %ndc - %message%newline. + + + + + + Internal map of converter identifiers to converter types. + + + + This static map is overridden by the m_converterRegistry instance map + + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternLayout only + + + + + Initialize the global registry + + + + Defines the builtin global rules. + + + + + + Constructs a PatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + As per the contract the + method must be called after the properties on this object have been + configured. + + + + + + Constructs a PatternLayout using the supplied conversion pattern + + the pattern to use + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + When using this constructor the method + need not be called. This may not be the case when using a subclass. + + + + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Create the pattern parser instance + + the pattern to parse + The that will format the event + + + Creates the used to parse the conversion string. Sets the + global and instance rules on the . + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a formatted string as specified by the conversion pattern. + + the event being logged + The TextWriter to write the formatted event to + + + Parse the using the patter format + specified in the property. + + + + + + Add a converter to this PatternLayout + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternLayout + + the name of the conversion pattern for this converter + the type of the converter + + + Add a named pattern converter to this instance. This + converter will be used in the formatting of the event. + This method must be called before . + + + The specified must extend the + type. + + + + + + Write the event appdomain name to the output + + + + Writes the to the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Write the event appdomain name to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output . + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. If no property has been set, all key value pairs from the Cache will + be written to the output. + + + + + + Converter for items in the . + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net HttpContext item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. + + + + + + Abstract class that provides access to the current HttpContext () that + derived classes need. + + + This class handles the case when HttpContext.Current is null by writing + to the writer. + + Ron Grabowski + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. If no property has been set, all key value pairs from the Session will + be written to the output. + + + + + + Date pattern converter, uses a to format + the date of a . + + + + Render the to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,yyyy" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter pattern based on the property. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Convert the pattern into the rendered message + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the exception text to the output + + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Nicko Cadell + + + + Default constructor + + + + + Write the exception text to the output + + that will receive the formatted result. + the event being logged + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception or the exception property specified + by the Option value does not exist then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Recognized values for the Option parameter are: + + + + Message + + + Source + + + StackTrace + + + TargetSite + + + HelpLink + + + + + + + Writes the caller location file name to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location file name to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Write the caller location info to the output + + + + Writes the to the output writer. + + + Nicko Cadell + + + + Write the caller location info to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Writes the event identity to the output + + + + Writes the value of the to + the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Writes the event identity to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the + to + the output . + + + + + + Write the event level to the output + + + + Writes the display name of the event + to the writer. + + + Nicko Cadell + + + + Write the event level to the output + + that will receive the formatted result. + the event being logged + + + Writes the of the + to the . + + + + + + Write the caller location line number to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location line number to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Converter for logger name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the logger + + the event being logged + The fully qualified logger name + + + Returns the of the . + + + + + + Writes the event message to the output + + + + Uses the method + to write out the event message. + + + Nicko Cadell + + + + Writes the event message to the output + + that will receive the formatted result. + the event being logged + + + Uses the method + to write out the event message. + + + + + + Write the method name to the output + + + + Writes the caller location to + the output. + + + Nicko Cadell + + + + Write the method name to the output + + that will receive the formatted result. + the event being logged + + + Writes the caller location to + the output. + + + + + + Converter to output and truncate '.' separated strings + + + + This abstract class supports truncating a '.' separated string + to show a specified number of elements from the right hand side. + This is used to truncate class names that are fully qualified. + + + Subclasses should override the method to + return the fully qualified string. + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Get the fully qualified string data + + the event being logged + the fully qualified name + + + Overridden by subclasses to get the fully qualified name before the + precision is applied to it. + + + Return the fully qualified '.' (dot/period) separated string. + + + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + Render the to the precision + specified by the property. + + + + + The fully qualified type of the NamedPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event NDC + + + + Outputs the value of the event property named NDC. + + + The should be used instead. + + + Nicko Cadell + + + + Write the event NDC to the output + + that will receive the formatted result. + the event being logged + + + As the thread context stacks are now stored in named event properties + this converter simply looks up the value of the NDC property. + + + The should be used instead. + + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + Nicko Cadell + + + + Initializes a new instance of the class. + + + + + Flag indicating if this converter handles the logging event exception + + false if this converter handles the logging event exception + + + If this converter handles the exception object contained within + , then this property should be set to + false. Otherwise, if the layout ignores the exception + object, then the property should be set to true. + + + Set this value to override a this default setting. The default + value is true, this converter does not handle the exception. + + + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + + Flag indicating if this converter handles exceptions + + + false if this converter handles exceptions + + + + + Property pattern converter + + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + the event being logged + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Converter to output the relative time of the event + + + + Converter to output the time of the event relative to the start of the program. + + + Nicko Cadell + + + + Write the relative time to the output + + that will receive the formatted result. + the event being logged + + + Writes out the relative time of the event in milliseconds. + That is the number of milliseconds between the event + and the . + + + + + + Helper method to get the time difference between two DateTime objects + + start time (in the current local time zone) + end time (in the current local time zone) + the time difference in milliseconds + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + Adam Davies + + + + The fully qualified type of the StackTraceDetailPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + Michael Cromwell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the strack frames to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Returns the Name of the method + + + This method was created, so this class could be used as a base class for StackTraceDetailPatternConverter + string + + + + The fully qualified type of the StackTracePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event thread name + + + + Writes the to the output. + + + Nicko Cadell + + + + Write the ThreadName to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the . + + + + + + Pattern converter for the class name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the class + + the event being logged + The fully qualified type name for the caller location + + + Returns the of the . + + + + + + Converter to include event user name + + Douglas de la Torre + Nicko Cadell + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + + + Write the TimeStamp to the output + + + + Date pattern converter, uses a to format + the date of a . + + + Uses a to format the + in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the TimeStamp to the output + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone, this is converted + to Universal time before it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Type converter for the interface + + + + Used to convert objects to the interface. + Supports converting from the interface to + the interface using the . + + + Nicko Cadell + Gert Driesen + + + + Can the sourceType be converted to an + + the source to be to be converted + true if the source type can be converted to + + + Test if the can be converted to a + . Only is supported + as the . + + + + + + Convert the value to a object + + the value to convert + the object + + + Convert the object to a + object. If the object + is a then the + is used to adapt between the two interfaces, otherwise an + exception is thrown. + + + + + + Extract the value of a property from the + + + + Extract the value of a property from the + + + Nicko Cadell + + + + Constructs a RawPropertyLayout + + + + + The name of the value to lookup in the LoggingEvent Properties collection. + + + Value to lookup in the LoggingEvent Properties collection + + + + String name of the property to lookup in the . + + + + + + Lookup the property for + + The event to format + returns property value + + + Looks up and returns the object value of the property + named . If there is no property defined + with than name then null will be returned. + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in local time. To format the time stamp + in universal time use . + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawUtcTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in universal time. To format the time stamp + in local time use . + + + + + + A very simple layout + + + + SimpleLayout consists of the level of the log statement, + followed by " - " and then the log message itself. For example, + + DEBUG - Hello world + + + + Nicko Cadell + Gert Driesen + + + + Constructs a SimpleLayout + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a simple formatted output. + + the event being logged + The TextWriter to write the formatted event to + + + Formats the event as the level of the even, + followed by " - " and then the log message itself. The + output is terminated by a newline. + + + + + + Layout that formats the log events as XML elements. + + + + The output of the consists of a series of + log4net:event elements. It does not output a complete well-formed XML + file. The output is designed to be included as an external entity + in a separate file to form a correct XML file. + + + For example, if abc is the name of the file where + the output goes, then a well-formed XML file would + be: + + + <?xml version="1.0" ?> + + <!DOCTYPE log4net:events SYSTEM "log4net-events.dtd" [<!ENTITY data SYSTEM "abc">]> + + <log4net:events version="1.2" xmlns:log4net="http://logging.apache.org/log4net/schemas/log4net-events-1.2> + &data; + </log4net:events> + + + This approach enforces the independence of the + and the appender where it is embedded. + + + The version attribute helps components to correctly + interpret output generated by . The value of + this attribute should be "1.2" for release 1.2 and later. + + + Alternatively the Header and Footer properties can be + configured to output the correct XML header, open tag and close tag. + When setting the Header and Footer properties it is essential + that the underlying data store not be appendable otherwise the data + will become invalid XML. + + + Nicko Cadell + Gert Driesen + + + + Constructs an XmlLayout + + + + + Constructs an XmlLayout. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SmtpAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The prefix to use for all element names + + + + The default prefix is log4net. Set this property + to change the prefix. If the prefix is set to an empty string + then no prefix will be written. + + + + + + Set whether or not to base64 encode the message. + + + + By default the log message will be written as text to the xml + output. This can cause problems when the message contains binary + data. By setting this to true the contents of the message will be + base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the log message. + + + + + + Set whether or not to base64 encode the property values. + + + + By default the properties will be written as text to the xml + output. This can cause problems when one or more properties contain + binary data. By setting this to true the values of the properties + will be base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the property values. + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Builds a cache of the element names + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Override the base class method + to write the to the . + + + + + + The prefix to use for all generated element names + + + + + Layout that formats the log events as XML elements. + + + + This is an abstract class that must be subclassed by an implementation + to conform to a specific schema. + + + Deriving classes must implement the method. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor to support subclasses + + + + Initializes a new instance of the class + with no location info. + + + + + + Protected constructor to support subclasses + + + + The parameter determines whether + location information will be output by the layout. If + is set to true, then the + file name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Gets a value indicating whether to include location information in + the XML events. + + + true if location information should be included in the XML + events; otherwise, false. + + + + If is set to true, then the file + name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The string to replace characters that can not be expressed in XML with. + + + Not all characters may be expressed in XML. This property contains the + string to replace those that can not with. This defaults to a ?. Set it + to the empty string to simply remove offending characters. For more + details on the allowed character ranges see http://www.w3.org/TR/REC-xml/#charsets + Character replacement will occur in the log message, the property names + and the property values. + + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets the content type output by this layout. + + + As this is the XML layout, the value is always "text/xml". + + + + As this is the XML layout, the value is always "text/xml". + + + + + + Produces a formatted string. + + The event being logged. + The TextWriter to write the formatted event to + + + Format the and write it to the . + + + This method creates an that writes to the + . The is passed + to the method. Subclasses should override the + method rather than this method. + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Subclasses should override this method to format + the as XML. + + + + + + Flag to indicate if location information should be included in + the XML events. + + + + + The string to replace invalid chars with + + + + + Layout that formats the log events as XML elements compatible with the log4j schema + + + + Formats the log events according to the http://logging.apache.org/log4j schema. + + + Nicko Cadell + + + + The 1st of January 1970 in UTC + + + + + Constructs an XMLLayoutSchemaLog4j + + + + + Constructs an XMLLayoutSchemaLog4j. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The version of the log4j schema to use. + + + + Only version 1.2 of the log4j schema is supported. + + + + + + Actually do the writing of the xml + + the writer to use + the event to write + + + Generate XML that is compatible with the log4j schema. + + + + + + The log4net Logical Thread Context. + + + + The LogicalThreadContext provides a location for specific debugging + information to be stored. + The LogicalThreadContext properties override any or + properties with the same name. + + + For .NET Standard 1.3 this class uses + System.Threading.AsyncLocal rather than . + + + The Logical Thread Context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Logical Thread Context provides a diagnostic context for the current call context. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Logical Thread Context is managed on a per basis. + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Example of using the thread context properties to store a username. + + LogicalThreadContext.Properties["user"] = userName; + log.Info("This log message has a LogicalThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(LogicalThreadContext.Stacks["LDC"].Push("my context message")) + { + log.Info("This log message has a LogicalThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread properties map + + + The thread properties map + + + + The LogicalThreadContext properties override any + or properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The logical thread stacks. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + This class is used by client applications to request logger instances. + + + + This class has static methods that are used by a client to request + a logger instance. The method is + used to retrieve a logger. + + + See the interface for more details. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + Returns the named logger if it exists. + + Returns the named logger if it exists. + + + + If the named logger exists (in the default repository) then it + returns a reference to the logger, otherwise it returns null. + + + The fully qualified logger name to look for. + The logger found, or null if no logger could be found. + + + Get the currently defined loggers. + + Returns all the currently defined loggers in the default repository. + + + The root logger is not included in the returned array. + + All the defined loggers. + + + Get or create a logger. + + Retrieves or creates a named logger. + + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The name of the logger to retrieve. + The logger with the name specified. + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the logger doesn't exist in the specified + repository. + + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the repository for the specified assembly) then it + returns a reference to the logger, otherwise it returns + null. + + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger, or null if the logger doesn't exist in the specified + assembly's repository. + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Get the logger for the fully qualified name of the type specified. + + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The repository to lookup in. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The assembly to use to lookup the repository. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + Shutdown a logger repository. + + Shuts down the default repository. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + default repository. + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The repository to shutdown. + + + + Shuts down the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The assembly to use to lookup the repository. + + + Reset the configuration of a repository + + Resets all values contained in this repository instance to their defaults. + + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The repository to reset. + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The assembly to use to lookup the repository to reset. + + + Get the logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Get a logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Create a domain + + Creates a repository with the specified repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + Create a logger repository. + + Creates a repository with the specified repository type. + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + + + + Creates a repository with the specified name. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name. + + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Creates a repository for the specified assembly and repository type. + + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Gets the list of currently defined repositories. + + + + Get an array of all the objects that have been created. + + + An array of all the known objects. + + + + Flushes logging events buffered in all configured appenders in the default repository. + + The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed. + True if all logging events were flushed successfully, else false. + + + + Looks up the wrapper object for the logger specified. + + The logger to get the wrapper for. + The wrapper for the logger specified. + + + + Looks up the wrapper objects for the loggers specified. + + The loggers to get the wrappers for. + The wrapper objects for the loggers specified. + + + + Create the objects used by + this manager. + + The logger to wrap. + The wrapper for the logger specified. + + + + The wrapper map to use to hold the objects. + + + + + Implementation of Mapped Diagnostic Contexts. + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + The MDC class is similar to the class except that it is + based on a map instead of a stack. It provides mapped + diagnostic contexts. A Mapped Diagnostic Context, or + MDC in short, is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The MDC is managed on a per thread basis. + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Gets the context value identified by the parameter. + + The key to lookup in the MDC. + The string value held for the key, or a null reference if no corresponding value is found. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + If the parameter does not look up to a + previously defined context then null will be returned. + + + + + + Add an entry to the MDC + + The key to store the value under. + The value to store. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Puts a context value (the parameter) as identified + with the parameter into the current thread's + context map. + + + If a value is already defined for the + specified then the value will be replaced. If the + is specified as null then the key value mapping will be removed. + + + + + + Removes the key value mapping for the key specified. + + The key to remove. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove the specified entry from this thread's MDC + + + + + + Clear all entries in the MDC + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove all the entries from this thread's MDC + + + + + + Implementation of Nested Diagnostic Contexts. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + A Nested Diagnostic Context, or NDC in short, is an instrument + to distinguish interleaved log output from different sources. Log + output is typically interleaved when a server handles multiple + clients near-simultaneously. + + + Interleaved log output can still be meaningful if each log entry + from different contexts had a distinctive stamp. This is where NDCs + come into play. + + + Note that NDCs are managed on a per thread basis. The NDC class + is made up of static methods that operate on the context of the + calling thread. + + + How to push a message into the context + + using(NDC.Push("my context message")) + { + ... all log calls will have 'my context message' included ... + + } // at the end of the using block the message is automatically removed + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Gets the current context depth. + + The current context depth. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The number of context values pushed onto the context stack. + + + Used to record the current depth of the context. This can then + be restored using the method. + + + + + + + Clears all the contextual information held on the current thread. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Clears the stack of NDC data held on the current thread. + + + + + + Creates a clone of the stack of context information. + + A clone of the context info for this thread. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The results of this method can be passed to the + method to allow child threads to inherit the context of their + parent thread. + + + + + + Inherits the contextual information from another thread. + + The context stack to inherit. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This thread will use the context information from the stack + supplied. This can be used to initialize child threads with + the same contextual information as their parent threads. These + contexts will NOT be shared. Any further contexts that + are pushed onto the stack will not be visible to the other. + Call to obtain a stack to pass to + this method. + + + + + + Removes the top context from the stack. + + + The message in the context that was removed from the top + of the stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Remove the top context from the stack, and return + it to the caller. If the stack is empty then an + empty string (not null) is returned. + + + + + + Pushes a new context message. + + The new context message. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.NDC.Push("NDC_Message")) + { + log.Warn("This should have an NDC message"); + } + + + + + + Pushes a new context message. + + The new context message string format. + Arguments to be passed into messageFormat. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + var someValue = "ExampleContext" + using(log4net.NDC.PushFormat("NDC_Message {0}", someValue)) + { + log.Warn("This should have an NDC message"); + } + + + + + + Removes the context information for this thread. It is + not required to call this method. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This method is not implemented. + + + + + + Forces the stack depth to be at most . + + The maximum depth of the stack + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Forces the stack depth to be at most . + This may truncate the head of the stack. This only affects the + stack in the current thread. Also it does not prevent it from + growing, it only sets the maximum depth at the time of the + call. This can be used to return to a known context depth. + + + + + + The default object Renderer. + + + + The default renderer supports rendering objects and collections to strings. + + + See the method for details of the output. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + The default renderer supports rendering objects to strings as follows: + + + + Value + Rendered String + + + null + + "(null)" + + + + + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + , & + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: {a, b, c}. + + + All collection classes that implement its subclasses, + or generic equivalents all implement the interface. + + + + + + + + Rendered as the key, an equals sign ('='), and the value (using the appropriate + renderer). + + + For example: key=value. + + + + + other + + Object.ToString() + + + + + + + + Render the array argument into a string + + The map used to lookup renderers + the array to render + The writer to render to + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + + Render the enumerator argument into a string + + The map used to lookup renderers + the enumerator to render + The writer to render to + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + {a, b, c}. + + + + + + Render the DictionaryEntry argument into a string + + The map used to lookup renderers + the DictionaryEntry to render + The writer to render to + + + Render the key, an equals sign ('='), and the value (using the appropriate + renderer). For example: key=value. + + + + + + Implement this interface in order to render objects as strings + + + + Certain types require special case conversion to + string form. This conversion is done by an object renderer. + Object renderers implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a + string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + + + + Map class objects to an . + + + + Maintains a mapping between types that require special + rendering and the that + is used to render them. + + + The method is used to render an + object using the appropriate renderers defined in this map. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Default constructor. + + + + + + Render using the appropriate renderer. + + the object to render to a string + the object rendered as a string + + + This is a convenience method used to render an object to a string. + The alternative method + should be used when streaming output to a . + + + + + + Render using the appropriate renderer. + + the object to render to a string + The writer to render to + + + Find the appropriate renderer for the type of the + parameter. This is accomplished by calling the + method. Once a renderer is found, it is + applied on the object and the result is returned + as a . + + + + + + Gets the renderer for the specified object type + + the object to lookup the renderer for + the renderer for + + + Gets the renderer for the specified object type. + + + Syntactic sugar method that calls + with the type of the object parameter. + + + + + + Gets the renderer for the specified type + + the type to lookup the renderer for + the renderer for the specified type + + + Returns the renderer for the specified type. + If no specific renderer has been defined the + will be returned. + + + + + + Internal function to recursively search interfaces + + the type to lookup the renderer for + the renderer for the specified type + + + + Get the default renderer instance + + the default renderer + + + Get the default renderer + + + + + + Clear the map of renderers + + + + Clear the custom renderers defined by using + . The + cannot be removed. + + + + + + Register an for . + + the type that will be rendered by + the renderer for + + + Register an object renderer for a specific source type. + This renderer will be returned from a call to + specifying the same as an argument. + + + + + + Interface implemented by logger repository plugins. + + + + Plugins define additional behavior that can be associated + with a . + The held by the + property is used to store the plugins for a repository. + + + The log4net.Config.PluginAttribute can be used to + attach plugins to repositories created using configuration + attributes. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + + + + Attaches the plugin to the specified . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + Interface used to create plugins. + + + + Interface used to create a plugin. + + + Nicko Cadell + Gert Driesen + + + + Creates the plugin object. + + the new plugin instance + + + Create and return a new plugin instance. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a PluginCollection instance. + + list to create a readonly wrapper arround + + A PluginCollection wrapper that is read-only. + + + + + Initializes a new instance of the PluginCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the PluginCollection class + that has the specified initial capacity. + + + The number of elements that the new PluginCollection is initially capable of storing. + + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified PluginCollection. + + The PluginCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + + Gets the number of elements actually contained in the PluginCollection. + + + + + Copies the entire PluginCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire PluginCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + An object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + + The at the specified index. + + The zero-based index of the element to get or set. + + is less than zero. + -or- + is equal to or greater than . + + + + + Adds a to the end of the PluginCollection. + + The to be added to the end of the PluginCollection. + The index at which the value has been added. + + + + Removes all elements from the PluginCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the PluginCollection. + + The to check for. + true if is found in the PluginCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the PluginCollection. + + The to locate in the PluginCollection. + + The zero-based index of the first occurrence of + in the entire PluginCollection, if found; otherwise, -1. + + + + + Inserts an element into the PluginCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the PluginCollection. + + The to remove from the PluginCollection. + + The specified was not found in the PluginCollection. + + + + + Removes the element at the specified index of the PluginCollection. + + The zero-based index of the element to remove. + + is less than zero. + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false. + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false. + + + + Returns an enumerator that can iterate through the PluginCollection. + + An for the entire PluginCollection. + + + + Gets or sets the number of elements the PluginCollection can contain. + + + The number of elements the PluginCollection can contain. + + + + + Adds the elements of another PluginCollection to the current PluginCollection. + + The PluginCollection whose elements should be added to the end of the current PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a array to the current PluginCollection. + + The array whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a collection to the current PluginCollection. + + The collection whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + The current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Map of repository plugins. + + + + This class is a name keyed map of the plugins that are + attached to a repository. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The repository that the plugins should be attached to. + + + Initialize a new instance of the class with a + repository that the plugins should be attached to. + + + + + + Gets a by name. + + The name of the to lookup. + + The from the map with the name specified, or + null if no plugin is found. + + + + Lookup a plugin by name. If the plugin is not found null + will be returned. + + + + + + Gets all possible plugins as a list of objects. + + All possible plugins as a list of objects. + + + Get a collection of all the plugins defined in this map. + + + + + + Adds a to the map. + + The to add to the map. + + + The will be attached to the repository when added. + + + If there already exists a plugin with the same name + attached to the repository then the old plugin will + be and replaced with + the new plugin. + + + + + + Removes a from the map. + + The to remove from the map. + + + Remove a specific plugin from this map. + + + + + + Base implementation of + + + + Default abstract implementation of the + interface. This base class can be used by implementors + of the interface. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the name of the plugin + + Initializes a new Plugin with the specified name. + + + + + Gets or sets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + The name of the plugin must not change one the + plugin has been attached to a repository. + + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + The repository for this plugin + + + The that this plugin is attached to. + + + + Gets or sets the that this plugin is + attached to. + + + + + + The name of this plugin. + + + + + The repository this plugin is attached to. + + + + + Plugin that listens for events from the + + + + This plugin publishes an instance of + on a specified . This listens for logging events delivered from + a remote . + + + When an event is received it is relogged within the attached repository + as if it had been raised locally. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + The property must be set. + + + + + + Construct with sink Uri. + + The name to publish the sink under in the remoting infrastructure. + See for more details. + + + Initializes a new instance of the class + with specified name. + + + + + + Gets or sets the URI of this sink. + + + The URI of this sink. + + + + This is the name under which the object is marshaled. + + + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + When the plugin is shutdown the remote logging + sink is disconnected. + + + + + + The fully qualified type of the RemoteLoggingServerPlugin class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Delivers objects to a remote sink. + + + + Internal class used to listen for logging events + and deliver them to the local repository. + + + + + + Constructor + + The repository to log to. + + + Initializes a new instance of the for the + specified . + + + + + + Logs the events to the repository. + + The events to log. + + + The events passed are logged to the + + + + + + Obtains a lifetime service object to control the lifetime + policy for this instance. + + null to indicate that this instance should live forever. + + + Obtains a lifetime service object to control the lifetime + policy for this instance. This object should live forever + therefore this implementation returns null. + + + + + + The underlying that events should + be logged to. + + + + + + + + + + + + + + + + + + + + + Default implementation of + + + + This default implementation of the + interface is used to create the default subclass + of the object. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Default internal subclass of + + + + This subclass has no additional behavior over the + class but does allow instances + to be created. + + + + + + Construct a new Logger + + the name of the logger + + + Initializes a new instance of the class + with the specified name. + + + + + + Delegate used to handle logger creation event notifications. + + The in which the has been created. + The event args that hold the instance that has been created. + + + Delegate used to handle logger creation event notifications. + + + + + + Provides data for the event. + + + + A event is raised every time a + is created. + + + + + + The created + + + + + Constructor + + The that has been created. + + + Initializes a new instance of the event argument + class,with the specified . + + + + + + Gets the that has been created. + + + The that has been created. + + + + The that has been created. + + + + + + Hierarchical organization of loggers + + + + The casual user should not have to deal with this class + directly. + + + This class is specialized in retrieving loggers by name and + also maintaining the logger hierarchy. Implements the + interface. + + + The structure of the logger hierarchy is maintained by the + method. The hierarchy is such that children + link to their parent but parents do not have any references to their + children. Moreover, loggers can be instantiated in any order, in + particular descendant before ancestor. + + + In case a descendant is created before a particular ancestor, + then it creates a provision node for the ancestor and adds itself + to the provision node. Other descendants of the same ancestor add + themselves to the previously created provision node. + + + Nicko Cadell + Gert Driesen + + + + Event used to notify that a logger has been created. + + + + Event raised when a logger is created. + + + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Construct with properties + + The properties to pass to this repository. + + + Initializes a new instance of the class. + + + + + + Construct with a logger factory + + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Construct with properties and a logger factory + + The properties to pass to this repository. + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Has no appender warning been emitted + + + + Flag to indicate if we have already issued a warning + about not having an appender warning. + + + + + + Get the root of this hierarchy + + + + Get the root of this hierarchy. + + + + + + Gets or sets the default instance. + + The default + + + The logger factory is used to create logger instances. + + + + + + Test if a logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the hierarchy. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the hierarchy as an Array + + All the defined loggers + + + Returns all the currently defined loggers in the hierarchy as an Array. + The root logger is not included in the returned + enumeration. + + + + + + Return a new logger instance named as the first parameter using + the default factory. + + + + Return a new logger instance named as the first parameter using + the default factory. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + The name of the logger to retrieve + The logger object with the name specified + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The Shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset all values contained in this hierarchy instance to their default. + + + + Reset all values contained in this hierarchy instance to their + default. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this hierarchy. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are currently configured + + An array containing all the currently configured appenders + + + Returns all the instances that are currently configured. + All the loggers are searched for appenders. The appenders may also be containers + for appenders and these are also searched for additional loggers. + + + The list returned is unordered but does not contain duplicates. + + + + + + Collect the appenders from an . + The appender may also be a container. + + + + + + + Collect the appenders from an container + + + + + + + Initialize the log4net system using the specified appender + + the appender to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Test if this hierarchy is disabled for the specified . + + The level to check against. + + true if the repository is disabled for the level argument, false otherwise. + + + + If this hierarchy has not been configured then this method will + always return true. + + + This method will return true if this repository is + disabled for level object passed as parameter and + false otherwise. + + + See also the property. + + + + + + Clear all logger definitions from the internal hashtable + + + + This call will clear all logger definitions from the internal + hashtable. Invoking this method will irrevocably mess up the + logger hierarchy. + + + You should really know what you are doing before + invoking this method. + + + + + + Return a new logger instance named as the first parameter using + . + + The name of the logger to retrieve + The factory that will make the new logger instance + The logger object with the name specified + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated by the + parameter and linked with its existing + ancestors as well as children. + + + + + + Sends a logger creation event to all registered listeners + + The newly created logger + + Raises the logger creation event. + + + + + Updates all the parents of the specified logger + + The logger to update the parents for + + + This method loops through all the potential parents of + . There 3 possible cases: + + + + No entry for the potential parent of exists + + We create a ProvisionNode for this potential + parent and insert in that provision node. + + + + The entry is of type Logger for the potential parent. + + The entry is 's nearest existing parent. We + update 's parent field with this entry. We also break from + he loop because updating our parent's parent is our parent's + responsibility. + + + + The entry is of type ProvisionNode for this potential parent. + + We add to the list of children for this + potential parent. + + + + + + + + Replace a with a in the hierarchy. + + + + + + We update the links for all the children that placed themselves + in the provision node 'pn'. The second argument 'log' is a + reference for the newly created Logger, parent of all the + children in 'pn'. + + + We loop on all the children 'c' in 'pn'. + + + If the child 'c' has been already linked to a child of + 'log' then there is no need to update 'c'. + + + Otherwise, we set log's parent field to c's parent and set + c's parent field to log. + + + + + + Define or redefine a Level using the values in the argument + + the level values + + + Define or redefine a Level using the values in the argument + + + Supports setting levels via the configuration file. + + + + + + A class to hold the value, name and display name for a level + + + + A class to hold the value, name and display name for a level + + + + + + Value of the level + + + + If the value is not set (defaults to -1) the value will be looked + up for the current level with the same name. + + + + + + Name of the level + + + The name of the level + + + + The name of the level. + + + + + + Display name for the level + + + The display name of the level + + + + The display name of the level. + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + Set a Property using the values in the argument + + the property value + + + Set a Property using the values in the argument. + + + Supports setting property values via the configuration file. + + + + + + The fully qualified type of the Hierarchy class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Interface abstracts creation of instances + + + + This interface is used by the to + create new objects. + + + The method is called + to create a named . + + + Implement this interface to create new subclasses of . + + + Nicko Cadell + Gert Driesen + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Implementation of used by + + + + Internal class used to provide implementation of + interface. Applications should use to get + logger instances. + + + This is one of the central classes in the log4net implementation. One of the + distinctive features of log4net are hierarchical loggers and their + evaluation. The organizes the + instances into a rooted tree hierarchy. + + + The class is abstract. Only concrete subclasses of + can be created. The + is used to create instances of this type for the . + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + + + + This constructor created a new instance and + sets its name. + + The name of the . + + + This constructor is protected and designed to be used by + a subclass that is not abstract. + + + Loggers are constructed by + objects. See for the default + logger creator. + + + + + + Gets or sets the parent logger in the hierarchy. + + + The parent logger in the hierarchy. + + + + Part of the Composite pattern that makes the hierarchy. + The hierarchy is parent linked rather than child linked. + + + + + + Gets or sets a value indicating if child loggers inherit their parent's appenders. + + + true if child loggers inherit their parent's appenders. + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Gets the effective level for this logger. + + The nearest level in the logger hierarchy. + + + Starting from this logger, searches the logger hierarchy for a + non-null level and returns it. Otherwise, returns the level of the + root logger. + + The Logger class is designed so that this method executes as + quickly as possible. + + + + + Gets or sets the where this + Logger instance is attached to. + + The hierarchy that this logger belongs to. + + + This logger must be attached to a single . + + + + + + Gets or sets the assigned , if any, for this Logger. + + + The of this logger. + + + + The assigned can be null. + + + + + + Add to the list of appenders of this + Logger instance. + + An appender to add to this logger + + + Add to the list of appenders of this + Logger instance. + + + If is already in the list of + appenders, then it won't be added again. + + + + + + Get the appenders contained in this logger as an + . + + A collection of the appenders in this logger + + + Get the appenders contained in this logger as an + . If no appenders + can be found, then a is returned. + + + + + + Look for the appender named as name + + The name of the appender to lookup + The appender with the name specified, or null. + + + Returns the named appender, or null if the appender is not found. + + + + + + Remove all previously added appenders from this Logger instance. + + + + Remove all previously added appenders from this Logger instance. + + + This is useful when re-reading configuration information. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The appender to remove + The appender removed from the list + + + Remove the appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The name of the appender to remove + The appender removed from the list + + + Remove the named appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Gets the logger name. + + + The name of the logger. + + + + The name of this logger + + + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the and . + + + This method must not throw any exception to the caller. + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + This method must not throw any exception to the caller. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + This method must not throw any exception to the caller. + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Deliver the to the attached appenders. + + The event to log. + + + Call the appenders in the hierarchy starting at + this. If no appenders could be found, emit a + warning. + + + This method calls all the appenders inherited from the + hierarchy circumventing any evaluation of whether to log or not + to log the particular log request. + + + + + + Closes all attached appenders implementing the interface. + + + + Used to ensure that the appenders are correctly shutdown. + + + + + + This is the most generic printing method. This generic form is intended to be used by wrappers + + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the . + + + + + + Creates a new logging event and logs the event without further checks. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generates a logging event and delivers it to the attached + appenders. + + + + + + Creates a new logging event and logs the event without further checks. + + The event being logged. + + + Delivers the logging event to the attached appenders. + + + + + + The fully qualified type of the Logger class. + + + + + The name of this logger. + + + + + The assigned level of this logger. + + + + The level variable need not be + assigned a value in which case it is inherited + form the hierarchy. + + + + + + The parent of this logger. + + + + The parent of this logger. + All loggers have at least one ancestor which is the root logger. + + + + + + Loggers need to know what Hierarchy they are in. + + + + Loggers need to know what Hierarchy they are in. + The hierarchy that this logger is a member of is stored + here. + + + + + + Helper implementation of the interface + + + + + Flag indicating if child loggers inherit their parents appenders + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Lock to protect AppenderAttachedImpl variable m_appenderAttachedImpl + + + + + Used internally to accelerate hash table searches. + + + + Internal class used to improve performance of + string keyed hashtables. + + + The hashcode of the string is cached for reuse. + The string is stored as an interned value. + When comparing two objects for equality + the reference equality of the interned strings is compared. + + + Nicko Cadell + Gert Driesen + + + + Construct key with string name + + + + Initializes a new instance of the class + with the specified name. + + + Stores the hashcode of the string and interns + the string key to optimize comparisons. + + + The Compact Framework 1.0 the + method does not work. On the Compact Framework + the string keys are not interned nor are they + compared by reference. + + + The name of the logger. + + + + Returns a hash code for the current instance. + + A hash code for the current instance. + + + Returns the cached hashcode. + + + + + + Determines whether two instances + are equal. + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + Compares the references of the interned strings. + + + + + + Provision nodes are used where no logger instance has been specified + + + + instances are used in the + when there is no specified + for that node. + + + A provision node holds a list of child loggers on behalf of + a logger that does not exist. + + + Nicko Cadell + Gert Driesen + + + + Create a new provision node with child node + + A child logger to add to this node. + + + Initializes a new instance of the class + with the specified child logger. + + + + + + The sits at the root of the logger hierarchy tree. + + + + The is a regular except + that it provides several guarantees. + + + First, it cannot be assigned a null + level. Second, since the root logger cannot have a parent, the + property always returns the value of the + level field without walking the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Construct a + + The level to assign to the root logger. + + + Initializes a new instance of the class with + the specified logging level. + + + The root logger names itself as "root". However, the root + logger cannot be retrieved by name. + + + + + + Gets the assigned level value without walking the logger hierarchy. + + The assigned level value without walking the logger hierarchy. + + + Because the root logger cannot have a parent and its level + must not be null this property just returns the + value of . + + + + + + Gets or sets the assigned for the root logger. + + + The of the root logger. + + + + Setting the level of the root logger to a null reference + may have catastrophic results. We prevent this here. + + + + + + The fully qualified type of the RootLogger class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes the log4net environment using an XML DOM. + + + + Configures a using an XML DOM. + + + Nicko Cadell + Gert Driesen + + + + Construct the configurator for a hierarchy + + The hierarchy to build. + + + Initializes a new instance of the class + with the specified . + + + + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + The root element to parse. + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + + + + + Parse appenders by IDREF. + + The appender ref element. + The instance of the appender that the ref refers to. + + + Parse an XML element that represents an appender and return + the appender. + + + + + + Parses an appender element. + + The appender element. + The appender instance or null when parsing failed. + + + Parse an XML element that represents an appender and return + the appender instance. + + + + + + Parses a logger element. + + The logger element. + + + Parse an XML element that represents a logger. + + + + + + Parses the root logger element. + + The root element. + + + Parse an XML element that represents the root logger. + + + + + + Parses the children of a logger element. + + The category element. + The logger instance. + Flag to indicate if the logger is the root logger. + + + Parse the child elements of a <logger> element. + + + + + + Parses an object renderer. + + The renderer element. + + + Parse an XML element that represents a renderer. + + + + + + Parses a level element. + + The level element. + The logger object to set the level on. + Flag to indicate if the logger is the root logger. + + + Parse an XML element that represents a level. + + + + + + Sets a parameter on an object. + + The parameter element. + The object to set the parameter on. + + The parameter name must correspond to a writable property + on the object. The value of the parameter is a string, + therefore this function will attempt to set a string + property first. If unable to set a string property it + will inspect the property and its argument type. It will + attempt to call a static method called Parse on the + type of the property. This method will take a single + string argument and return a value that can be used to + set the property. + + + + + Test if an element has no attributes or child elements + + the element to inspect + true if the element has any attributes or child elements, false otherwise + + + + Test if a is constructible with Activator.CreateInstance. + + the type to inspect + true if the type is creatable using a default constructor, false otherwise + + + + Look for a method on the that matches the supplied + + the type that has the method + the name of the method + the method info found + + + The method must be a public instance method on the . + The method must be named or "Add" followed by . + The method must take a single parameter. + + + + + + Converts a string value to a target type. + + The type of object to convert the string to. + The string value to use as the value of the object. + + + An object of type with value or + null when the conversion could not be performed. + + + + + + Creates an object as specified in XML. + + The XML element that contains the definition of the object. + The object type to use if not explicitly specified. + The type that the returned object must be or must inherit from. + The object or null + + + Parse an XML element and create an object instance based on the configuration + data. + + + The type of the instance may be specified in the XML. If not + specified then the is used + as the type. However the type is specified it must support the + type. + + + + + + key: appenderName, value: appender. + + + + + The Hierarchy being configured. + + + + + The fully qualified type of the XmlHierarchyConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Basic Configurator interface for repositories + + + + Interface used by basic configurator to configure a + with a default . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified appender + + the appender to use to log all logging events + + + Configure the repository to route all logging events to the + specified appender. + + + + + + Initialize the repository using the specified appenders + + the appenders to use to log all logging events + + + Configure the repository to route all logging events to the + specified appenders. + + + + + + Delegate used to handle logger repository shutdown event notifications + + The that is shutting down. + Empty event args + + + Delegate used to handle logger repository shutdown event notifications. + + + + + + Delegate used to handle logger repository configuration reset event notifications + + The that has had its configuration reset. + Empty event args + + + Delegate used to handle logger repository configuration reset event notifications. + + + + + + Delegate used to handle event notifications for logger repository configuration changes. + + The that has had its configuration changed. + Empty event arguments. + + + Delegate used to handle event notifications for logger repository configuration changes. + + + + + + Interface implemented by logger repositories. + + + + This interface is implemented by logger repositories. e.g. + . + + + This interface is used by the + to obtain interfaces. + + + Nicko Cadell + Gert Driesen + + + + The name of the repository + + + The name of the repository + + + + The name of the repository. + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository. + + + + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + The name of the logger to lookup + The Logger object with the name specified + + + If the names logger exists it is returned, otherwise + null is returned. + + + + + + Returns all the currently defined loggers as an Array. + + All the defined loggers + + + Returns all the currently defined loggers as an Array. + + + + + + Returns a named logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Returns a named logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + Shutdown the repository + + + Shutting down a repository will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Collection of internal messages captured during the most + recent configuration process. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + + These properties can be specified on a repository specific basis. + + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + Configure repository using XML + + + + Interface used by Xml configurator to configure a . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified config + + the element containing the root of the config + + + The schema for the XML configuration data is defined by + the implementation. + + + + + + Base implementation of + + + + Default abstract implementation of the interface. + + + Skeleton implementation of the interface. + All types can extend this type. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Initializes the repository with default (empty) properties. + + + + + + Construct the repository using specific properties + + the properties to set for this repository + + + Initializes the repository with specified properties. + + + + + + The name of the repository + + + The string name of the repository + + + + The name of this repository. The name is + used to store and lookup the repositories + stored by the . + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + Test if logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the repository + + All the defined loggers + + + Returns all the currently defined loggers in the repository as an Array. + + + + + + Return a new logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Return a new logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + + Shutdown the repository + + + + Shutdown the repository. Can be overridden in a subclass. + This base class implementation notifies the + listeners and all attached plugins of the shutdown event. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Contains a list of internal messages captures during the + last configuration. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + These properties can be specified on a repository specific basis + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + The fully qualified type of the LoggerRepositorySkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adds an object renderer for a specific class. + + The type that will be rendered by the renderer supplied. + The object renderer used to render the object. + + + Adds an object renderer for a specific class. + + + + + + Notify the registered listeners that the repository is shutting down + + Empty EventArgs + + + Notify any listeners that this repository is shutting down. + + + + + + Notify the registered listeners that the repository has had its configuration reset + + Empty EventArgs + + + Notify any listeners that this repository's configuration has been reset. + + + + + + Notify the registered listeners that the repository has had its configuration changed + + Empty EventArgs + + + Notify any listeners that this repository's configuration has changed. + + + + + + Raise a configuration changed event on this repository + + EventArgs.Empty + + + Applications that programmatically change the configuration of the repository should + raise this event notification to notify listeners. + + + + + + Flushes all configured Appenders that implement . + + The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed, + or to wait indefinitely. + True if all logging events were flushed successfully, else false. + + + + The log4net Thread Context. + + + + The ThreadContext provides a location for thread specific debugging + information to be stored. + The ThreadContext properties override any + properties with the same name. + + + The thread context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Thread Context provides a diagnostic context for the current thread. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Thread Context is managed on a per thread basis. + + + Example of using the thread context properties to store a username. + + ThreadContext.Properties["user"] = userName; + log.Info("This log message has a ThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(ThreadContext.Stacks["NDC"].Push("my context message")) + { + log.Info("This log message has a ThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread properties map + + + The thread properties map + + + + The ThreadContext properties override any + properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The thread local stacks. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + A straightforward implementation of the interface. + + + + This is the default implementation of the + interface. Implementors of the interface + should aggregate an instance of this type. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Append on on all attached appenders. + + The event being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Append on on all attached appenders. + + The array of events being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Calls the DoAppende method on the with + the objects supplied. + + The appender + The events + + + If the supports the + interface then the will be passed + through using that interface. Otherwise the + objects in the array will be passed one at a time. + + + + + + Attaches an appender. + + The appender to add. + + + If the appender is already in the list it won't be added again. + + + + + + Gets all attached appenders. + + + A collection of attached appenders, or null if there + are no attached appenders. + + + + The read only collection of all currently attached appenders. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Lookup an attached appender by name. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + List of appenders + + + + + Array of appenders, used to cache the m_appenderList + + + + + The fully qualified type of the AppenderAttachedImpl class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class aggregates several PropertiesDictionary collections together. + + + + Provides a dictionary style lookup over an ordered list of + collections. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets the value of a property + + + The value for the property with the specified key + + + + Looks up the value for the specified. + The collections are searched + in the order in which they were added to this collection. The value + returned is the value held by the first collection that contains + the specified key. + + + If none of the collections contain the specified key then + null is returned. + + + + + + Add a Properties Dictionary to this composite collection + + the properties to add + + + Properties dictionaries added first take precedence over dictionaries added + later. + + + + + + Flatten this composite collection into a single properties dictionary + + the flattened dictionary + + + Reduces the collection of ordered dictionaries to a single dictionary + containing the resultant values for the keys. + + + + + + Base class for Context Properties implementations + + + + This class defines a basic property get set accessor + + + Nicko Cadell + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Wrapper class used to map converter names to converter types + + + + Pattern converter info class used during configuration by custom + PatternString and PatternLayer converters. + + + + + + default constructor + + + + + Gets or sets the name of the conversion pattern + + + + The name of the pattern in the format string + + + + + + Gets or sets the type of the converter + + + + The value specified must extend the + type. + + + + + + + + + + + + + + + + + Subclass of that maintains a count of + the number of bytes written. + + + + This writer counts the number of bytes written. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The to actually write to. + The to report errors to. + + + Creates a new instance of the class + with the specified and . + + + + + + Writes a character to the underlying writer and counts the number of bytes written. + + the char to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a buffer to the underlying writer and counts the number of bytes written. + + the buffer to write + the start index to write from + the number of characters to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a string to the output and counts the number of bytes written. + + The string data to write to the output. + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Gets or sets the total number of bytes written. + + + The total number of bytes written. + + + + Gets or sets the total number of bytes written. + + + + + + Total number of bytes written. + + + + + A fixed size rolling buffer of logging events. + + + + An array backed fixed size leaky bucket. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The maximum number of logging events in the buffer. + + + Initializes a new instance of the class with + the specified maximum number of buffered logging events. + + + The argument is not a positive integer. + + + + Appends a to the buffer. + + The event to append to the buffer. + The event discarded from the buffer, if the buffer is full, otherwise null. + + + Append an event to the buffer. If the buffer still contains free space then + null is returned. If the buffer is full then an event will be dropped + to make space for the new event, the event dropped is returned. + + + + + + Get and remove the oldest event in the buffer. + + The oldest logging event in the buffer + + + Gets the oldest (first) logging event in the buffer and removes it + from the buffer. + + + + + + Pops all the logging events from the buffer into an array. + + An array of all the logging events in the buffer. + + + Get all the events in the buffer and clear the buffer. + + + + + + Clear the buffer + + + + Clear the buffer of all events. The events in the buffer are lost. + + + + + + Gets the th oldest event currently in the buffer. + + The th oldest event currently in the buffer. + + + If is outside the range 0 to the number of events + currently in the buffer, then null is returned. + + + + + + Gets the maximum size of the buffer. + + The maximum size of the buffer. + + + Gets the maximum size of the buffer + + + + + + Gets the number of logging events in the buffer. + + The number of logging events in the buffer. + + + This number is guaranteed to be in the range 0 to + (inclusive). + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the empty collection. + + The singleton instance of the empty collection. + + + Gets the singleton instance of the empty collection. + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the . + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + The singleton instance of the empty collection. + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Adds an element with the provided key and value to the + . + + The to use as the key of the element to add. + The to use as the value of the element to add. + + + As the collection is empty no new values can be added. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Removes all elements from the . + + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Determines whether the contains an element + with the specified key. + + The key to locate in the . + false + + + As the collection is empty the method always returns false. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Removes the element with the specified key from the . + + The key of the element to remove. + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Gets a value indicating whether the has a fixed size. + + true + + + As the collection is empty always returns true. + + + + + + Gets a value indicating whether the is read-only. + + true + + + As the collection is empty always returns true. + + + + + + Gets an containing the keys of the . + + An containing the keys of the . + + + As the collection is empty a is returned. + + + + + + Gets an containing the values of the . + + An containing the values of the . + + + As the collection is empty a is returned. + + + + + + Gets or sets the element with the specified key. + + The key of the element to get or set. + null + + + As the collection is empty no values can be looked up or stored. + If the index getter is called then null is returned. + A is thrown if the setter is called. + + + This dictionary is always empty and cannot be modified. + + + + The singleton instance of the empty dictionary. + + + + + Contain the information obtained when parsing formatting modifiers + in conversion modifiers. + + + + Holds the formatting information extracted from the format string by + the . This is used by the + objects when rendering the output. + + + Nicko Cadell + Gert Driesen + + + + Defaut Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + + + Initializes a new instance of the class + with the specified parameters. + + + + + + Gets or sets the minimum value. + + + The minimum value. + + + + Gets or sets the minimum value. + + + + + + Gets or sets the maximum value. + + + The maximum value. + + + + Gets or sets the maximum value. + + + + + + Gets or sets a flag indicating whether left align is enabled + or not. + + + A flag indicating whether left align is enabled or not. + + + + Gets or sets a flag indicating whether left align is enabled or not. + + + + + + Implementation of Properties collection for the + + + + This class implements a properties collection that is thread safe and supports both + storing properties and capturing a read only copy of the current propertied. + + + This class is optimized to the scenario where the properties are read frequently + and are modified infrequently. + + + Nicko Cadell + + + + The read only copy of the properties. + + + + This variable is declared volatile to prevent the compiler and JIT from + reordering reads and writes of this thread performed on different threads. + + + + + + Lock object used to synchronize updates within this instance + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Reading the value for a key is faster than setting the value. + When the value is written a new read only copy of + the properties is created. + + + + + + Remove a property from the global context + + the key for the entry to remove + + + Removing an entry from the global context properties is relatively expensive compared + with reading a value. + + + + + + Clear the global context properties + + + + + Get a readonly immutable copy of the properties + + the current global context properties + + + This implementation is fast because the GlobalContextProperties class + stores a readonly copy of the properties. + + + + + + The static class ILogExtensions contains a set of widely used + methods that ease the interaction with the ILog interface implementations. + + + + This class contains methods for logging at different levels and checks the + properties for determining if those logging levels are enabled in the current + configuration. + + + Simple example of logging messages + + using log4net.Util; + + ILog log = LogManager.GetLogger("application-log"); + + log.InfoExt("Application Start"); + log.DebugExt("This is a debug message"); + + + + + + The fully qualified type of the Logger class. + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Manages a mapping from levels to + + + + Manages an ordered mapping from instances + to subclasses. + + + Nicko Cadell + + + + Default constructor + + + + Initialise a new instance of . + + + + + + Add a to this mapping + + the entry to add + + + If a has previously been added + for the same then that entry will be + overwritten. + + + + + + Lookup the mapping for the specified level + + the level to lookup + the for the level or null if no mapping found + + + Lookup the value for the specified level. Finds the nearest + mapping value for the level that is equal to or less than the + specified. + + + If no mapping could be found then null is returned. + + + + + + Initialize options + + + + Caches the sorted list of in an array + + + + + + An entry in the + + + + This is an abstract base class for types that are stored in the + object. + + + Nicko Cadell + + + + Default protected constructor + + + + Default protected constructor + + + + + + The level that is the key for this mapping + + + The that is the key for this mapping + + + + Get or set the that is the key for this + mapping subclass. + + + + + + Initialize any options defined on this entry + + + + Should be overridden by any classes that need to initialise based on their options + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + This class stores its properties in a slot on the named + log4net.Util.LogicalThreadContextProperties. + + + For .NET Standard 1.3 this class uses + System.Threading.AsyncLocal rather than . + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Nicko Cadell + + + + Flag used to disable this context if we don't have permission to access the CallContext. + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Get or set the property value for the specified. + + + + + + Remove a property + + the key for the entry to remove + + + Remove the value for the specified from the context. + + + + + + Clear all the context properties + + + + Clear all the context properties + + + + + + Get the PropertiesDictionary stored in the LocalDataStoreSlot for this thread. + + create the dictionary if it does not exist, otherwise return null if is does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doings so. + + + + + + Gets the call context get data. + + The peroperties dictionary stored in the call context + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + Sets the call context data. + + The properties. + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + The fully qualified type of the LogicalThreadContextProperties class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Delegate type used for LogicalThreadContextStack's callbacks. + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + The name of this within the + . + + + + + The callback used to let the register a + new instance of a . + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this thread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatability + of the . Tytpically the internal stack should not + be modified. + + + + + + Gets the current context information for this stack. + + Gets the current context information + + + Gets the current context information for this stack. + + + + + + Get a portable version of this object + + the portable instance of this object + + + Get a cross thread portable version of this object + + + + + + Inner class used to represent a single context frame in the stack. + + + + Inner class used to represent a single context frame in the stack. + + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The depth to trim the stack to when this instance is disposed + + + + + The outer LogicalThreadContextStack. + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + + + Implementation of Stacks collection for the + + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + + + + + + + + Outputs log statements from within the log4net assembly. + + + + Log4net components cannot make log4net logging calls. However, it is + sometimes useful for the user to learn about what log4net is + doing. + + + All log4net internal debug calls go to the standard output stream + whereas internal error messages are sent to the standard error output + stream. + + + Nicko Cadell + Gert Driesen + + + + The event raised when an internal message has been received. + + + + + The Type that generated the internal message. + + + + + The DateTime stamp of when the internal message was received. + + + + + The UTC DateTime stamp of when the internal message was received. + + + + + A string indicating the severity of the internal message. + + + "log4net: ", + "log4net:ERROR ", + "log4net:WARN " + + + + + The internal log message. + + + + + The Exception related to the message. + + + Optional. Will be null if no Exception was passed. + + + + + Formats Prefix, Source, and Message in the same format as the value + sent to Console.Out and Trace.Write. + + + + + + Initializes a new instance of the class. + + + + + + + + + Static constructor that initializes logging by reading + settings from the application configuration file. + + + + The log4net.Internal.Debug application setting + controls internal debugging. This setting should be set + to true to enable debugging. + + + The log4net.Internal.Quiet application setting + suppresses all internal logging including error messages. + This setting should be set to true to enable message + suppression. + + + + + + Gets or sets a value indicating whether log4net internal logging + is enabled or disabled. + + + true if log4net internal logging is enabled, otherwise + false. + + + + When set to true, internal debug level logging will be + displayed. + + + This value can be set by setting the application setting + log4net.Internal.Debug in the application configuration + file. + + + The default value is false, i.e. debugging is + disabled. + + + + + The following example enables internal debugging using the + application configuration file : + + + + + + + + + + + + + Gets or sets a value indicating whether log4net should generate no output + from internal logging, not even for errors. + + + true if log4net should generate no output at all from internal + logging, otherwise false. + + + + When set to true will cause internal logging at all levels to be + suppressed. This means that no warning or error reports will be logged. + This option overrides the setting and + disables all debug also. + + This value can be set by setting the application setting + log4net.Internal.Quiet in the application configuration file. + + + The default value is false, i.e. internal logging is not + disabled. + + + + The following example disables internal logging using the + application configuration file : + + + + + + + + + + + + + + + + + Raises the LogReceived event when an internal messages is received. + + + + + + + + + Test if LogLog.Debug is enabled for output. + + + true if Debug is enabled + + + + Test if LogLog.Debug is enabled for output. + + + + + + Writes log4net internal debug messages to the + standard output stream. + + + The message to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Writes log4net internal debug messages to the + standard output stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Test if LogLog.Warn is enabled for output. + + + true if Warn is enabled + + + + Test if LogLog.Warn is enabled for output. + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Test if LogLog.Error is enabled for output. + + + true if Error is enabled + + + + Test if LogLog.Error is enabled for output. + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal error messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes output to the standard output stream. + + The message to log. + + + Writes to both Console.Out and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Writes output to the standard error stream. + + The message to log. + + + Writes to both Console.Error and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Default debug level + + + + + In quietMode not even errors generate any output. + + + + + Subscribes to the LogLog.LogReceived event and stores messages + to the supplied IList instance. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a native error code and message. + + + + Represents a Win32 platform native error. + + + Nicko Cadell + Gert Driesen + + + + Create an instance of the class with the specified + error number and message. + + The number of the native error. + The message of the native error. + + + Create an instance of the class with the specified + error number and message. + + + + + + Gets the number of the native error. + + + The number of the native error. + + + + Gets the number of the native error. + + + + + + Gets the message of the native error. + + + The message of the native error. + + + + + Gets the message of the native error. + + + + + Create a new instance of the class for the last Windows error. + + + An instance of the class for the last windows error. + + + + The message for the error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Create a new instance of the class. + + the error number for the native error + + An instance of the class for the specified + error number. + + + + The message for the specified error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Retrieves the message corresponding with a Win32 message identifier. + + Message identifier for the requested message. + + The message corresponding with the specified message identifier. + + + + The message will be searched for in system message-table resource(s) + using the native FormatMessage function. + + + + + + Return error information string + + error information string + + + Return error information string + + + + + + Formats a message string. + + Formatting options, and how to interpret the parameter. + Location of the message definition. + Message identifier for the requested message. + Language identifier for the requested message. + If includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the LocalAlloc function, and places the pointer to the buffer at the address specified in . + If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer. + Pointer to an array of values that are used as insert values in the formatted message. + + + The function requires a message definition as input. The message definition can come from a + buffer passed into the function. It can come from a message table resource in an + already-loaded module. Or the caller can ask the function to search the system's message + table resource(s) for the message definition. The function finds the message definition + in a message table resource based on a message identifier and a language identifier. + The function copies the formatted message text to an output buffer, processing any embedded + insert sequences if requested. + + + To prevent the usage of unsafe code, this stub does not support inserting values in the formatted message. + + + + + If the function succeeds, the return value is the number of TCHARs stored in the output + buffer, excluding the terminating null character. + + + If the function fails, the return value is zero. To get extended error information, + call . + + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance. + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + Gets the current key from the enumerator. + + + Throws an exception because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current value from the enumerator. + + The current value from the enumerator. + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current entry from the enumerator. + + + Throws an because the + never has a current entry. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + The singleton instance of the . + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Get the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + The singleton instance of the . + + + + + A SecurityContext used when a SecurityContext is not required + + + + The is a no-op implementation of the + base class. It is used where a + is required but one has not been provided. + + + Nicko Cadell + + + + Singleton instance of + + + + Singleton instance of + + + + + + Private constructor + + + + Private constructor for singleton pattern. + + + + + + Impersonate this SecurityContext + + State supplied by the caller + null + + + No impersonation is done and null is always returned. + + + + + + Implements log4net's default error handling policy which consists + of emitting a message for the first error in an appender and + ignoring all subsequent errors. + + + + The error message is processed using the LogLog sub-system by default. + + + This policy aims at protecting an otherwise working application + from being flooded with error messages when logging fails. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Default Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + The prefix to use for each message. + + + Initializes a new instance of the class + with the specified prefix. + + + + + + Reset the error handler back to its initial disabled state. + + + + + Log an Error + + The error message. + The exception. + The internal error code. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log the very first error + + The error message. + The exception. + The internal error code. + + + Sends the error information to 's Error method. + + + + + + Log an Error + + The error message. + The exception. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log an error + + The error message. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Is error logging enabled + + + + Is error logging enabled. Logging is only enabled for the + first error delivered to the . + + + + + + The date the first error that trigged this error handler occurred, or if it has not been triggered. + + + + + The UTC date the first error that trigged this error handler occured, or if it has not been triggered. + + + + + The message from the first error that trigged this error handler. + + + + + The exception from the first error that trigged this error handler. + + + May be . + + + + + The error code from the first error that trigged this error handler. + + + Defaults to + + + + + The UTC date the error was recorded. + + + + + Flag to indicate if it is the first error + + + + + The message recorded during the first error. + + + + + The exception recorded during the first error. + + + + + The error code recorded during the first error. + + + + + String to prefix each message with + + + + + The fully qualified type of the OnlyOnceErrorHandler class. + + + Used by the internal logger to record the Type of the + log message. + + + + + A convenience class to convert property values to specific types. + + + + Utility functions for converting types and parsing values. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Converts a string to a value. + + String to convert. + The default value. + The value of . + + + If is "true", then true is returned. + If is "false", then false is returned. + Otherwise, is returned. + + + + + + Parses a file size into a number. + + String to parse. + The default value. + The value of . + + + Parses a file size of the form: number[KB|MB|GB] into a + long value. It is scaled with the appropriate multiplier. + + + is returned when + cannot be converted to a value. + + + + + + Converts a string to an object. + + The target type to convert to. + The string to convert to an object. + + The object converted from a string or null when the + conversion failed. + + + + Converts a string to an object. Uses the converter registry to try + to convert the string value into the specified target type. + + + + + + Checks if there is an appropriate type conversion from the source type to the target type. + + The type to convert from. + The type to convert to. + true if there is a conversion from the source type to the target type. + + Checks if there is an appropriate type conversion from the source type to the target type. + + + + + + + Converts an object to the target type. + + The object to convert to the target type. + The type to convert to. + The converted object. + + + Converts an object to the target type. + + + + + + Instantiates an object given a class name. + + The fully qualified class name of the object to instantiate. + The class to which the new object should belong. + The object to return in case of non-fulfillment. + + An instance of the or + if the object could not be instantiated. + + + + Checks that the is a subclass of + . If that test fails or the object could + not be instantiated, then is returned. + + + + + + Performs variable substitution in string from the + values of keys found in . + + The string on which variable substitution is performed. + The dictionary to use to lookup variables. + The result of the substitutions. + + + The variable substitution delimiters are ${ and }. + + + For example, if props contains key=value, then the call + + + + string s = OptionConverter.SubstituteVariables("Value of key is ${key}."); + + + + will set the variable s to "Value of key is value.". + + + If no value could be found for the specified key, then substitution + defaults to an empty string. + + + For example, if system properties contains no value for the key + "nonExistentKey", then the call + + + + string s = OptionConverter.SubstituteVariables("Value of nonExistentKey is [${nonExistentKey}]"); + + + + will set s to "Value of nonExistentKey is []". + + + An Exception is thrown if contains a start + delimiter "${" which is not balanced by a stop delimiter "}". + + + + + + Converts the string representation of the name or numeric value of one or + more enumerated constants to an equivalent enumerated object. + + The type to convert to. + The enum string value. + If true, ignore case; otherwise, regard case. + An object of type whose value is represented by . + + + + The fully qualified type of the OptionConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor + + + + Initializes a new instance of the class. + + + + + + Get the next pattern converter in the chain + + + the next pattern converter in the chain + + + + Get the next pattern converter in the chain + + + + + + Gets or sets the formatting info for this converter + + + The formatting info for this converter + + + + Gets or sets the formatting info for this converter + + + + + + Gets or sets the option value for this converter + + + The option for this converter + + + + Gets or sets the option value for this converter + + + + + + Evaluate this pattern converter and write the output to a writer. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the appropriate way. + + + + + + Set the next pattern converter in the chains + + the pattern converter that should follow this converter in the chain + the next converter + + + The PatternConverter can merge with its neighbor during this method (or a sub class). + Therefore the return value may or may not be the value of the argument passed in. + + + + + + Write the pattern converter to the writer with appropriate formatting + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + This method calls to allow the subclass to perform + appropriate conversion of the pattern converter. If formatting options have + been specified via the then this method will + apply those formattings before writing the output. + + + + + + Fast space padding method. + + to which the spaces will be appended. + The number of spaces to be padded. + + + Fast space padding method. + + + + + + The option string to the converter + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an object to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the Object to a writer. If the specified + is not null then it is used to render the object to text, otherwise + the object's ToString method is called. + + + + + + + + + + + Most of the work of the class + is delegated to the PatternParser class. + + + + The PatternParser processes a pattern string and + returns a chain of objects. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The pattern to parse. + + + Initializes a new instance of the class + with the specified pattern string. + + + + + + Parses the pattern into a chain of pattern converters. + + The head of a chain of pattern converters. + + + Parses the pattern into a chain of pattern converters. + + + + + + Get the converter registry used by this parser + + + The converter registry used by this parser + + + + Get the converter registry used by this parser + + + + + + Build the unified cache of converters from the static and instance maps + + the list of all the converter names + + + Build the unified cache of converters from the static and instance maps + + + + + + Sort strings by length + + + + that orders strings by string length. + The longest strings are placed first + + + + + + Internal method to parse the specified pattern to find specified matches + + the pattern to parse + the converter names to match in the pattern + + + The matches param must be sorted such that longer strings come before shorter ones. + + + + + + Process a parsed literal + + the literal text + + + + Process a parsed converter pattern + + the name of the converter + the optional option for the converter + the formatting info for the converter + + + + Resets the internal state of the parser and adds the specified pattern converter + to the chain. + + The pattern converter to add. + + + + The first pattern converter in the chain + + + + + the last pattern converter in the chain + + + + + The pattern + + + + + Internal map of converter identifiers to converter types + + + + This map overrides the static s_globalRulesRegistry map. + + + + + + The fully qualified type of the PatternParser class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class implements a patterned string. + + + + This string has embedded patterns that are resolved and expanded + when the string is formatted. + + + This class functions similarly to the + in that it accepts a pattern and renders it to a string. Unlike the + however the PatternString + does not render the properties of a specific but + of the process in general. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + appdomain + + + Used to output the friendly name of the current AppDomain. + + + + + appsetting + + + Used to output the value of a specific appSetting key in the application + configuration file. + + + + + date + + + Used to output the current date and time in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + env + + + Used to output the a specific environment variable. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %env{COMPUTERNAME} would include the value + of the COMPUTERNAME environment variable. + + + The env pattern is not supported on the .NET Compact Framework. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern name offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + processid + + + Used to output the system process ID for the current process. + + + + + property + + + Used to output a specific context property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are stored in logging contexts. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + random + + + Used to output a random string of characters. The string is made up of + uppercase letters and numbers. By default the string is 4 characters long. + The length of the string can be specified within braces directly following the + pattern specifier, e.g. %random{8} would output an 8 character string. + + + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + % + + + The sequence %% outputs a single percent sign. + + + + + + Additional pattern converters may be registered with a specific + instance using or + . + + + See the for details on the + format modifiers supported by the patterns. + + + Nicko Cadell + + + + Internal map of converter identifiers to converter types. + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternString only + + + + + Initialize the global registry + + + + + Default constructor + + + + Initialize a new instance of + + + + + + Constructs a PatternString + + The pattern to use with this PatternString + + + Initialize a new instance of with the pattern specified. + + + + + + Gets or sets the pattern formatting string + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Initialize object options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create the used to parse the pattern + + the pattern to parse + The + + + Returns PatternParser used to parse the conversion string. Subclasses + may override this to return a subclass of PatternParser which recognize + custom conversion pattern name. + + + + + + Produces a formatted string as specified by the conversion pattern. + + The TextWriter to write the formatted event to + + + Format the pattern to the . + + + + + + Format the pattern as a string + + the pattern formatted as a string + + + Format the pattern to a string. + + + + + + Add a converter to this PatternString + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternString + + the name of the conversion pattern for this converter + the type of the converter + + + Add a converter to this PatternString + + + + + + Write the name of the current AppDomain to the output + + + + Write the name of the current AppDomain to the output writer + + + Nicko Cadell + + + + Write the name of the current AppDomain to the output + + the writer to write to + null, state is not set + + + Writes name of the current AppDomain to the output . + + + + + + AppSetting pattern converter + + + + This pattern converter reads appSettings from the application configuration file. + + + If the is specified then that will be used to + lookup a single appSettings value. If no is specified + then all appSettings will be dumped as a list of key value pairs. + + + A typical use is to specify a base directory for log files, e.g. + + + + + ... + + + ]]> + + + + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Write the current date to the output + + + + Date pattern converter, uses a to format + the current date and time to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,fff" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The date and time is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current date to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date and time passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an folder path to the output + + + + Write an special path environment folder path to the output writer. + The value of the determines + the name of the variable to output. + should be a value in the enumeration. + + + Ron Grabowski + + + + Write an special path environment folder path to the output + + the writer to write to + null, state is not set + + + Writes the special path environment folder path to the output . + The name of the special path environment folder path to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentFolderPathPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an environment variable to the output + + + + Write an environment variable to the output writer. + The value of the determines + the name of the variable to output. + + + Nicko Cadell + + + + Write an environment variable to the output + + the writer to write to + null, state is not set + + + Writes the environment variable to the output . + The name of the environment variable to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current thread identity to the output + + + + Write the current thread identity to the output writer + + + Nicko Cadell + + + + Write the current thread identity to the output + + the writer to write to + null, state is not set + + + Writes the current thread identity to the output . + + + + + + The fully qualified type of the IdentityPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Pattern converter for literal string instances in the pattern + + + + Writes the literal string value specified in the + property to + the output. + + + Nicko Cadell + + + + Set the next converter in the chain + + The next pattern converter in the chain + The next pattern converter + + + Special case the building of the pattern converter chain + for instances. Two adjacent + literals in the pattern can be represented by a single combined + pattern converter. This implementation detects when a + is added to the chain + after this converter and combines its value with this converter's + literal value. + + + + + + Write the literal to the output + + the writer to write to + null, not set + + + Override the formatting behavior to ignore the FormattingInfo + because we have a literal instead. + + + Writes the value of + to the output . + + + + + + Convert this pattern into the rendered message + + that will receive the formatted result. + null, not set + + + This method is not used. + + + + + + Writes a newline to the output + + + + Writes the system dependent line terminator to the output. + This behavior can be overridden by setting the : + + + + Option Value + Output + + + DOS + DOS or Windows line terminator "\r\n" + + + UNIX + UNIX line terminator "\n" + + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current process ID to the output + + + + Write the current process ID to the output writer + + + Nicko Cadell + + + + Write the current process ID to the output + + the writer to write to + null, state is not set + + + Write the current process ID to the output . + + + + + + The fully qualified type of the ProcessIdPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Property pattern converter + + + + This pattern converter reads the thread and global properties. + The thread properties take priority over global properties. + See for details of the + thread properties. See for + details of the global properties. + + + If the is specified then that will be used to + lookup a single property. If no is specified + then all properties will be dumped as a list of key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + A Pattern converter that generates a string of random characters + + + + The converter generates a string of random characters. By default + the string is length 4. This can be changed by setting the + to the string value of the length required. + + + The random characters in the string are limited to uppercase letters + and numbers only. + + + The random number generator used by this class is not cryptographically secure. + + + Nicko Cadell + + + + Shared random number generator + + + + + Length of random string to generate. Default length 4. + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write a randoim string to the output + + the writer to write to + null, state is not set + + + Write a randoim string to the output . + + + + + + The fully qualified type of the RandomStringPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current threads username to the output + + + + Write the current threads username to the output writer + + + Nicko Cadell + + + + Write the current threads username to the output + + the writer to write to + null, state is not set + + + Write the current threads username to the output . + + + + + + The fully qualified type of the UserNamePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the UTC date time to the output + + + + Date pattern converter, uses a to format + the current date and time in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the current date and time to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date is in Universal time when it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + String keyed object map. + + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Because this class is sealed the serialization constructor is private. + + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + Remove the entry with the specified key from this dictionary + + the key for the entry to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + an enumerator + + + Returns a over the contest of this collection. + + + + + + See + + the key to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + the key to lookup in the collection + true if the collection contains the specified key + + + Test if this collection contains a specified key. + + + + + + Remove all properties from the properties collection + + + + Remove all properties from the properties collection + + + + + + See + + the key + the value to store for the key + + + Store a value for the specified . + + + Thrown if the is not a string + + + + See + + + false + + + + This collection is modifiable. This property always + returns false. + + + + + + See + + + The value for the key specified. + + + + Get or set a value for the specified . + + + Thrown if the is not a string + + + + See + + + + + See + + + + + See + + + + + See + + + + + + + See + + + + + See + + + + + See + + + + + A class to hold the key and data for a property set in the config file + + + + A class to hold the key and data for a property set in the config file + + + + + + Property Key + + + Property Key + + + + Property Key. + + + + + + Property Value + + + Property Value + + + + Property Value. + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + A that ignores the message + + + + This writer is used in special cases where it is necessary + to protect a writer from being closed by a client. + + + Nicko Cadell + + + + Constructor + + the writer to actually write to + + + Create a new ProtectCloseTextWriter using a writer + + + + + + Attach this instance to a different underlying + + the writer to attach to + + + Attach this instance to a different underlying + + + + + + Does not close the underlying output writer. + + + + Does not close the underlying output writer. + This method does nothing. + + + + + + that does not leak exceptions + + + + does not throw exceptions when things go wrong. + Instead, it delegates error handling to its . + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the writer to actually write to + the error handler to report error to + + + Create a new QuietTextWriter using a writer and error handler + + + + + + Gets or sets the error handler that all errors are passed to. + + + The error handler that all errors are passed to. + + + + Gets or sets the error handler that all errors are passed to. + + + + + + Gets a value indicating whether this writer is closed. + + + true if this writer is closed, otherwise false. + + + + Gets a value indicating whether this writer is closed. + + + + + + Writes a character to the underlying writer + + the char to write + + + Writes a character to the underlying writer + + + + + + Writes a buffer to the underlying writer + + the buffer to write + the start index to write from + the number of characters to write + + + Writes a buffer to the underlying writer + + + + + + Writes a string to the output. + + The string data to write to the output. + + + Writes a string to the output. + + + + + + Closes the underlying output writer. + + + + Closes the underlying output writer. + + + + + + The error handler instance to pass all errors to + + + + + Flag to indicate if this writer is closed + + + + + Defines a lock that supports single writers and multiple readers + + + + ReaderWriterLock is used to synchronize access to a resource. + At any given time, it allows either concurrent read access for + multiple threads, or write access for a single thread. In a + situation where a resource is changed infrequently, a + ReaderWriterLock provides better throughput than a simple + one-at-a-time lock, such as . + + + If a platform does not support a System.Threading.ReaderWriterLock + implementation then all readers and writers are serialized. Therefore + the caller must not rely on multiple simultaneous readers. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Acquires a reader lock + + + + blocks if a different thread has the writer + lock, or if at least one thread is waiting for the writer lock. + + + + + + Decrements the lock count + + + + decrements the lock count. When the count + reaches zero, the lock is released. + + + + + + Acquires the writer lock + + + + This method blocks if another thread has a reader lock or writer lock. + + + + + + Decrements the lock count on the writer lock + + + + ReleaseWriterLock decrements the writer lock count. + When the count reaches zero, the writer lock is released. + + + + + + String keyed object map that is read only. + + + + This collection is readonly and cannot be modified. + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + The Hashtable used to store the properties data + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Copy Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Deserialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the key names. + + An array of all the keys. + + + Gets the key names. + + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + Test if the dictionary contains a specified key + + the key to look for + true if the dictionary contains the specified key + + + Test if the dictionary contains a specified key + + + + + + The hashtable used to store the properties + + + The internal collection used to store the properties + + + + The hashtable used to store the properties + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + Serializes this object into the provided. + + + + + + See + + + + + See + + + + + + See + + + + + + + Remove all properties from the properties collection + + + + + See + + + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + + + See + + + + + The number of properties in this collection + + + + + See + + + + + See + + + + + A that can be and reused + + + + A that can be and reused. + This uses a single buffer for string operations. + + + Nicko Cadell + + + + Create an instance of + + the format provider to use + + + Create an instance of + + + + + + Override Dispose to prevent closing of writer + + flag + + + Override Dispose to prevent closing of writer + + + + + + Reset this string writer so that it can be reused. + + the maximum buffer capacity before it is trimmed + the default size to make the buffer + + + Reset this string writer so that it can be reused. + The internal buffers are cleared and reset. + + + + + + Utility class for system specific information. + + + + Utility class of static methods for system specific information. + + + Nicko Cadell + Gert Driesen + Alexey Solofnenko + + + + Private constructor to prevent instances. + + + + Only static methods are exposed from this type. + + + + + + Initialize default values for private static fields. + + + + Only static methods are exposed from this type. + + + + + + Gets the system dependent line terminator. + + + The system dependent line terminator. + + + + Gets the system dependent line terminator. + + + + + + Gets the base directory for this . + + The base directory path for the current . + + + Gets the base directory for this . + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the configuration file for the current . + + The path to the configuration file for the current . + + + The .NET Compact Framework 1.0 does not have a concept of a configuration + file. For this runtime, we use the entry assembly location as the root for + the configuration file name. + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the file that first executed in the current . + + The path to the entry assembly. + + + Gets the path to the file that first executed in the current . + + + + + + Gets the ID of the current thread. + + The ID of the current thread. + + + On the .NET framework, the AppDomain.GetCurrentThreadId method + is used to obtain the thread ID for the current thread. This is the + operating system ID for the thread. + + + On the .NET Compact Framework 1.0 it is not possible to get the + operating system thread ID for the current thread. The native method + GetCurrentThreadId is implemented inline in a header file + and cannot be called. + + + On the .NET Framework 2.0 the Thread.ManagedThreadId is used as this + gives a stable id unrelated to the operating system thread ID which may + change if the runtime is using fibers. + + + + + + Get the host name or machine name for the current machine + + + The hostname or machine name + + + + Get the host name or machine name for the current machine + + + The host name () or + the machine name (Environment.MachineName) for + the current machine, or if neither of these are available + then NOT AVAILABLE is returned. + + + + + + Get this application's friendly name + + + The friendly name of this application as a string + + + + If available the name of the application is retrieved from + the AppDomain using AppDomain.CurrentDomain.FriendlyName. + + + Otherwise the file name of the entry assembly is used. + + + + + + Get the start time for the current process. + + + + This is the time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Get the UTC start time for the current process. + + + + This is the UTC time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Text to output when a null is encountered. + + + + Use this value to indicate a null has been encountered while + outputting a string representation of an item. + + + The default value is (null). This value can be overridden by specifying + a value for the log4net.NullText appSetting in the application's + .config file. + + + + + + Text to output when an unsupported feature is requested. + + + + Use this value when an unsupported feature is requested. + + + The default value is NOT AVAILABLE. This value can be overridden by specifying + a value for the log4net.NotAvailableText appSetting in the application's + .config file. + + + + + + Gets the assembly location path for the specified assembly. + + The assembly to get the location for. + The location of the assembly. + + + This method does not guarantee to return the correct path + to the assembly. If only tries to give an indication as to + where the assembly was loaded from. + + + + + + Gets the fully qualified name of the , including + the name of the assembly from which the was + loaded. + + The to get the fully qualified name for. + The fully qualified name for the . + + + This is equivalent to the Type.AssemblyQualifiedName property, + but this method works on the .NET Compact Framework 1.0 as well as + the full .NET runtime. + + + + + + Gets the short name of the . + + The to get the name for. + The short name of the . + + + The short name of the assembly is the + without the version, culture, or public key. i.e. it is just the + assembly's file name without the extension. + + + Use this rather than Assembly.GetName().Name because that + is not available on the Compact Framework. + + + Because of a FileIOPermission security demand we cannot do + the obvious Assembly.GetName().Name. We are allowed to get + the of the assembly so we + start from there and strip out just the assembly name. + + + + + + Gets the file name portion of the , including the extension. + + The to get the file name for. + The file name of the assembly. + + + Gets the file name portion of the , including the extension. + + + + + + Loads the type specified in the type string. + + A sibling type to use to load the type. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified, it will be loaded from the assembly + containing the specified relative type. If the type is not found in the assembly + then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the + assembly that is directly calling this method. If the type is not found + in the assembly then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + An assembly to load the type from. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the specified + assembly. If the type is not found in the assembly then all the loaded assemblies + will be searched for the type. + + + + + + Generate a new guid + + A new Guid + + + Generate a new guid + + + + + + Create an + + The name of the parameter that caused the exception + The value of the argument that causes this exception + The message that describes the error + the ArgumentOutOfRangeException object + + + Create a new instance of the class + with a specified error message, the parameter name, and the value + of the argument. + + + The Compact Framework does not support the 3 parameter constructor for the + type. This method provides an + implementation that works for all platforms. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Lookup an application setting + + the application settings key to lookup + the value for the key, or null + + + Configuration APIs are not supported under the Compact Framework + + + + + + Convert a path into a fully qualified local file path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + The path specified must be a local file path, a URI is not supported. + + + + + + Creates a new case-insensitive instance of the class with the default initial capacity. + + A new case-insensitive instance of the class with the default initial capacity + + + The new Hashtable instance uses the default load factor, the CaseInsensitiveHashCodeProvider, and the CaseInsensitiveComparer. + + + + + + Tests two strings for equality, the ignoring case. + + + If the platform permits, culture information is ignored completely (ordinal comparison). + The aim of this method is to provide a fast comparison that deals with null and ignores different casing. + It is not supposed to deal with various, culture-specific habits. + Use it to compare against pure ASCII constants, like keywords etc. + + The one string. + The other string. + true if the strings are equal, false otherwise. + + + + Gets an empty array of types. + + + + The Type.EmptyTypes field is not available on + the .NET Compact Framework 1.0. + + + + + + The fully qualified type of the SystemInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Cache the host name for the current machine + + + + + Cache the application friendly name + + + + + Text to output when a null is encountered. + + + + + Text to output when an unsupported feature is requested. + + + + + Start time for the current process. + + + + + Utility class that represents a format string. + + + + Utility class that represents a format string. + + + Nicko Cadell + + + + Initialise the + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + + + Format the string and arguments + + the formatted string + + + + Replaces the format item in a specified with the text equivalent + of the value of a corresponding instance in a specified array. + A specified parameter supplies culture-specific formatting information. + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + A copy of format in which the format items have been replaced by the + equivalent of the corresponding instances of in args. + + + + This method does not throw exceptions. If an exception thrown while formatting the result the + exception and arguments are returned in the result string. + + + + + + Process an error during StringFormat + + + + + Dump the contents of an array into a string builder + + + + + Dump an object to a string + + + + + The fully qualified type of the SystemStringFormat class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adapter that extends and forwards all + messages to an instance of . + + + + Adapter that extends and forwards all + messages to an instance of . + + + Nicko Cadell + + + + The writer to forward messages to + + + + + Create an instance of that forwards all + messages to a . + + The to forward to + + + Create an instance of that forwards all + messages to a . + + + + + + Gets or sets the underlying . + + + The underlying . + + + + Gets or sets the underlying . + + + + + + The Encoding in which the output is written + + + The + + + + The Encoding in which the output is written + + + + + + Gets an object that controls formatting + + + The format provider + + + + Gets an object that controls formatting + + + + + + Gets or sets the line terminator string used by the TextWriter + + + The line terminator to use + + + + Gets or sets the line terminator string used by the TextWriter + + + + + + Closes the writer and releases any system resources associated with the writer + + + + + + + + + Dispose this writer + + flag indicating if we are being disposed + + + Dispose this writer + + + + + + Flushes any buffered output + + + + Clears all buffers for the writer and causes any buffered data to be written + to the underlying device + + + + + + Writes a character to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a character to the wrapped TextWriter + + + + + + Writes a character buffer to the wrapped TextWriter + + the data buffer + the start index + the number of characters to write + + + Writes a character buffer to the wrapped TextWriter + + + + + + Writes a string to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a string to the wrapped TextWriter + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + Nicko Cadell + + + + Each thread will automatically have its instance. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Remove a property + + the key for the entry to remove + + + Remove a property + + + + + + Get the keys stored in the properties. + + + Gets the keys stored in the properties. + + a set of the defined keys + + + + Clear all properties + + + + Clear all properties + + + + + + Get the PropertiesDictionary for this thread. + + create the dictionary if it does not exist, otherwise return null if does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doing so. + + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this tread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatability + of the . Tytpically the internal stack should not + be modified. + + + + + + Gets the current context information for this stack. + + Gets the current context information + + + Gets the current context information for this stack. + + + + + + Get a portable version of this object + + the portable instance of this object + + + Get a cross thread portable version of this object + + + + + + Inner class used to represent a single context frame in the stack. + + + + Inner class used to represent a single context frame in the stack. + + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The ThreadContextStack internal stack + + + + + The depth to trim the stack to when this instance is disposed + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + + + Implementation of Stacks collection for the + + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Utility class for transforming strings. + + + + Utility class for transforming strings. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Write a string to an + + the writer to write to + the string to write + The string to replace non XML compliant chars with + + + The test is escaped either using XML escape entities + or using CDATA sections. + + + + + + Replace invalid XML characters in text string + + the XML text input string + the string to use in place of invalid characters + A string that does not contain invalid XML characters. + + + Certain Unicode code points are not allowed in the XML InfoSet, for + details see: http://www.w3.org/TR/REC-xml/#charsets. + + + This method replaces any illegal characters in the input string + with the mask string specified. + + + + + + Count the number of times that the substring occurs in the text + + the text to search + the substring to find + the number of times the substring occurs in the text + + + The substring is assumed to be non repeating within itself. + + + + + + Characters illegal in XML 1.0 + + + + + Type converter for Boolean. + + + + Supports conversion from string to bool type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Exception base type for conversion errors. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class + with the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + An instance of the . + + + Creates a new instance of the class. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + A nested exception to include. + An instance of the . + + + Creates a new instance of the class. + + + + + + Register of type converters for specific types. + + + + Maintains a registry of type converters used to convert between + types. + + + Use the and + methods to register new converters. + The and methods + lookup appropriate converters to use. + + + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + Initializes a new instance of the class. + + + + + Static constructor. + + + + This constructor defines the intrinsic type converters. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type converter to use to convert to the destination type. + + + Adds a converter instance for a specific type. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type of the type converter to use to convert to the destination type. + + + Adds a converter for a specific type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted from. + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Lookups the type converter to use as specified by the attributes on the + destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Creates the instance of the type converter. + + The type of the type converter. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + The type specified for the type converter must implement + the or interfaces + and must have a public default (no argument) constructor. + + + + + + The fully qualified type of the ConverterRegistry class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Mapping from to type converter. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an encoding + the encoding + + + Uses the method to + convert the argument to an . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Interface supported by type converters + + + + This interface supports conversion from arbitrary types + to a single target type. See . + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Test if the can be converted to the + type supported by this converter. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Converts the to the type supported + by this converter. + + + + + + Interface supported by type converters + + + + This interface supports conversion from a single type to arbitrary types. + See . + + + Nicko Cadell + + + + Returns whether this converter can convert the object to the specified type + + A Type that represents the type you want to convert to + true if the conversion is possible + + + Test if the type supported by this converter can be converted to the + . + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Converts the (which must be of the type supported + by this converter) to the specified.. + + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an IPAddress + the IPAddress + + + Uses the method to convert the + argument to an . + If that fails then the string is resolved as a DNS hostname. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Valid characters in an IPv4 or IPv6 address string. (Does not support subnets) + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternLayout + the PatternLayout + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Convert between string and + + + + Supports conversion from string to type, + and from a type to a string. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the target type be converted to the type supported by this object + + A that represents the type you want to convert to + true if the conversion is possible + + + Returns true if the is + assignable from a type. + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + . To check for this condition use the + method. + + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternString + the PatternString + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a Type + the Type + + + Uses the method to convert the + argument to a . + Additional effort is made to locate partially specified types + by searching the loaded assemblies. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Attribute used to associate a type converter + + + + Class and Interface level attribute that specifies a type converter + to use with the associated type. + + + To associate a type converter with a target type apply a + TypeConverterAttribute to the target type. Specify the + type of the type converter on the attribute. + + + Nicko Cadell + Gert Driesen + + + + The string type name of the type converter + + + + + Default constructor + + + + Default constructor + + + + + + Create a new type converter attribute for the specified type name + + The string type name of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + Create a new type converter attribute for the specified type + + The type of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + The string type name of the type converter + + + The string type name of the type converter + + + + The type specified must implement the + or the interfaces. + + + + + + Impersonate a Windows Account + + + + This impersonates a Windows account. + + + How the impersonation is done depends on the value of . + This allows the context to either impersonate a set of user credentials specified + using username, domain name and password or to revert to the process credentials. + + + + + + The impersonation modes for the + + + + See the property for + details. + + + + + + Impersonate a user using the credentials supplied + + + + + Revert this the thread to the credentials of the process + + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets the impersonation mode for this security context + + + The impersonation mode for this security context + + + + Impersonate either a user with user credentials or + revert this thread to the credentials of the process. + The value is one of the + enum. + + + The default value is + + + When the mode is set to + the user's credentials are established using the + , and + values. + + + When the mode is set to + no other properties need to be set. If the calling thread is + impersonating then it will be reverted back to the process credentials. + + + + + + Gets or sets the Windows username for this security context + + + The Windows username for this security context + + + + This property must be set if + is set to (the default setting). + + + + + + Gets or sets the Windows domain name for this security context + + + The Windows domain name for this security context + + + + The default value for is the local machine name + taken from the property. + + + This property must be set if + is set to (the default setting). + + + + + + Sets the password for the Windows account specified by the and properties. + + + The password for the Windows account specified by the and properties. + + + + This property must be set if + is set to (the default setting). + + + + + + Initialize the SecurityContext based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The security context will try to Logon the specified user account and + capture a primary token for impersonation. + + + The required , + or properties were not specified. + + + + Impersonate the Windows account specified by the and properties. + + caller provided state + + An instance that will revoke the impersonation of this SecurityContext + + + + Depending on the property either + impersonate a user using credentials supplied or revert + to the process credentials. + + + + + + Create a given the userName, domainName and password. + + the user name + the domain name + the password + the for the account specified + + + Uses the Windows API call LogonUser to get a principal token for the account. This + token is used to initialize the WindowsIdentity. + + + + + + Adds to + + + + Helper class to expose the + through the interface. + + + + + + Constructor + + the impersonation context being wrapped + + + Constructor + + + + + + Revert the impersonation + + + + Revert the impersonation + + + + + diff --git a/JY.Inspection/packages.config b/JY.Inspection/packages.config new file mode 100644 index 0000000..6b0d21a --- /dev/null +++ b/JY.Inspection/packages.config @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JY.Inspection/外观检测.ico b/JY.Inspection/外观检测.ico new file mode 100644 index 0000000000000000000000000000000000000000..8301a4a1a261e2302c681ddc21d5d2b35fe19535 GIT binary patch literal 67646 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 + /// 检查条码接口参数类 + /// + public class CheckBarcodeParam + { + /// + /// 数据组集合 + /// + public DataIn data { get; set; } + /// + /// 资源编号 + /// + public string resourceNo { get; set; } + + } + public class DataIn + { + /// + /// 系统编号 + /// + public string systemCode { get; set; } + /// + /// 产线编号 + /// + public string houseCode { get; set; } + /// + /// 条码 + /// + public string skuCode { get; set; } + /// + /// 设备号 + /// + public string deviceCode { get; set; } + /// + /// 工序号 + /// + public string processCode { get; set; } + + + /// + /// 状态反馈结果 + /// + public string statusCode { get; set; } + /// + /// 返回说明信息 + /// + public string stautsMessage { get; set; } + } + +} diff --git a/JY.MES/Entity/CheckBarcodeResult.cs b/JY.MES/Entity/CheckBarcodeResult.cs new file mode 100644 index 0000000..1b0ab81 --- /dev/null +++ b/JY.MES/Entity/CheckBarcodeResult.cs @@ -0,0 +1,29 @@ +using JY.Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.MES.Entity +{ + + /// + /// 检查条码接口结果类 + /// + public class CheckBarcodeResult : RequestResult + { + /// + /// 返回的数据 + /// + public string data { get; set; } + /// + /// 状态 + /// + public string status { get; set; } + /// + /// code代码 + /// + public int code { get; set; } + } +} diff --git a/JY.MES/Entity/EqpStatusParam.cs b/JY.MES/Entity/EqpStatusParam.cs new file mode 100644 index 0000000..e6856e5 --- /dev/null +++ b/JY.MES/Entity/EqpStatusParam.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.MES.Entity +{ + /// + /// 设备状态上传接口参数类 + /// + public class StatusData + { + /// + /// + /// + public string deviceNo { get; set; } + /// + /// + /// + public string deviceState { get; set; } + /// + /// + /// + public string stateCode { get; set; } + /// + /// + /// + public string createTime { get; set; } + } + + public class EqpStatusParam + { + /// + /// + /// + public StatusData statusdata { get; set; } + /// + /// + /// + public string resourceNo { get; set; } + } + +} diff --git a/JY.MES/Entity/EqpStatusResult.cs b/JY.MES/Entity/EqpStatusResult.cs new file mode 100644 index 0000000..b2722e7 --- /dev/null +++ b/JY.MES/Entity/EqpStatusResult.cs @@ -0,0 +1,28 @@ +using JY.Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.MES.Entity +{ + /// + /// 设备状态上传接口结果类 + /// + public class EqpStatusResult : RequestResult + { + /// + /// 返回的数据 + /// + public string data { get; set; } + /// + /// 状态 + /// + public string status { get; set; } + /// + /// code代码 + /// + public int code { get; set; } + } +} diff --git a/JY.MES/Entity/UploadAlarmParam.cs b/JY.MES/Entity/UploadAlarmParam.cs new file mode 100644 index 0000000..51ad517 --- /dev/null +++ b/JY.MES/Entity/UploadAlarmParam.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.MES.Entity +{ + /// + /// 报警数据上传接口参数类 + /// + public class AlarmMesData + { + /// + /// + /// + public string deviceNo { get; set; } + /// + /// + /// + public string alarmCode { get; set; } + /// + /// + /// + public string alarmType { get; set; } + /// + /// + /// + public string alarmName { get; set; } + /// + /// + /// + public string createTime { get; set; } + } + + public class UploadAlarmParam + { + /// + /// + /// + public AlarmMesData alarmMesData { get; set; } + /// + /// + /// + public string resourceNo { get; set; } + } + +} diff --git a/JY.MES/Entity/UploadAlarmResult.cs b/JY.MES/Entity/UploadAlarmResult.cs new file mode 100644 index 0000000..3553da0 --- /dev/null +++ b/JY.MES/Entity/UploadAlarmResult.cs @@ -0,0 +1,28 @@ +using JY.Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.MES.Entity +{ + /// + /// 报警数据上传接口结果类 + /// + public class UploadAlarmResult : RequestResult + { + /// + /// 返回的数据 + /// + public string data { get; set; } + /// + /// 状态 + /// + public string status { get; set; } + /// + /// code代码 + /// + public int code { get; set; } + } +} diff --git a/JY.MES/Entity/UploadTestDataParam.cs b/JY.MES/Entity/UploadTestDataParam.cs new file mode 100644 index 0000000..9acd97b --- /dev/null +++ b/JY.MES/Entity/UploadTestDataParam.cs @@ -0,0 +1,421 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.MES.Entity +{ + public class Surface1 + { + /// + /// 检测面1设备 + /// + public string device { get; set; } + /// + /// + /// + public string checkResult { get; set; } + } + + public class Surface2 + { + /// + /// 检测面1设备 + /// + public string device { get; set; } + /// + /// + /// + public string checkResult { get; set; } + } + + public class Surface3 + { + /// + /// 检测面1设备 + /// + public string device { get; set; } + /// + /// + /// + public string checkResult { get; set; } + } + + public class Surface4 + { + /// + /// 检测面1设备 + /// + public string device { get; set; } + /// + /// + /// + public string checkResult { get; set; } + } + + public class Surface5 + { + /// + /// 检测面1设备 + /// + public string device { get; set; } + /// + /// + /// + public string checkResult { get; set; } + } + + public class Surface6 + { + /// + /// 检测面1设备 + /// + public string device { get; set; } + /// + /// + /// + public string checkResult { get; set; } + } + + public class Surface7 + { + /// + /// 检测面1设备 + /// + public string device { get; set; } + /// + /// + /// + public string checkResult { get; set; } + } + + public class Surface8 + { + /// + /// 检测面1设备 + /// + public string device { get; set; } + /// + /// + /// + public string checkResult { get; set; } + } + + public class Surface9 + { + /// + /// 检测面1设备 + /// + public string device { get; set; } + /// + /// + /// + public string checkResult { get; set; } + } + + public class Surface10 + { + /// + /// 检测面1设备 + /// + public string device { get; set; } + /// + /// + /// + public string checkResult { get; set; } + } + + public class Surface11 + { + /// + /// 检测面1设备 + /// + public string device { get; set; } + /// + /// + /// + public string checkResult { get; set; } + } + + public class Surface12 + { + /// + /// 检测面1设备 + /// + public string device { get; set; } + /// + /// + /// + public string checkResult { get; set; } + } + + public class Surface13 + { + /// + /// 检测面1设备 + /// + public string device { get; set; } + /// + /// + /// + public string checkResult { get; set; } + } + + public class Surface14 + { + /// + /// 检测面1设备 + /// + public string device { get; set; } + /// + /// + /// + public string checkResult { get; set; } + } + + public class Other + { + /// + /// 其他设备 + /// + public string device { get; set; } + /// + /// + /// + public string checkResult { get; set; } + } + + public class DataItem + { + #region 原来 + /// + /// 进站时间 + /// + public string inStation { get; set; } + /// + /// 出站时间 + /// + public string outStation { get; set; } + /// + /// 外观检测 + /// + public string deviceNo { get; set; } + /// + /// 电芯条码 + /// + public string cellBarCode { get; set; } + /// + /// 检测面1结果 + /// + public Surface1 surface1 { get; set; } + /// + /// 检测面2结果 + /// + public Surface2 surface2 { get; set; } + /// + /// + /// + public Surface3 surface3 { get; set; } + /// + /// + /// + public Surface4 surface4 { get; set; } + /// + /// + /// + public Surface5 surface5 { get; set; } + /// + /// + /// + public Surface6 surface6 { get; set; } + /// + /// + /// + public Surface7 surface7 { get; set; } + /// + /// + /// + public Surface8 surface8 { get; set; } + /// + /// + /// + public Surface9 surface9 { get; set; } + /// + /// + /// + public Surface10 surface10 { get; set; } + /// + /// + /// + public Surface11 surface11 { get; set; } + /// + /// + /// + public Surface12 surface12 { get; set; } + /// + /// + /// + public Surface13 surface13 { get; set; } + /// + /// + /// + public Surface14 surface14 { get; set; } + /// + /// + /// + public Other other { get; set; } + /// + /// 电芯状态 正常:100 异常:231 + /// + public int cellState { get; set; } + /// + /// 错误编码 + /// + public string errorCode { get; set; } + /// + /// 备注 + /// + public string remark { get; set; } + /// + /// 是否复测 1复测 0是正常 + /// + public int retest { get; set; } + /// + /// 班次 + /// + public string workShift { get; set; } + ///// + ///// 工序编码 + ///// + //public string processCode { get; set; } + #endregion + + /// + /// 系统编号 + /// + public string systemCode { get; set; } + /// + /// 产线编号 + /// + public string houseCode { get; set; } + /// + /// 条码 + /// + public string skuCode { get; set; } + /// + /// 设备号 + /// + public string deviceCode { get; set; } + /// + /// 工序号 + /// + public string processCode { get; set; } + /// + /// 电芯结果 + /// + public string testResult { get; set; } + /// + /// ng代码 + /// + public string ngCode { get; set; } + /// + /// 工序数据集 + /// + public string processData { get; set; } + + + + /// + /// 进站时间 + /// + public string inTime { get; set; } + /// + /// 出站时间 + /// + public string outTime { get; set; } + /// + /// 参数判定结果 + /// + public string cspdjg { get; set; } + /// + /// 测试时间 + /// + public string cssj { get; set; } + /// + /// 测试批次 + /// + public string cspc { get; set; } + /// + /// 测试结果 + /// + public string csjg { get; set; } + /// + /// 复测标记 + /// + public string fcbj { get; set; } + /// + /// 复测次数 + /// + public string fccs { get; set; } + /// + /// 复测时间 + /// + public string fcsj { get; set; } + /// + /// 复测原因 + /// + public string fcyy { get; set; } + /// + /// NG原因 + /// + public string ngyy { get; set; } + /// + /// NG时间 + /// + public string ngsj { get; set; } + /// + /// NG位置 + /// + public string ngwz { get; set; } + /// + /// 环境温度 + /// + public string hjwd { get; set; } + /// + /// 环境湿度 + /// + public string hjsd { get; set; } + /// + /// 空气洁净度 + /// + public string kqjjd { get; set; } + + + /// + /// 状态反馈结果 + /// + public string statusCode { get; set; } + /// + /// 返回说明信息 + /// + public string stautsMessage { get; set; } + + } + + /// + /// 电芯出站数据 + /// + public class UploadTestDataParam + { + /// + /// + /// + public List data { get; set; } + /// + /// + /// + public string resourceNo { get; set; } + } + +} diff --git a/JY.MES/Entity/UploadTestDataResult.cs b/JY.MES/Entity/UploadTestDataResult.cs new file mode 100644 index 0000000..37fd21f --- /dev/null +++ b/JY.MES/Entity/UploadTestDataResult.cs @@ -0,0 +1,28 @@ +using JY.Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.MES.Entity +{ + /// + /// 测试结果上传接口结果类 + /// + public class UploadTestDataResult : RequestResult + { + /// + /// 返回的数据 + /// + public string data { get; set; } + /// + /// 状态 + /// + public string status { get; set; } + /// + /// code代码 + /// + public int code { get; set; } + } +} diff --git a/JY.MES/FMS/FMS_Alarm.cs b/JY.MES/FMS/FMS_Alarm.cs new file mode 100644 index 0000000..ba05c7f --- /dev/null +++ b/JY.MES/FMS/FMS_Alarm.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.MES.FMS +{ + public class FMS_Alarm + { + /// + /// 系统编号 + /// + public string systemCode { get; set; } + /// + /// 产线编号 + /// + public string houseCode { get; set; } + /// + /// 设备编号 + /// + public string equipNum { get; set; } + /// + /// 库位ID + /// + public string seatId { get; set; } + /// + /// 采集时间 + /// + public string recordDate { get; set; } + /// + /// 唯一标识符号 + /// + public string guid { get; set; } + /// + /// 报警消除时间 + /// + public string alarmEndTime { get; set; } + /// + /// 报警类型 + /// + public string alarmType { get; set; } + /// + /// 报警名称 + /// + public string alarmName { get; set; } + /// + /// 报警开始时间 + /// + public string alarmStartTime { get; set; } + /// + /// 故障代码 + /// + public string faultCode { get; set; } + } +} diff --git a/JY.MES/FMS/FMS_Materialln.cs b/JY.MES/FMS/FMS_Materialln.cs new file mode 100644 index 0000000..665837e --- /dev/null +++ b/JY.MES/FMS/FMS_Materialln.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.MES.FMS +{ + public class FMS_Materialln + { + /// + /// 系统编号 + /// + public string systemCode { get; set; } + /// + /// 产线编号 + /// + public string houseCode { get; set; } + /// + /// 电芯条码 + /// + public string skuCode { get; set; } + /// + /// 设备号 + /// + public string deviceCode { get; set; } + /// + /// 工序号 + /// + public string processCode { get; set; } + } +} diff --git a/JY.MES/FMS/FMS_Status.cs b/JY.MES/FMS/FMS_Status.cs new file mode 100644 index 0000000..b76f3ae --- /dev/null +++ b/JY.MES/FMS/FMS_Status.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.MES.FMS +{ + public class FMS_Status + { + /// + /// 系统编号 + /// + public string systemCode { get; set; } + /// + /// 产线编号 + /// + public string houseCode { get; set; } + /// + /// 设备编号 + /// + public string equipNum { get; set; } + /// + /// 库位ID + /// + public string seatId { get; set; } + /// + /// 采集时间 + /// + public string recordDate { get; set; } + /// + /// 设备状态 + /// + public string statusCode { get; set; } + /// + /// 状态变更时间 + /// + public string uploadTime { get; set; } + /// + /// 唯一标识符号 + /// + public string guid { get; set; } + } +} diff --git a/JY.MES/FMS/MesHelper_EVE.cs b/JY.MES/FMS/MesHelper_EVE.cs new file mode 100644 index 0000000..52b328e --- /dev/null +++ b/JY.MES/FMS/MesHelper_EVE.cs @@ -0,0 +1,529 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; + + +namespace JY.MES.FMS +{ + public class MesHelper_EVE + { + /// + /// 接口地址 + /// + public string UserVerifyUrl = "http://10.6.1.155/core/api/public/equipment/base/user/login/verify"; + //public static string InboundUrl = "http://10.6.1.155/core/api/public/in/station/process/true"; + //public string OutboundUrl = "http://10.6.1.155/core/api/public/out/station/process/true"; + public string ProductParamUrl = "http://10.6.1.155/core/api/public/product/process/param/result"; + public string EquipmentStatusUrl = "http://10.6.1.155/core/api/public/eve/pm/eqm/run/status/operation"; + public string AlarmStatusUrl = "http://10.6.1.155/core/api/public/equipment/alarm/currency"; + public string GetRecipeUrl = "http://10.6.1.155/core/api/public/param/set/request"; + public string UnloadRecipeUrl = "http://10.6.1.155/core/api/public/api/public/param/setting/change"; + + + public string 电芯入站 = "http://192.168.1.11:30030/fms/restful/api/v3/process/CheckMaterialStatus"; + public string 电芯出站 = "http://192.168.1.11:30030/fms/restful/api/v3/process/MaterialEX"; + public string 设备状态 = "http://192.168.1.11:30030/fms/restful/api/v3/device/uploadDeviceStatus"; + public string 报警 = "http://192.168.1.11:30030/fms/restful/api/v3/device/uploadDeviceError"; + + + public static string InboundUrl = "http://192.168.1.11:30030/fms/restful/api/v3/process/CheckMaterialStatus"; + public static string OutboundUrl = "http://192.168.1.11:30030/fms/restful/api/v3/process/MaterialEX"; + public static string StatusUrl = "http://192.168.1.11:30030/fms/restful/api/v3/device/uploadDeviceStatus"; + public static string AlarmUrl = "http://192.168.1.11:30030/fms/restful/api/v3/device/uploadDeviceError"; + public static string MateriallnStationeUrl = "http://192.168.1.11:30030/fms/restful/api/v3/inventory/materiallnStatione"; + + /// + /// 超时 + /// + public int _TimeOut = 3000; + /// + /// 凭证 + /// + //public Credentials Credentials { get; set; } + MesRequestAndRespondParam mrrp = new MesRequestAndRespondParam(); + /// + /// 初始标记为false(离线文件标记) + /// + public static bool WriteState { get; set; } = false; + + public static List listSource = new List(); + + ///// + ///// 提交登录窗口填写的信息,登录MES + ///// + ///// + ///// + //public MesRespondParam.MesResult MesPost(T t, int Type) where T : class + //{ + // var Start = DateTime.Now; + // MesRespondParam.MesResult _mesResult = new MesRespondParam.MesResult(); + // try + // { + // //等待7秒,如果超过7秒未收到MES返回消息,视为超时 + // new Task(() => + // { + // if ((DateTime.Now - Start).TotalMilliseconds > 7000) + // { + // _mesResult.code = "-9999"; + // _mesResult.message = "交互超时"; + // _mesResult.success = false; + // } + + // }).Start(); + + // var json = JsonHelper.SerializeObject(t); + + // if (Type == 0) + // { + // Addlo.WriteEorr($@"【向服务端发送信息】: {Convert.ToString(json)}", "测试日志", "入站服务端数据", Type: "UTF-8"); + // } + // else + // { + // SysLog.WriteEorr($@"【向服务端发送信息】: {Convert.ToString(json)}", "测试日志", "出站服务端数据", Type: "UTF-8"); + // } + + // string jsnstr = PostWebRequest(Type == 0 ? 电芯入站 : 电芯出站, json, Type == 0 ? "入站" : "出站"); //request.GetJsonResponse(UserVerifyUrl, JsonHelper.SerializeObject(mParam)); + // _mesResult = JsonHelper.DeserializeJsonToObject(jsnstr); + + // if (Type == 0) + // { + // SysLog.WriteEorr($@"【接收服务端返回信息】: {Convert.ToString(jsnstr)}", "测试日志", "入站服务端数据", Type: "UTF-8"); + // } + // else + // { + // SysLog.WriteEorr($@"【接收服务端返回信息】: {Convert.ToString(jsnstr)}", "测试日志", "出站服务端数据", Type: "UTF-8"); + // } + // } + // catch (Exception ex) + // { + // _mesResult.code = "-404"; + // _mesResult.message = ex.Message; + // _mesResult.success = false; + // } + // return _mesResult; + //} + + /// + /// 容量分档 + /// + /// + /// + public static MesReturnParam.MesResult FMS_MateriallnStatione(FMS_Materialln mParam) + { + MesReturnParam.MesResult _mesResult = new FMS.MesReturnParam.MesResult(); + try + { + string jsnstr = PostWebRequest(MateriallnStationeUrl, Newtonsoft.Json.JsonConvert.SerializeObject(mParam)); + _mesResult = Newtonsoft.Json.JsonConvert.DeserializeObject(jsnstr); + } + catch (Exception ex) + { + _mesResult.statusCode = -9999; + _mesResult.statusMessage = ex.Message; + + } + return _mesResult; + } + + /// + /// 产品进站 + /// + /// + /// + public static MesReturnParam.MesResult MES_Inbound(FMS_In mParam) + { + MesReturnParam.MesResult _mesResult = new FMS.MesReturnParam.MesResult(); + try + { + string jsnstr = PostWebRequest(InboundUrl, Newtonsoft.Json.JsonConvert.SerializeObject(mParam)); + _mesResult = Newtonsoft.Json.JsonConvert.DeserializeObject(jsnstr); + } + catch (Exception ex) + { + _mesResult.statusCode = -9999; + _mesResult.statusMessage = ex.Message; + + } + return _mesResult; + } + /// + /// 产品出站 + /// + /// + /// + public static MesRequestAndRespondParam.MesRespondParam.MesResult MES_Outbound(FMS_Out mParam) + { + MesRequestAndRespondParam.MesRespondParam.MesResult _mesResult = new MesRequestAndRespondParam.MesRespondParam.MesResult(); + string jsnstr = PostWebRequest(OutboundUrl, Newtonsoft.Json.JsonConvert.SerializeObject(mParam)); + + try + { + if (jsnstr.Contains("【链接异常】")) + { + //异常视为离线,如果离线,则将数据保存到本地 + SaveOutlineData(jsnstr); + } + _mesResult = Newtonsoft.Json.JsonConvert.DeserializeObject(jsnstr); + } + catch (Exception ex) + { + _mesResult.statusCode = -9999; + _mesResult.statusMessage = ex.Message; + } + return _mesResult; + } + + + /// + /// 设备状态上传MES + /// + /// + /// + public static MesRequestAndRespondParam.MesRespondParam.GetRecipeRespond MES_Status(FMS_Status mParam) + { + //string jsnstr = PostHelper.HttpPostJsonAPI1(StatusUrl, Newtonsoft.Json.JsonConvert.SerializeObject(mParam)); + //return Newtonsoft.Json.JsonConvert.DeserializeObject(jsnstr); + + MesRequestAndRespondParam.MesRespondParam.GetRecipeRespond _mesResult = new MesRequestAndRespondParam.MesRespondParam.GetRecipeRespond(); + try + { + string jsnstr = PostWebRequest(StatusUrl, Newtonsoft.Json.JsonConvert.SerializeObject(mParam)); + _mesResult = Newtonsoft.Json.JsonConvert.DeserializeObject(jsnstr); + } + catch (Exception ex) + { + _mesResult.code = "-9999"; + _mesResult.message = ex.Message; + _mesResult.success = "失败"; + _mesResult.category = ""; + } + return _mesResult; + } + + /// + /// 报警上传MES + /// + /// + /// + public static MesRequestAndRespondParam.MesRespondParam.GetRecipeRespond MES_Alarm(FMS_Alarm mParam) + { + + //string jsnstr = PostHelper.HttpPostJsonAPI1(AlarmUrl, Newtonsoft.Json.JsonConvert.SerializeObject(mParam)); + //return Newtonsoft.Json.JsonConvert.DeserializeObject(jsnstr); + + MesRequestAndRespondParam.MesRespondParam.GetRecipeRespond _mesResult = new MesRequestAndRespondParam.MesRespondParam.GetRecipeRespond(); + try + { + string jsnstr = PostWebRequest(AlarmUrl, Newtonsoft.Json.JsonConvert.SerializeObject(mParam)); + _mesResult = Newtonsoft.Json.JsonConvert.DeserializeObject(jsnstr); + } + catch (Exception ex) + { + _mesResult.code = "-9999"; + _mesResult.message = ex.Message; + _mesResult.success = "失败"; + _mesResult.category = ""; + } + return _mesResult; + } + + ///// + ///// 加工参数采集 + ///// + ///// + ///// + //public MesRequestAndRespondParam.MesRespondParam.MesResult MES_ProductParaColloctUniversal(MesRequestAndRespondParam.MesRequestParam.ProductDataRequest mParam) + //{ + // MesRequestAndRespondParam.MesRespondParam.MesResult _mesResult = new MesRequestAndRespondParam.MesRespondParam.MesResult(); + // string jsnstPostWebRequestr = (ProductParamUrl, JsonHelper.SerializeObject(mParam)); + + // try + // { + // _mesResult = JsonHelper.DeserializeJsonToObject(jsnstr); + // } + // catch (Exception ex) + // { + // _mesResult.code = "-9999"; + // _mesResult.message = ex.Message; + // _mesResult.success = false; + // } + // return _mesResult; + //} + /// + /// 加工参数采集(手动或离线传入上传内容) + /// + /// + /// + //public MesRequestAndRespondParam.MesRespondParam.MesResult MES_ProductParaColloctUniversal(string JsString) + //{ + // MesRequestAndRespondParam.MesRespondParam.MesResult _mesResult = new MesRequestAndRespondParam.MesRespondParam.MesResult(); + // try + // { + // string jsnstr = JsString; + // _mesResult = JsonHelper.DeserializeJsonToObject(jsnstr); + // } + // catch (Exception ex) + // { + // _mesResult.code = "-9999"; + // _mesResult.message = ex.Message; + // _mesResult.success = false; + // } + // return _mesResult; + + //} + + ///// + ///// 设备状态采集 + ///// + ///// + ///// + //public MesRespondParam.MesResult MES_EquipStatusCollect(MesRequestParam.EquipStatusRequest mParam) + //{ + // MesRespondParam.MesResult _mesResult = new MesRespondParam.MesResult(); + // try + // { + // string jsnstr = PostWebRequest(EquipmentStatusUrl, JsonHelper.SerializeObject(mParam)); + // _mesResult = JsonHelper.DeserializeJsonToObject(jsnstr); + // } + // catch (Exception ex) + // { + // _mesResult.code = "-9999"; + // _mesResult.message = ex.Message; + // _mesResult.success = false; + // } + // return _mesResult; + //} + ///// + ///// 设备报警采集 + ///// + ///// + ///// + //public MesRespondParam.MesResult MES_Alarm(MesRequestParam.AlarmRequest mParam) + //{ + // MesRespondParam.MesResult _mesResult = new MesRespondParam.MesResult(); + // try + // { + // string jsnstr = PostWebRequest(AlarmStatusUrl, JsonHelper.SerializeObject(mParam)); + // _mesResult = JsonHelper.DeserializeJsonToObject(jsnstr); + // } + // catch (Exception ex) + // { + // _mesResult.code = "-9999"; + // _mesResult.message = ex.Message; + // _mesResult.success = false; + // } + // return _mesResult; + //} + /// + /// 配方修改上传 + /// + /// + /// + //public MesRespondParam.MesResult MES_UploadRecipe(MesRequestParam.SetRecipeRequest mParam) + //{ + // MesRespondParam.MesResult _mesResult = new MesRespondParam.MesResult(); + // try + // { + // string jsnstr = PostWebRequest(UnloadRecipeUrl, JsonHelper.SerializeObject(mParam)); + // _mesResult = JsonHelper.DeserializeJsonToObject(jsnstr); + // } + // catch (Exception ex) + // { + // _mesResult.code = "-9999"; + // _mesResult.message = ex.Message; + // _mesResult.success = false; + // } + // return _mesResult; + //} + ///// + ///// 配方下载 + ///// + ///// + ///// + //public MesRespondParam.GetRecipeRespond MES_GetRecipe(MesRequestParam.GetRecipeRequest mParam) + //{ + // MesRespondParam.GetRecipeRespond _mesResult = new MesRespondParam.GetRecipeRespond(); + // try + // { + // string jsnstr = PostWebRequest(GetRecipeUrl, JsonHelper.SerializeObject(mParam)); + // _mesResult = JsonHelper.DeserializeJsonToObject(jsnstr); + // } + // catch (Exception ex) + // { + // _mesResult.code = "-9999"; + // _mesResult.message = ex.Message; + // _mesResult.success = false; + // } + // return _mesResult; + //} + #region 公共 + + + /// + /// Post数据接口 + /// + /// 接口地址 + /// 提交json数据 + /// 编码方式(Encoding.UTF8) + /// + public static string PostWebRequest(string postUrl, string paramData, string SockAction = "") + { + string responseContent = string.Empty; + try + { + string TypeName = string.Empty; + if (SockAction.Contains("入站")) + { + TypeName = "入站操作"; + } + else + { + TypeName = "出站操作"; + } + + byte[] byteArray = Encoding.UTF8.GetBytes(paramData); //转化 + HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(postUrl)); + //webReq.Timeout = _TimeOut; + webReq.Method = "POST"; + webReq.ContentType = "application/json;charset=UTF-8"; + //webReq.ContentType = "application/x-www-form-urlencoded;charset=UTF-8"; + //webReq.ContentLength = byteArray.Length; + if (SockAction.Length > 0) + webReq.Headers.Add("SOAPAction", SockAction); + //if (this.Credentials != null) + { + //(2)设置Headers Authorization + webReq.Headers.Add("Authorization", "Basic " /*+ Convert.ToBase64String(Encoding.UTF8.GetBytes($"{Credentials.UserName}:{Credentials.Password}"))*/); + } + //webReq.CookieContainer = new CookieContainer(); + //webReq.ContentType = "application/json;"; + + ////(1)设置请求Credentials + //CredentialCache credentialCache = new CredentialCache(); + //credentialCache.Add(new Uri("接口地址"), "Basic", new NetworkCredential("用户名", "密码")); + //webReq.Credentials = credentialCache; + + using (Stream reqStream = webReq.GetRequestStream()) + { + StreamWriter mySwrite = new StreamWriter(reqStream, Encoding.GetEncoding("UTF-8")); + mySwrite.Write(paramData);//写入参数 + mySwrite.Close(); + } + + using (HttpWebResponse response = (HttpWebResponse)webReq.GetResponse()) + { + var code = response.StatusCode.ToString(); + + //在这里对接收到的页面内容进行处理 + using (StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("UTF-8"))) + { + responseContent = sr.ReadToEnd().ToString(); + } + } + } + catch (WebException ex) + { + //SysLog.WriteEorr("【操作异常】:" + ex.Message.ToString() + "---------" + ex.StackTrace.ToString(), "测试日志", "服务端数据"); + return ex.Message + "【链接异常】"; + } + //catch ( Exception ex) + //{ + // return "连接远程服务器出错"; ; + //} + return responseContent; + } + /// + /// + /// + /// 目标url + /// 要发送的post字符串 + /// 接收后返回值 + public string PostXML(string url, string strPost) + { + + string result = string.Empty; + //生成文件流 + byte[] buffer = Encoding.UTF8.GetBytes(strPost); + //向流中写字符串 + StreamWriter mywriter = null; + //根据url创建请求对象 + HttpWebRequest objrequest = (HttpWebRequest)WebRequest.Create(url); + + //设置发送方式 + objrequest.Method = "POST"; + //提交长度 + objrequest.ContentLength = buffer.Length; + //发送内容格式 + objrequest.ContentType = "text/xml;charset=UTF-8"; + objrequest.Timeout = _TimeOut; + try + { + mywriter = new StreamWriter(objrequest.GetRequestStream()); + mywriter.Write(strPost); + mywriter.Close(); + HttpWebResponse objresponse; + + try + { + //读取服务器返回信息 + objresponse = (HttpWebResponse)objrequest.GetResponse(); + + } + catch (WebException EX) + { + + objresponse = (HttpWebResponse)EX.Response; + + } + using (StreamReader sr = new StreamReader(objresponse.GetResponseStream())) + { + result = sr.ReadToEnd(); + sr.Close(); + } + } + catch (Exception ex) + { + result = "发送文件流失败!"; + + } + + return result; + } + #endregion + + + + /// + /// 当MES离线时,保存上传数据(MrLin) + /// + /// + private static void SaveOutlineData(string requestJson) + { + //每次创建一个新的文件文本 + string logSite = $@"D:\MESData\ErrData{DateTime.Now.ToString("ffffff")}.txt"; + try + { + WriteState = false; + //防止重复数据存入本地的判断 + if (!listSource.Contains(requestJson)) + { + //SysLog.WriteContext(requestJson, logSite); + //写入记录之后将数据存入到本地结合,防止重复数据存入到本地文件 + listSource.Add(requestJson); + } + + //文件写完标记 + WriteState = true; + } + catch (Exception err) + { + //string str = SysLog.ReadContext(logSite) + "\r\n" + ""; + WriteState = true; + } + } + } +} diff --git a/JY.MES/FMS/MesRequestAndRespondParam.cs b/JY.MES/FMS/MesRequestAndRespondParam.cs new file mode 100644 index 0000000..fbecf3c --- /dev/null +++ b/JY.MES/FMS/MesRequestAndRespondParam.cs @@ -0,0 +1,564 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.MES.FMS +{ + public class MesRequestAndRespondParam + { + /// + /// MES请求对象 + /// + public class MesRequestParam + { + #region 登录 + /// + /// 操作员登录参数 + /// + public class UserVerifyRequest + { + /// + /// :站点;必填 + /// + public string siteCode { get; set; } + /// + /// :设备;必填 + /// + public string equipNum { get; set; } + /// + /// 产线编号 + /// + public string lineCode { get; set; } + /// + /// :用户;必填 + /// + public string userName { get; set; } + /// + /// :密码;必填 + /// + public string passWord { get; set; } + } + + #endregion + + #region 进站 + + /// + /// 产品进站信息 + /// + public class InStationRequest + { + /// + /// 系统编号(上位机代号);必填 + /// + public string systemCode { get; set; } + /// + /// 产线编号 + /// + public string houseCode { get; set; } + /// + /// :设备号;必填 + /// + public string deviceCode { get; set; } + /// + /// :工序号;必填 + /// + public string processCode { get; set; } + /// + /// :工序号;必填 + /// + public string skuCode { get; set; } + /// + /// :电芯结果;必填 + /// + public string testResult { get; set; } + /// + /// :NG代码;必填 + /// + public string ngCode { get; set; } + /// + /// :工序数据集;必填 + /// + public string processData { get; set; } + + + } + + #endregion + + #region 出站 + /// 产品出站参数 + /// + public class OutStationRequest + { + /// + /// + /// :站点;必填 + /// + public string siteCode { get; set; } + /// + /// 产线编号 + /// + public string lineCode { get; set; } + /// + /// :设备;必填 + /// + public string equipNum { get; set; } + /// + /// :用户;必填 + /// + public string userName { get; set; } + /// + ///工单生成的物料号 + /// + public string materialCode { get; set; } + /// + /// :生产类型;(非必输) + /// + public string productType { get; set; } + /// + /// :完工数量;(非必输) + /// + public string completeQty { get; set; } + /// + /// 托盘码 + /// + public string containerCode { get; set; } + /// + /// 1:通用出站(默认);2:其他待定; + /// + public int type { get; set; } = 1; + + /// + /// 产品信息结构体 + /// + public List assembleLineList; + + + } + + /// + /// 出站产品信息结构体 + /// + public struct OutStationVO1 + { + /// + /// 产品条码 + /// + public string identification { get; set; } + /// + /// 质量状态 + /// + public string qualityStatus { get; set; } + /// + /// 关联条码:组装段超声焊专用,其他工序可为空 + /// + public string qrCode { get; set; } + /// + /// NG错误信息:质量状态OK不返回,质量状态NG返回具体报错消息 + /// + public string ngMessage { get; set; } + } + #endregion + + #region 产品加工参数 + /// + /// 产品结果参数:单进单出 + /// + public class ProductDataRequest + { + public string equipNum { get; set; } + public string type { get; set; } + public string payload { get; set; } + } + public class payloadDD + { + /// + /// 工厂 + /// + public string siteCode { get; set; } + /// + /// 产线 + /// + public string lineCode { get; set; } + /// + /// 物料 + /// + public string materialCode { get; set; } + /// + /// 用户 + /// + public string userName { get; set; } + /// + /// 小车号 + /// + public string carCode { get; set; } + /// + /// 采集时间 + /// + public string recordDate { get; set; } + /// + /// 条码数量 + /// + public int qty { get; set; } + /// + /// 托盘码 + /// + public string containerCode { get; set; } + public identificationParaDD identification { get; set; } + public List tagDataVOList { get; set; } + } + + public class identificationParaDD + { + /// + /// 条码 + /// + public string identification { get; set; } + /// + /// 质量状态Y/N + /// + public string qualityStatus { get; set; } + } + public class tagDataVOPara + { + public string tagCode { get; set; } = "0"; + public string tagValue { get; set; } = "0"; + public string tagTime { get; set; } + /// + /// 采集项判断结果(Y/N) + /// + public string tagCalculateResult { get; set; } + } + #endregion + + #region 设备状态 + + /// + /// 设备状态参数 + /// + public class EquipStatusRequest + { + /// + /// :站点;必填 + /// + public string siteCode { get; set; } + public string lineCode { get; set; } + /// + /// :设备;必填 + /// + public string equipNum { get; set; } + /// + /// :登录账号 + /// + public string userName { get; set; } + public string materialCode { get; set; } + /// + /// 采集时间(2019-09-11 13:13:13)(非必输) + /// + public string recordDate { get; set; } + /// + /// 设备状态 + /// + public string statusCode { get; set; } + + /// + /// 状态变更时间 + /// + public string uploadTime { get; set; } + /// + /// 故障代码(行,可以不传,可以多条,只有设备状态为故障时才需要传输) + /// + public List faultCodeList { get; set; } + } + + /// + /// 设备运行状态 + /// + + public struct faultCodes + { + public string faultCode { get; set; } + } + + #endregion + + #region 报警状态 + public class AlarmRequest + { + /// + /// :站点;必填 + /// + public string siteCode { get; set; } + public string lineCode { get; set; } + /// + /// :设备;必填 + /// + public string equipNum { get; set; } + /// + /// :登录账号 + /// + public string userName { get; set; } + public string materialCode { get; set; } + /// + /// 采集时间(2019-09-11 13:13:13)(非必输) + /// + public string recordDate { get; set; } + /// + /// 唯一标识符号 + /// + public string guid { get; set; } + public List alarmLineList { get; set; } + } + public struct AlarmLineList + { + /// + /// 报警消除时间 + /// + public string alarmEndTime { get; set; } + /// + /// 报警类型 + /// + public string alarmType { get; set; } + /// + /// 报警名称 + /// + public string alarmName { get; set; } + /// + /// 报警开始时间 + /// + public string alarmStartTime { get; set; } + /// + /// 故障代码 + /// + public string faultCode { get; set; } + } + + #endregion + + #region 配方参数修改 + /// + /// 参数修改 + /// + public class SetRecipeRequest + { + public string siteCode { get; set; } + public string lineCode { get; set; } + public string equipNum { get; set; } + public string userName { get; set; } + public string materialCode { get; set; } + /// + /// 变更时间 + /// + public string changeTime { get; set; } + /// + /// 数据组编码 + /// + public string tagGroupCode { get; set; } + /// + /// 数据组描述 + /// + public string tagGroupDescription { get; set; } + /// + /// 数据项数组 + /// + public List tagList { get; set; } + } + /// + /// 配方数据项数组对象 + /// + public struct tagList + { + /// + /// 数据项编码 + /// + public string tagCode { get; set; } + /// + /// 变更前计量单位 + /// + public string unitBefore { get; set; } + /// + /// 变更前标准值 + /// + public string standardValueBefore { get; set; } + /// + /// 变更前符合值 + /// + public string trueValueBefore { get; set; } + /// + /// 变更前不符合值 + /// + public string falseValueBefore { get; set; } + /// + /// 变更前最小值 + /// + public double minValueBefore { get; set; } + /// + /// 变更前最大值 + /// + public double maxValueBefore { get; set; } + /// + /// 变更后计量单位 + /// + public string unitAfter { get; set; } + /// + /// 变更后标准值 + /// + public string standardValueAfter { get; set; } + /// + /// 变更后符合值 + /// + public string trueValueAfter { get; set; } + /// + /// 变更后不符合值 + /// + public string falseValueAfter { get; set; } + /// + /// 变更后最小值 + /// + public double minValueAfter { get; set; } + /// + /// 变更后最大值 + /// + public double maxValueAfter { get; set; } + } + + #endregion + + #region 配方请求 + /// + /// 配方请求 + /// + public class GetRecipeRequest + { + public string siteCode { get; set; } + public string lineCode { get; set; } + public string equipNum { get; set; } + public string userName { get; set; } + public string materialCode { get; set; } + } + + #endregion + + } + /// + /// MES返回对象 + /// + public class MesRespondParam + { + #region 通用返回 + /// + /// Mes返回信息对象{"statusCode":0,"statusMessage": "该设备111找不到,请检查!"} + /// + public class MesResult + { + /// + /// 返回信息代码 0:成功 + /// + public int statusCode { get; set; } + /// + /// 返回信息 + /// + public string statusMessage { get; set; } + + } + #endregion + + #region 设备状态数据返回 + /// + /// 设备状态MES返回参数 + /// + public class GetRecipeRespond + { + /// + /// 错误代码 + /// + public string code { get; set; } + /// + /// 成功标识 + /// + public string success { get; set; } + /// + /// 数据处理消息 + /// + public string message { get; set; } + /// + /// 报错消息类型 + /// + public string category { get; set; } + + } + + #region 屏蔽 + public struct rows + { + /// + /// 数据组编码 + /// + public string tagGroupCode { get; set; } + /// + /// 数据组描述 + /// + public string tagGroupDescription { get; set; } + /// + /// 数据项数组 + /// + public List tagList { get; set; } + + } + public struct tagList + { + /// + /// 数据项编码 + /// + public string tagCode { get; set; } + /// + /// 数据项描述 + /// + public string tagDescription { get; set; } + /// + /// 数据项备注 + /// + public string tagRemark { get; set; } + /// + /// 数据类型 + /// + public string valueType { get; set; } + /// + /// 计量单位 + /// + public string unit { get; set; } + /// + /// 符合值 + /// + public double trueValue { get; set; } + /// + /// 不符合值 + /// + public double falseValue { get; set; } + /// + /// 最小值 + /// + public double minValue { get; set; } + /// + /// 最大值 + /// + public double maxValue { get; set; } + /// + /// 标准值 + /// + public double standardValue { get; set; } + + } + + #endregion + + #endregion + } + + + + } +} diff --git a/JY.MES/FMS/MesReturnParam.cs b/JY.MES/FMS/MesReturnParam.cs new file mode 100644 index 0000000..4c196d9 --- /dev/null +++ b/JY.MES/FMS/MesReturnParam.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.MES.FMS +{ + public class MesReturnParam + { + public class MesResult + { + /// + /// 返回信息代码 0:成功 + /// + public int statusCode { get; set; } + /// + /// 返回信息 + /// + public string statusMessage { get; set; } + + } + } +} diff --git a/JY.MES/FMS/Model/FMS_In.cs b/JY.MES/FMS/Model/FMS_In.cs new file mode 100644 index 0000000..d3c01d3 --- /dev/null +++ b/JY.MES/FMS/Model/FMS_In.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.MES.FMS +{ + public class FMS_In + { + /// + /// 系统编号 + /// + public string systemCode { get; set; } + /// + /// 产线编号 + /// + public string houseCode { get; set; } + /// + /// 电芯条码 + /// + public string skuCode { get; set; } + /// + /// 设备号 + /// + public string deviceCode { get; set; } + /// + /// 工序号 + /// + public string processCode { get; set; } + } +} diff --git a/JY.MES/FMS/Model/FMS_Out.cs b/JY.MES/FMS/Model/FMS_Out.cs new file mode 100644 index 0000000..6e34d11 --- /dev/null +++ b/JY.MES/FMS/Model/FMS_Out.cs @@ -0,0 +1,101 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.MES.FMS +{ + public class FMS_Out + { + public string systemCode { get; set; } + public string houseCode { get; set; } + public string skuCode { get; set; } + public string deviceCode { get; set; } + public string processCode { get; set; } + public string testResult { get; set; } + public string ngCode { get; set; } + public processData processData { get; set; } + + } + + public class processData + { + /// + /// 结果 + /// + public string testResult { get; set; } + + /// + /// 进站时间;必填 + /// + public string inTime { get; set; } + /// + /// 出站时间;必填 + /// + public string outTime { get; set; } + /// + /// 参数判定结果;必填 + /// + public string cspdjg { get; set; } + /// + /// 测试时间;必填 + /// + public string cssj { get; set; } + /// + /// 测试批次;必填 + /// + public string cspc { get; set; } + /// + /// 测试结果;必填 + /// + public string csjg { get; set; } + /// + /// 复测标记;必填 + /// + public string fcbj { get; set; } + /// + /// 复测次数;必填 + /// + public string fccs { get; set; } + /// + /// 复测时间;必填 + /// + public string fcsj { get; set; } + /// + /// 复测原因;必填 + /// + public string fcyy { get; set; } + /// + /// NG原因;必填 + /// + public string ngyy { get; set; } + /// + /// NG时间;必填 + /// + public string ngsj { get; set; } + /// + /// NG位置;必填 + /// + public string ngwz { get; set; } + /// + /// 环境温度;必填 + /// + public string hjwd { get; set; } + /// + /// 环境湿度;必填 + /// + public string hjsd { get; set; } + /// + /// 空气洁净度;必填 + /// + public string kqjjd { get; set; } + /// + /// 班次 + /// + public string workShift { get; set; } + + + } + +} diff --git a/JY.MES/JY.MES.csproj b/JY.MES/JY.MES.csproj new file mode 100644 index 0000000..62328a7 --- /dev/null +++ b/JY.MES/JY.MES.csproj @@ -0,0 +1,87 @@ + + + + + Debug + AnyCPU + {168C8644-3975-450D-94D2-29D21C135C16} + Library + Properties + JY.MES + JY.MES + v4.8 + 512 + true + + + + true + full + false + ..\..\..\..\JY.Inspection\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + False + ..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {F7DB3A93-FCA2-479B-8B2E-380116AAE9FC} + JY.Model + + + + + + + \ No newline at end of file diff --git a/JY.MES/MES/GradingParam.cs b/JY.MES/MES/GradingParam.cs new file mode 100644 index 0000000..9e64911 --- /dev/null +++ b/JY.MES/MES/GradingParam.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.MES.MES +{ + /// + /// 获取电池竖表采集项值 分档查询 + /// + public class GradingParam + { + /// + /// 工厂代码 + /// + public string siteCode { get; set; } + /// + /// 产线名称 + /// + public string lineCode { get; set; } + /// + /// 设备编码 + /// + public string equipCode { get; set; } + /// + /// 物料编码 + /// + public string materialCode { get; set; } + + /// + /// 采集时间 + /// + public string recordDate { get; set; } + /// + /// 条码数量 + /// + public int qty { get; set; } + + /// + /// 操作员 + /// + public string userName { get; set; } + /// + /// 托盘码 + /// + public string containerCode { get; set; } + /// + /// 条码数组 + /// + public List materiallotCodeList { get; set; } + } + + +} diff --git a/JY.MES/MES/ProductResultParameters.cs b/JY.MES/MES/ProductResultParameters.cs new file mode 100644 index 0000000..56cbf93 --- /dev/null +++ b/JY.MES/MES/ProductResultParameters.cs @@ -0,0 +1,118 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.MES.MES +{ + /// + /// 结果加工参数 + /// + public class ProductResultParameters + { + /// + /// 设备编号 + /// + public string equipNum { get; set; } + /// + /// 类型 单进整出:DZ 整进整出:ZZ 单进单出:DD 未传时默认按照ZZ进行数据解析 + /// + public string type { get; set; } + /// + /// 设备数据 + /// + public string payload { get; set; } + } + + public class Payload + { + /// + /// 工厂代码 + /// + public string siteCode { get; set; } + /// + /// 产线编号 + /// + public string lineCode { get; set; } + /// + /// 员工账号 + /// + public string userName { get; set; } + /// + /// 物料编码 工单产成品物料号 + /// + public string materialCode { get; set; } + /// + /// 小车号 装载电池的小车编号 + /// + public string carCode { get; set; } + /// + /// 补录 是否属于补录数据(BL=补录,JS=及时上传) + /// + public string collection { get; set; } + /// + /// 采集时间 数据的采集时间 + /// + public string recordDate { get; set; } + /// + /// 条码数量 传入条码的个数 + /// + public int qty { get; set; } + /// + /// 装载电池的托盘编号 + /// + public string containerCode { get; set; } + /// + /// 条码对象 + /// + public IdentificationItem identification { get; set; } + /// + /// 采集数组 + /// + public List tagDataVOList { get; set; } + } + + /// + /// 条码对象 + /// + public class IdentificationItem + { + /// + /// 条码 + /// + public string identification { get; set; } + /// + /// 质量状态 各产品所有参数的整体判断结果(Y/N) + /// + public string qualityStatus { get; set; } + + } + + /// + /// 采集对象 + /// + public class TagDataVOListItem + { + /// + /// 设备每个采集项规定的编号 + /// + public string tagCode { get; set; } + /// + /// 采集值 + /// + public string tagValue { get; set; } + /// + /// 采集项采集时间 + /// + public string tagTime { get; set; } + /// + /// 各产品所有参数的整体判断结果(Y/N) + /// + public string tagCalculateResult { get; set; } + /// + /// 采集项描述 + /// + public string tagRemark { get; set; } + } +} diff --git a/JY.MES/MES/ReqArrivalStation.cs b/JY.MES/MES/ReqArrivalStation.cs new file mode 100644 index 0000000..7a526f7 --- /dev/null +++ b/JY.MES/MES/ReqArrivalStation.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.MES.MES +{ + /// + /// 产品进站信息 + /// + + public class ReqArrivalStation + { + /// + /// 工厂代码 + /// + public string SiteCode { get; set; } + + /// + /// 产线编号 + /// + public string LineCode { get; set; } + + /// + /// 设备编号 + /// + public string EquipNum { get; set; } + + /// + /// 物料编码 + /// + public string MaterialCode { get; set; } + + /// + /// 员工账号 + /// + public string UserName { get; set; } + + /// + /// 成品条码 + /// + public string Identification { get; set; } + + /// + /// 产品类型 + /// + public string ProductType { get; set; } + } +} diff --git a/JY.MES/MES/ReqExitStation.cs b/JY.MES/MES/ReqExitStation.cs new file mode 100644 index 0000000..83c64a2 --- /dev/null +++ b/JY.MES/MES/ReqExitStation.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.MES.MES +{ + /// + /// 产品出站 + /// + public class ReqExitStation + { + /// + /// 工厂代码 + /// + public string SiteCode { get; set; } + + /// + /// 产线编号 + /// + public string LineCode { get; set; } + + /// + /// 设备编号 + /// + public string EquipNum { get; set; } + + /// + /// 员工账号 + /// + public string UserName { get; set; } + + /// + /// 托盘码,没有托盘码可为空;A22超声波终焊作为顶盖码; + /// + public string ContainerCode { get; set; } + + /// + /// 行信息 + /// + public List AssembleLineList { get; set; } + } + + public class AssembleLine + { + /// + /// 产品条码,A22超声波终焊作为蓝胶码; + /// + public string Identification { get; set; } + + /// + /// 质量状态 + /// + public string QualityStatus { get; set; } + + /// + /// 关联条码,组装段超声焊专用,其他工序可为空 + /// + public string QrCode { get; set; } + + /// + /// NG编码,质量状态OK不返回,质量状态NG返回具体报错编码 + /// + public string[] NgCode { get; set; } + + /// + /// NG错误信息,质量状态OK不返回,质量状态NG返回具体报错消息 + /// + public string NgMessage { get; set; } + } +} diff --git a/JY.MES/MES/RespArrivalStation.cs b/JY.MES/MES/RespArrivalStation.cs new file mode 100644 index 0000000..9e2752c --- /dev/null +++ b/JY.MES/MES/RespArrivalStation.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.MES.MES +{ + /// + /// 产品进站响应信息 + /// + public class RespArrivalStation + { + /// + /// 错误代码,成功不返回 + /// + public string Code { get; set; } + + /// + /// 成功标识,false失败 true 成功 + /// + public bool Success { get; set; } + + /// + /// 数据处理消息,成功不返回 + /// + public string Message { get; set; } + + /// + /// 报错消息类型 A:停线、B:排出、C:忽略(需警示) + /// + public string Category { get; set; } + } +} diff --git a/JY.MES/MES/RespExitStation.cs b/JY.MES/MES/RespExitStation.cs new file mode 100644 index 0000000..bf8738c --- /dev/null +++ b/JY.MES/MES/RespExitStation.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.MES.MES +{ + /// + /// 产品出站响应信息 + /// + public sealed class RespExitStation : RespArrivalStation + { + } +} diff --git a/JY.MES/MESApiHelper.cs b/JY.MES/MESApiHelper.cs new file mode 100644 index 0000000..3d0fb0d --- /dev/null +++ b/JY.MES/MESApiHelper.cs @@ -0,0 +1,41 @@ +using JY.MES.Entity; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Runtime.Serialization.Json; +using System.Text; +using System.Threading.Tasks; +using System.Web.Script.Serialization; + +namespace JY.MES +{ + /// + /// MES接口类 + /// + public class MESApiHelper + { + public static string HttpPostJsonAPI(string url, string strJosnData, double MesRequestTime) + { + MesResponse mesResponse = new MesResponse(); + try + { + StringContent stringContent = new StringContent(strJosnData, Encoding.UTF8, "application/json"); + return new HttpClient() + { + Timeout = TimeSpan.FromSeconds(MesRequestTime) + }.PostAsync(url, (HttpContent)stringContent).Result.Content.ReadAsStringAsync().Result; + } + catch (Exception ex) + { + mesResponse.success = false; + mesResponse.message = $"massage:[{ex.InnerException}],mes: [MES反馈超时或无法访间MES服务器]"; + mesResponse.error = 99; + return JsonConvert.SerializeObject(mesResponse); + } + } + } +} diff --git a/JY.MES/MesResponse.cs b/JY.MES/MesResponse.cs new file mode 100644 index 0000000..cc37939 --- /dev/null +++ b/JY.MES/MesResponse.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static JY.MES.FMS.MesRequestAndRespondParam.MesRespondParam; + +namespace JY.MES +{ + public class MesResponse + { + /// + /// 异常代码(0:正常 9:解析异常 99:MES反馈超时或无法访问MES服务器) + /// + public int error { get; set; } + /// + /// 数据处理消息 成功不返回 + /// + public string message { get; set; } + + + /// + /// 错误代码 错误代码,成功不返回 + /// + public string code { get; set; } + /// + /// 报错消息类型 A=停线,B=排出,C=忽略(需警示) + /// + public string category { get; set; } + + + /// + /// 条码及档位结果信息 + /// + public List rows { get; set; } + /// + /// 成功标识 + /// + public bool success { get; set; } + /// + /// rows列表中数据总条数 + /// + public int total { get; set; } + + public class rowsListItem + { + /// + /// 电池条码 + /// + public string identification { get; set; } + /// + /// 电池等级 + /// + public string level { get; set; } + /// + /// 电池挡位 + /// + public string rank { get; set; } + + public object passage { get; set; } + public object message { get; set; } + } + } + +} diff --git a/JY.MES/Properties/AssemblyInfo.cs b/JY.MES/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..754b26e --- /dev/null +++ b/JY.MES/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("JY.MES")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("JY.MES")] +[assembly: AssemblyCopyright("Copyright © 2021")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("168c8644-3975-450d-94d2-29d21c135c16")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/JY.MES/app.config b/JY.MES/app.config new file mode 100644 index 0000000..e473418 --- /dev/null +++ b/JY.MES/app.config @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JY.MES/packages.config b/JY.MES/packages.config new file mode 100644 index 0000000..0f3393f --- /dev/null +++ b/JY.MES/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JY.Model/BL.Entity/Chart24HourData.cs b/JY.Model/BL.Entity/Chart24HourData.cs new file mode 100644 index 0000000..1854518 --- /dev/null +++ b/JY.Model/BL.Entity/Chart24HourData.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Model +{ + /// + /// 24小时统计表数据 + /// + public class Chart24HourData + { + /// + /// 优率 + /// + public string DisplayTime { get; set; } + /// + /// 产出数 + /// + public int ProdIn { set; get; } + /// + /// 投入数 + /// + public int ProdOut { set; get; } + /// + /// 不良数量 + /// + public int ProdNg { set; get; } + /// + /// 优率 + /// + public string OKRatio { get; set; } + } +} diff --git a/JY.Model/BL.Entity/RequestResult.cs b/JY.Model/BL.Entity/RequestResult.cs new file mode 100644 index 0000000..2141d0d --- /dev/null +++ b/JY.Model/BL.Entity/RequestResult.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Model +{ + /// + /// 执行结果 + /// + public class RequestResult + { + /// + /// 是否执行成功 + /// + public bool IsSuccess { get; set; } = true; + /// + /// 返回消息 + /// + public string Msg { get; set; } + } + + /// + /// 执行结果Entity,带返回值 + /// + /// + public class RequestResult : RequestResult + { + public T Result { get; set; } + } + + + /// + /// 执行结果List,带返回值 + /// + /// + public class RequestResultList : RequestResult + { + public List Result { get; set; } + } +} diff --git a/JY.Model/DB.Entity/AbnormalVoice.cs b/JY.Model/DB.Entity/AbnormalVoice.cs new file mode 100644 index 0000000..fd1ea3f --- /dev/null +++ b/JY.Model/DB.Entity/AbnormalVoice.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Model +{ + /// + /// 工位报警数据 + /// + public class AbnormalVoice + { + /// + /// ID + /// + public int ID { get; set; } + /// + /// 工位编码 + /// + public string Code { get; set; } + /// + /// 播报内容 + /// + public string Remark { get; set; } + + } +} diff --git a/JY.Model/DB.Entity/AlarmData.cs b/JY.Model/DB.Entity/AlarmData.cs new file mode 100644 index 0000000..e74a9c3 --- /dev/null +++ b/JY.Model/DB.Entity/AlarmData.cs @@ -0,0 +1,73 @@ +using SqlSugar; +using System; + +namespace JY.Model +{ + [SugarTable("tb_alarm")] + /// + /// 工位报警数据 + /// + public class AlarmData + { + /// + /// 报警唯一标识符 + /// + [SugarColumn(IsPrimaryKey = true, ColumnName = "AlarmGuid")] + public string AlarmGuid { get; set; } + + /// + /// 报警地址 + /// + [SugarColumn(ColumnName = "PLCAdress")] + public string PLCAdress { get; set; } + + /// + /// 报警内容 + /// + [SugarColumn(ColumnName = "AlarmContent")] + public string AlarmContent { get; set; } + + /// + /// 报警代码 + /// + [SugarColumn(ColumnName = "AlarmCode")] + public string AlarmCode { get; set; } + + /// + /// 报警类型 停机报警/非停机报警 + /// + [SugarColumn(ColumnName = "AlarmType")] + public string AlarmType { get; set; } + + /// + /// 报警开始时间 + /// + [SugarColumn(ColumnName = "StartTime")] + public DateTime StartTime { get; set; } + + /// + /// 报警消除时间 + /// + [SugarColumn(ColumnName = "EndTime")] + public DateTime EndTime { get; set; } + + /// + /// 报警描述 + /// + [SugarColumn(ColumnName = "AlarmDesc")] + public string AlarmDesc { get; set; } + + + /// + /// 报警状态 传1或0,1是开始报警,0结束报警 + /// + [SugarColumn(ColumnName = "AlarmState")] + public string AlarmState { get; set; } + + /// + /// 更新状态 + /// + [SugarColumn(ColumnName = "Flag")] + public int Flag { get; set; } + } +} diff --git a/JY.Model/DB.Entity/BlankingData.cs b/JY.Model/DB.Entity/BlankingData.cs new file mode 100644 index 0000000..f4fb354 --- /dev/null +++ b/JY.Model/DB.Entity/BlankingData.cs @@ -0,0 +1,200 @@ +using CsvHelper.Configuration.Attributes; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Model +{ + /// + /// 下料数据 + /// + [SugarTable("BlankingData")] + public class BlankingData + { + [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnName = "ID")] + [Name("ID")] + public int ID { set; get; } + /// + /// 通道 + /// + /// + [SugarColumn(ColumnName = "TD")] + [Name("通道")] + public int TD { set; get; } + /// + /// 班次 + /// + /// + [SugarColumn(ColumnName = "WorkShift")] + [Name("班次")] + public string WorkShift { set; get; } + /// + /// 入站条码 + /// + [SugarColumn(ColumnName = "ArrivalBarCode")] + [Name("入站条码")] + public string ArrivalBarCode { set; get; } + /// + /// 出站条码 + /// + /// + [SugarColumn(ColumnName = "DepartureBarCode")] + [Name("出站条码")] + public string DepartureBarCode { set; get; } + + /// + /// 条码对比 + /// + [SugarColumn(ColumnName = "TMDB")] + [Name("条码对比")] + public string TMDB { get; set; } + + /// + /// 出站时间 + /// + [SugarColumn(ColumnName = "OutTime")] + [Name("出站时间")] + public string OutTime { set; get; } + + /// + /// 正面(2W/3W) + /// + [SugarColumn(ColumnName = "CCD1")] + [Name("正面(2W/3W)")] + public string CCD1 { set; get; } + + /// + /// 反面(2W/3W)结果1 + /// + [SugarColumn(ColumnName = "CCD2")] + [Name("反面(2W/3W)结果1")] + public string CCD2 { set; get; } + + /// + /// 左侧面(2W/3W)结果1 + /// + [SugarColumn(ColumnName = "CCD3")] + [Name("左侧面(2W/3W)结果1")] + public string CCD3 { set; get; } + + /// + /// 右侧面(2W/3W)结果1 + /// + [Name("右侧面(2W/3W)结果1")] + [SugarColumn(ColumnName = "CCD4")] + public string CCD4 { set; get; } + + /// + /// 顶面(2W/3W)结果1 + /// + [SugarColumn(ColumnName = "CCD5")] + [Name("顶面(2W/3W)结果1")] + public string CCD5 { set; get; } + + /// + /// 底面(2W/3W)结果1 + /// + [SugarColumn(ColumnName = "CCD6")] + [Name("底面(2W/3W)结果1")] + public string CCD6 { set; get; } + + /// + /// 底WE1结果1 + /// + [SugarColumn(ColumnName = "CCD7")] + [Name("底WE1结果1")] + public string CCD7 { set; get; } + /// + /// 底WE1结果1 + /// + [Name("底WE2结果1")] + [SugarColumn(ColumnName = "CCD8")] + public string CCD8 { set; get; } + /// + /// 底WE3结果1 + /// + [Name("底WE3结果1")] + public string CCD9 { set; get; } + /// + /// 底WE4结果1 + /// + [Name("底WE4结果1")] + [SugarColumn(ColumnName = "CCD10")] + public string CCD10 { set; get; } + /// + /// 中ME1结果1 + /// + [Name("中ME1结果1")] + [SugarColumn(ColumnName = "CCD11")] + public string CCD11 { set; get; } + /// + /// 中ME2结果1 + /// + [Name("中ME2结果1")] + [SugarColumn(ColumnName = "CCD12")] + public string CCD12 { set; get; } + /// + /// 中ME3结果1 + /// + [Name("中ME3结果1")] + [SugarColumn(ColumnName = "CCD13")] + public string CCD13 { set; get; } + /// + /// 中ME4结果1 + /// + [Name("中ME4结果1")] + [SugarColumn(ColumnName = "CCD14")] + public string CCD14 { set; get; } + /// + /// 极柱(POS/NEG)结果1 + /// + [Name("极柱(POS/NEG)结果1")] + [SugarColumn(ColumnName = "CCD15")] + public string CCD15 { set; get; } + /// + /// 防爆阀(PRO)结果1 + /// + [Name("防爆阀(PRO)结果1")] + [SugarColumn(ColumnName = "CCD16")] + public string CCD16 { set; get; } + /// + /// 综合结果 + /// + /// + [Name("综合结果")] + [SugarColumn(ColumnName = "Result")] + public string Result { set; get; } + + /// + /// 备注 + /// + /// + [Name("备注")] + [SugarColumn(ColumnName = "Remark")] + public string Remark { set; get; } + /// + /// 上传状态 + /// + /// + [Name("上传状态")] + [SugarColumn(ColumnName = "Flag")] + public int Flag { set; get; } + + /// + /// 通道Group + /// + /// + [Name("通道Group")] + [SugarColumn(ColumnName = "TDGroup")] + public int TDGroup { set; get; } + + /// + /// CCD列表(依据采集项参照表添加) + /// + [SugarColumn(IsIgnore = true)] + public Dictionary PLCValDic { get; set; } = new Dictionary(); + } +} diff --git a/JY.Model/DB.Entity/CamInfor.cs b/JY.Model/DB.Entity/CamInfor.cs new file mode 100644 index 0000000..b7ad34f --- /dev/null +++ b/JY.Model/DB.Entity/CamInfor.cs @@ -0,0 +1,130 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Model +{ + public class CamInfor + { + /// + /// 通道 + /// + public int TD { set; get; } + /// + /// 条码 + /// + public string BarCode { set; get; } + /// + /// 电池结束时间 + /// + public string CreateTime { set; get; } + public string CCD15 { set; get; } + /// + /// CCD16 + /// + public string CCD16 { set; get; } + /// + /// CCD17 + /// + public string CCD17 { set; get; } + /// + /// CCD18 + /// + public string CCD18 { set; get; } + /// + /// CCD19 + /// + public string CCD19 { set; get; } + /// + ///CCD20 + /// + public string CCD20 { set; get; } + /// + /// CCD21 + /// + public string CCD21 { set; get; } + /// + /// CCD22 + /// + public string CCD22 { set; get; } + /// + /// CCD23 + /// + public string CCD23 { set; get; } + /// + /// CCD24 + /// + public string CCD24 { set; get; } + /// + /// CCD11 + /// + public string CCD25 { set; get; } + /// + /// CCD12 + /// + public string CCD26 { set; get; } + /// + /// CCD13 + /// + public string CCD27 { set; get; } + /// + /// CCD13 + /// + public string CCD28 { set; get; } + /// + ///CCD6 + /// + public string CCD29 { set; get; } + /// + /// CCD7 + /// + public string CCD30 { set; get; } + /// + /// CCD8 + /// + public string CCD31 { set; get; } + /// + /// CCD9 + /// + public string CCD32 { set; get; } + /// + /// CCD10 + /// + public string CCD33 { set; get; } + /// + /// CCD11 + /// + public string CCD34 { set; get; } + /// + /// CCD12 + /// + public string CCD35 { set; get; } + /// + /// CCD13 + /// + public string CCD36 { set; get; } + /// + /// CCD13 + /// + public string CCD37 { set; get; } + + /// + /// CCD13 + /// + public string CCD38 { set; get; } + public string Result { set; get; } + + /// + /// 备注 + /// + public string Remark { set; get; } + /// + /// 上传状态 + /// + public int Flag { set; get; } + + + } +} diff --git a/JY.Model/DB.Entity/ChartDataType.cs b/JY.Model/DB.Entity/ChartDataType.cs new file mode 100644 index 0000000..94e3ce9 --- /dev/null +++ b/JY.Model/DB.Entity/ChartDataType.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Model +{ + /// + /// 不良統計 + /// + public class ChartDataType + { + /// + /// 數據類型 + /// + public string DataType { get; set; } + /// + /// 數量 + /// + public int DataCount { get; set; } + } +} diff --git a/JY.Model/DB.Entity/FeedingData.cs b/JY.Model/DB.Entity/FeedingData.cs new file mode 100644 index 0000000..d631a56 --- /dev/null +++ b/JY.Model/DB.Entity/FeedingData.cs @@ -0,0 +1,45 @@ +using CsvHelper.Configuration.Attributes; +using SqlSugar; +using System; + +namespace JY.Model +{ + /// + /// 上料数据 + /// + [SugarTable("FeedingData")] + public class FeedingData + { + [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnName = "ID")] + [Name("ID")] + public int ID { set; get; } + + [SugarColumn(ColumnName = "TD")] + [Name("通道")] + public int TD { set; get; } + + [SugarColumn(ColumnName = "BarCode")] + [Name("条码")] + public string BarCode { set; get; } + + [SugarColumn(ColumnName = "CreateTime")] + [Name("时间")] + public string CreateTime { set; get; } = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + + [SugarColumn(ColumnName = "Result")] + [Name("结果")] + public string Result { set; get; } + + [SugarColumn(ColumnName = "Remark")] + [Name("备注")] + public string Remark { set; get; } + + [SugarColumn(ColumnName = "Flag")] + [Name("上传状态")] + public int Flag { set; get; } + + [SugarColumn(ColumnName = "TDGroup")] + [Name("通道Group")] + public int TDGroup { set; get; } + } +} diff --git a/JY.Model/DB.Entity/HourprodEntity.cs b/JY.Model/DB.Entity/HourprodEntity.cs new file mode 100644 index 0000000..c34fcdb --- /dev/null +++ b/JY.Model/DB.Entity/HourprodEntity.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace JY.Model +{ + /// + /// 每两小时产能 + /// + public class HourprodEntity + { + /// + /// 当前时间 yyyy-MM-dd + /// + public string FDate { set; get; } + /// + /// 当前小时 + /// + public int FHour { set; get; } + /// + /// 产出数 + /// + public int ProdIn { set; get; } + /// + /// 投入数 + /// + public int ProdOut { set; get; } + /// + /// 时间 yyyy-MM-dd HH:mm:ss + /// + public string TestTime { set; get; } + } +} diff --git a/JY.Model/DB.Entity/PLCConfigBase.cs b/JY.Model/DB.Entity/PLCConfigBase.cs new file mode 100644 index 0000000..6e35d6f --- /dev/null +++ b/JY.Model/DB.Entity/PLCConfigBase.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Model +{ + public class PLCConfigBase + { + /// + /// 自增Id + /// + public int Id { get; set; } + /// + /// PLC地址/PLC变更说明 + /// + public string PLCAddress { get; set; } + /// + /// PLC地址说明 + /// + public string PLCRemark { get; set; } + /// + /// 地址排序 + /// + public int OrderNum { get; set; } + } +} diff --git a/JY.Model/DB.Entity/PLCConfigPara.cs b/JY.Model/DB.Entity/PLCConfigPara.cs new file mode 100644 index 0000000..8cdb63b --- /dev/null +++ b/JY.Model/DB.Entity/PLCConfigPara.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Model +{ + public class PLCConfigPara + { + /// + /// 自增Id + /// + public int Id { get; set; } + /// + /// 产品型号 + /// + public string ModelName { get; set; } + /// + /// PLC地址/PLC变更说明 + /// + public string PLCAddress { get; set; } + /// + /// 参数值 + /// + public int PLCValue { get; set; } + /// + /// 更新时间 + /// + public DateTime UpdateData { get; set; } + + /// + /// PLC地址说明 --附加信息,写入忽略 + /// + public string PLCRemark { get; set; } + /// + /// 地址排序 --附加信息,写入忽略 + /// + public int OrderNum { get; set; } + } +} diff --git a/JY.Model/DB.Entity/ParaRange.cs b/JY.Model/DB.Entity/ParaRange.cs new file mode 100644 index 0000000..ee9094e --- /dev/null +++ b/JY.Model/DB.Entity/ParaRange.cs @@ -0,0 +1,175 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Model +{ + public class ParaRange + { + #region 参数上下限 + /// + /// 条码长度 + /// + public int CodeLenth { set; get; } + /// + /// 电压上限 + /// + public decimal VolMax { set; get; } + /// + /// 电压下限 + /// + public decimal VolMin { set; get; } + /// + /// 内阻上限 + /// + public decimal IMPMax { set; get; } + /// + /// 内阻下限 + /// + public decimal IMPMin { set; get; } + /// + /// K值上限 + /// + public decimal KvalueMax { set; get; } + /// + /// K值下限 + /// + public decimal KvalueMin { set; get; } + /// + /// 边电压上限 + /// + public decimal BvolMax { set; get; } + /// + /// 边电压下限 + /// + public decimal BvolMin { set; get; } + + /// + /// 厚度上限 + /// + public decimal TicknessMax { set; get; } + /// + /// 厚度下限 + /// + public decimal TicknessMin { set; get; } + /// + /// 长度上限 + /// + public decimal LengthMax { set; get; } + /// + /// 长度下限 + /// + public decimal LengthMin { set; get; } + /// + /// 宽度上限 + /// + public decimal WideMax { set; get; } + /// + /// 宽度下限 + /// + public decimal WideMin { set; get; } + /// + /// 极边距上限 + /// + public decimal LMDistanceMax { set; get; } + /// + /// 极边距下限 + /// + public decimal LMDistanceMin { set; get; } + /// + /// 极耳中心距上限 + /// + public decimal LCDistanceMax { set; get; } + /// + /// 极耳中心距下限 + /// + public decimal LCDistanceMin { set; get; }//边电压数据异常1 + + #endregion + + #region 不良通道 + /// + /// 良品通道 + /// + public int GoodChannel { set; get; } + /// + /// 扫码不良通道 + /// + public int sanNG { set; get; } + /// + /// 电压不良通道 + /// + public int volNG { set; get; } + /// + /// 内阻不良通道 + /// + public int resNG { set; get; } + /// + /// K值不良通道 + /// + public int kvalueNG { set; get; } + /// + // 边电压不良通道 + /// + public int BvolNG { set; get; } + /// + /// 长度不良通道 + /// + public int LenthNG { set; get; } + /// + /// 宽度不良通道 + /// + public int WideNG { set; get; } + /// + /// 极边距不良通道 + /// + public int LMDistanceNG { set; get; } + /// + /// 中心距不良通道 + /// + public int LCDistanceNG { set; get; } + /// + /// 厚度不良 + /// + public int TicknessNG { set; get; } + /// + /// MES其他不良 + /// + public int MESOtherNG { set; get; } + + #endregion + + #region 功能选定 + /// + /// 是否验证条码 + /// + public bool IsBarcode { set; get; } + /// + /// 是否验证边电压 + /// + public bool IsIVTest { set; get; } + /// + /// 是否验证长度 + /// + public bool IsLenth { set; get; } + /// + /// 是否验证宽度 + /// + public bool IsWide { set; get; } + /// + /// 是否验证极边距 + /// + public bool IsLMDistance { set; get; } + /// + /// 是否验证中心距 + /// + public bool IsLCDistance { set; get; } + /// + /// 是否验证厚度 + /// + public bool IsThickness { set; get; } + #endregion + } +} diff --git a/JY.Model/DB.Entity/ProductModel.cs b/JY.Model/DB.Entity/ProductModel.cs new file mode 100644 index 0000000..4bbc15d --- /dev/null +++ b/JY.Model/DB.Entity/ProductModel.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Model +{ + public class ProductModel + { + /// + /// 自增Id + /// + public int Id { get; set; } + /// + /// 产品型号 + /// + public string ModelName { get; set; } + /// + /// 备注 + /// + public string Remark { get; set; } + } +} diff --git a/JY.Model/DB.Entity/ProductPara.cs b/JY.Model/DB.Entity/ProductPara.cs new file mode 100644 index 0000000..bdb9877 --- /dev/null +++ b/JY.Model/DB.Entity/ProductPara.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Model +{ + public class ProductPara + { + + /// + /// 自增Id + /// + public int Id { get; set; } + /// + /// 产品型号 + /// + public string ModelName { get; set; } + /// + /// 参数名称 + /// + public string ParaName { get; set; } + /// + /// 参数值 + /// + public string ParaValue { get; set; } + /// + /// 更新时间 + /// + public DateTime UpdateTime { get; set; } + /// + /// 备注 + /// + public string Remark { get; set; } + } +} diff --git a/JY.Model/DB.Entity/ProductParaBase.cs b/JY.Model/DB.Entity/ProductParaBase.cs new file mode 100644 index 0000000..0d639f2 --- /dev/null +++ b/JY.Model/DB.Entity/ProductParaBase.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Model +{ + public class ProductParaBase + { + /// + /// 自增Id + /// + public int Id { get; set; } + /// + /// 产品参数名称 + /// + public string ParaName { get; set; } + /// + /// 备注 + /// + public string Remark { get; set; } + } +} diff --git a/JY.Model/DB.Entity/SystemConfig.cs b/JY.Model/DB.Entity/SystemConfig.cs new file mode 100644 index 0000000..f620ef5 --- /dev/null +++ b/JY.Model/DB.Entity/SystemConfig.cs @@ -0,0 +1,110 @@ +using JY.Model.Excel; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Model +{ + public class SystemConfig + { + #region MES使用 + /// + /// 工厂代码 + /// + public string siteCode { get; set; } + /// + ///产线名称 + /// + public string lineCode { get; set; } + /// + /// 设备编码 + /// + public string equipCode { get; set; } + /// + /// 物料编码 + /// + public string materialCode { get; set; } + + /// + /// 产品型号 + /// + public string productType { get; set; } + + /// + /// 分档查询接口地址 + /// + public string GradingMesUrl = "http://10.17.128.206/core/api/public/eve/pm/eqm/grading"; + + /// + /// 结果加工参数接口地址 + /// + public string ResultProcessMesUrl = "http://10.17.128.205/core/api/public/product/process/param/new/result"; + + /// + /// 产品进站接口地址 + /// + public string StationArrivalUrl = "http://127.0.0.1"; + + /// + /// 产品出站接口地址 + /// + public string StationExitUrl = "http://127.0.0.1"; + + public List CollectItemCfgList { get; set; } = new List(); + + #endregion + + #region 分档使用 + /// + /// 档位一 + /// + public string Grading1 = ""; + /// + /// 档位一 + /// + public string Grading2 = ""; + /// + /// 档位一 + /// + public string Grading3 = ""; + /// + /// 档位一 + /// + public string Grading4 = ""; + + + + #endregion + + /// + /// MES上传超时时间 + /// + public double MesRequestTime = 2; + /// + /// 权限时间 + /// + public int LoginTime = 0; + + /// + /// 是否上传MES + /// + public bool isUpMes { get; set; } + + /// + /// 员工账号 + /// + public string userName = ""; + + + + + + + + + + + } +} diff --git a/JY.Model/DB.Entity/TrayTestEntry.cs b/JY.Model/DB.Entity/TrayTestEntry.cs new file mode 100644 index 0000000..bd6946a --- /dev/null +++ b/JY.Model/DB.Entity/TrayTestEntry.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Model +{ + public class TrayTestEntry + { + + /// + /// 托盘ID + /// + public string TrayID { set; get; } + /// + /// 进托盘时间 + /// + public string TrayDate { set; get; } = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + /// + /// 托盘验证结果 + /// + public string TrayResult { set; get; } + /// + /// 托盘验证备注 + /// + public string TrayRemark { set; get; } + /// + /// 上传状态 + /// + public int Flag { set; get; } + } +} diff --git a/JY.Model/Excel/CollectItemCfg.cs b/JY.Model/Excel/CollectItemCfg.cs new file mode 100644 index 0000000..392ab36 --- /dev/null +++ b/JY.Model/Excel/CollectItemCfg.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Model.Excel +{ + public class CollectItemCfg + { + [Description("PLC相对地址")] + public int? PLCRelAddress { get; set; } + + [Description("PLC采集数据含义")] + public string PLCItemName { get; set; } + + [Description("上位机属性名")] + public string HCPropName { get; set; } + + [Description("Mes采集项编码")] + public string MesItemCode { get; set; } + + [Description("Mes采集项描述")] + public string MesItemName { get; set; } + + [Description("是否启用")] + public string IsEnableStr { get; set; } + + public bool IsEnable + { + get => IsEnableStr == "Y"; + } + } +} diff --git a/JY.Model/JY.Model.csproj b/JY.Model/JY.Model.csproj new file mode 100644 index 0000000..4256fb6 --- /dev/null +++ b/JY.Model/JY.Model.csproj @@ -0,0 +1,96 @@ + + + + + Debug + AnyCPU + {F7DB3A93-FCA2-479B-8B2E-380116AAE9FC} + Library + Properties + JY.Model + JY.Model + v4.8 + 512 + true + + + + true + full + false + ..\..\..\..\JY.Inspection\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\CsvHelper.30.0.1\lib\net45\CsvHelper.dll + + + ..\packages\SqlSugar.5.1.4.207\lib\SqlSugar.dll + + + + ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll + + + + + ..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll + + + + ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + + + ..\packages\System.ValueTuple.4.3.0\lib\netstandard1.0\System.ValueTuple.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JY.Model/Properties/AssemblyInfo.cs b/JY.Model/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..a634ade --- /dev/null +++ b/JY.Model/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("JY.Model")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("JY.Model")] +[assembly: AssemblyCopyright("Copyright © 2021")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("f7db3a93-fca2-479b-8b2e-380116aae9fc")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/JY.Model/app.config b/JY.Model/app.config new file mode 100644 index 0000000..e473418 --- /dev/null +++ b/JY.Model/app.config @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JY.Model/packages.config b/JY.Model/packages.config new file mode 100644 index 0000000..156ad2a --- /dev/null +++ b/JY.Model/packages.config @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/JY.Utility/CSVHelper.cs b/JY.Utility/CSVHelper.cs new file mode 100644 index 0000000..46a3ad4 --- /dev/null +++ b/JY.Utility/CSVHelper.cs @@ -0,0 +1,39 @@ +using CsvHelper; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Utility +{ + public class CSVHelper + { + /// + /// 读取CSV文件 + /// + /// csv文件名 + /// + public static List ReadCSV(string fileName, string strSeparator = "\t") + { + if (!File.Exists(fileName)) return null; + //Nuget获取CsvHelper + using (var reader = new StreamReader(fileName)) + { + var cfg = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.InvariantCulture) + { + Mode = CsvMode.Escape, + Escape = '\\', + Delimiter = strSeparator//设置分隔符号 + }; + using (var csv = new CsvReader(reader, cfg)) + { + var list = csv.GetRecords().ToList(); + return list; + } + } + } + } +} diff --git a/JY.Utility/ChartHelper.cs b/JY.Utility/ChartHelper.cs new file mode 100644 index 0000000..9719750 --- /dev/null +++ b/JY.Utility/ChartHelper.cs @@ -0,0 +1,132 @@ +using System.Drawing; +using System.Windows.Forms.DataVisualization.Charting; + +namespace JY.Utility +{ + public class ChartHelper + { + + /// + /// Name:添加序列 + /// + /// + /// 图表对象 + /// 序列名称 + /// 图表类型 + /// 颜色 + /// 标记点颜色 + /// 是否显示数值 + public static void AddSeries(Chart chart, string seriesName, SeriesChartType chartType, Color color, Color markColor, bool showValue = false) + { + chart.Series.Add(seriesName); + chart.Series[seriesName].ChartType = chartType; + chart.Series[seriesName].Color = color; + if (showValue) + { + chart.Series[seriesName].IsValueShownAsLabel = true; + chart.Series[seriesName].MarkerStyle = MarkerStyle.Circle; + chart.Series[seriesName].MarkerColor = markColor; + chart.Series[seriesName].LabelForeColor = color; + chart.Series[seriesName].LabelAngle = -90; + } + } + + /// + /// Name:设置标题 + /// + /// + /// 图表对象 + /// 图表名称 + public static void SetTitle(Chart chart, string chartName, Font font, Docking docking, Color foreColor) + { + chart.Titles.Add(chartName); + chart.Titles[0].Font = font; + chart.Titles[0].Docking = docking; + chart.Titles[0].ForeColor = foreColor; + } + + /// + /// Name:设置样式 + /// 2019-04-23 14:04 + /// + /// 图表对象 + /// 背景颜色 + /// 字体颜色 + public static void SetStyle(Chart chart, Color backColor, Color foreColor) + { + chart.BackColor = backColor; + chart.ChartAreas[0].BackColor = backColor; + chart.ForeColor = Color.Red; + } + + /// + /// Name:设置图例 + /// Author: + /// + /// 图表对象 + /// 停靠位置 + /// 对齐方式 + /// 背景颜色 + /// 字体颜色 + public static void SetLegend(Chart chart, Docking docking, StringAlignment align, Color backColor, Color foreColor) + { + chart.Legends[0].Docking = docking; + chart.Legends[0].Alignment = align; + chart.Legends[0].BackColor = backColor; + chart.Legends[0].ForeColor = foreColor; + } + + /// + /// Name:设置XY轴 + /// Author: + /// + /// 图表对象 + /// X轴标题 + /// Y轴标题 + /// 坐标轴标题对齐方式 + /// 坐标轴字体颜色 + /// 坐标轴颜色 + /// 坐标轴箭头样式 + /// X轴的间距 + /// Y轴的间距 + public static void SetXY(Chart chart, string xTitle, string yTitle, StringAlignment align, Color foreColor, Color lineColor, AxisArrowStyle arrowStyle, double xInterval, double yInterval) + { + //chart.ChartAreas[0].AxisX.Title = xTitle; + //chart.ChartAreas[0].AxisY.Title = yTitle; + //chart.ChartAreas[0].AxisX.TitleAlignment = align; + //chart.ChartAreas[0].AxisY.TitleAlignment = align; + chart.ChartAreas[0].AxisX.TitleForeColor = foreColor; + chart.ChartAreas[0].AxisY.TitleForeColor = foreColor; + chart.ChartAreas[0].AxisX.LabelStyle = new LabelStyle() { ForeColor = foreColor }; + chart.ChartAreas[0].AxisY.LabelStyle = new LabelStyle() { ForeColor = foreColor }; + chart.ChartAreas[0].AxisX.LineColor = lineColor; + chart.ChartAreas[0].AxisY.LineColor = lineColor; + chart.ChartAreas[0].AxisY.LabelStyle.ForeColor = lineColor; + chart.ChartAreas[0].AxisX.LabelStyle.ForeColor = lineColor; + + + chart.ChartAreas[0].AxisX.ArrowStyle = arrowStyle; + chart.ChartAreas[0].AxisY.ArrowStyle = arrowStyle; + chart.ChartAreas[0].AxisX.Interval = xInterval; + // chart.ChartAreas[0].AxisY.Interval = yInterval; + } + + /// + /// Name:设置网格 + /// Author: + /// + /// 图表对象 + /// 网格线颜色 + /// X轴网格的间距 + /// Y轴网格的间距 + public static void SetMajorGrid(Chart chart, Color lineColor, double xInterval, double yInterval) + { + chart.ChartAreas[0].AxisX.MajorGrid.LineColor = lineColor; + chart.ChartAreas[0].AxisY.MajorGrid.LineColor = lineColor; + chart.ChartAreas[0].AxisX.MajorGrid.Interval = xInterval; + chart.ChartAreas[0].AxisY.MajorGrid.Interval = yInterval; + } + + + } +} diff --git a/JY.Utility/ConvertHelper.cs b/JY.Utility/ConvertHelper.cs new file mode 100644 index 0000000..ef0b10b --- /dev/null +++ b/JY.Utility/ConvertHelper.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Utility +{ + public class ConvertHelper + { + /// + /// DateTime转long + /// + /// + /// + public static long DateTimeToLong(DateTime dt) + { + DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); + TimeSpan toNow = dt.Subtract(dtStart); + long timeStamp = toNow.Ticks; + timeStamp = long.Parse(timeStamp.ToString().Substring(0, timeStamp.ToString().Length - 4)); + return timeStamp; + } + + /// + /// 字符串转数字 + /// + /// + /// + public static Decimal StringToDecimal(string strData) + { + Decimal dData = 0.0M; + try + { + if (strData.ToUpper().Contains("E")) + { + dData = Convert.ToDecimal(Decimal.Parse(strData.ToString(), System.Globalization.NumberStyles.Float).ToString("f4")); + } + else + { + dData = Convert.ToDecimal(Decimal.Parse(strData).ToString("f4")); + } + if (dData > 10000000000) + { + return 0.00M; + } + + } + catch + { } + return dData; + } + } +} diff --git a/JY.Utility/CustomAttributeHelper.cs b/JY.Utility/CustomAttributeHelper.cs new file mode 100644 index 0000000..173f05b --- /dev/null +++ b/JY.Utility/CustomAttributeHelper.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace JY.Utility +{ + public static class CustomAttributeHelper + { + /// + /// Cache Data + /// + private static readonly Dictionary Cache = new Dictionary(); + + /// + /// 获取CustomAttribute Value + /// + /// Attribute的子类型 + /// 头部标有CustomAttribute类的类型 + /// 取Attribute具体哪个属性值的匿名函数 + /// 返回Attribute的值,没有则返回null + public static string GetCustomAttributeValue(this Type sourceType, Func attributeValueAction) where T : Attribute + { + return GetAttributeValue(sourceType, attributeValueAction, null); + } + + /// + /// 获取CustomAttribute Value + /// + /// Attribute的子类型 + /// 头部标有CustomAttribute类的类型 + /// 取Attribute具体哪个属性值的匿名函数 + /// field name或property name + /// 返回Attribute的值,没有则返回null + public static string GetCustomAttributeValue(this Type sourceType, Func attributeValueAction, + string name) where T : Attribute + { + return GetAttributeValue(sourceType, attributeValueAction, name); + } + + private static string GetAttributeValue(Type sourceType, Func attributeValueAction, + string name) where T : Attribute + { + var key = BuildKey(sourceType, name); + if (!Cache.ContainsKey(key)) + { + CacheAttributeValue(sourceType, attributeValueAction, name); + } + + return Cache[key]; + } + + /// + /// 缓存Attribute Value + /// + private static void CacheAttributeValue(Type type, + Func attributeValueAction, string name) + { + var key = BuildKey(type, name); + + var value = GetValue(type, attributeValueAction, name); + + lock (key + "_attributeValueLockKey") + { + if (!Cache.ContainsKey(key)) + { + Cache[key] = value; + } + } + } + + private static string GetValue(Type type, + Func attributeValueAction, string name) + { + object attribute = null; + if (string.IsNullOrEmpty(name)) + { + attribute = + type.GetCustomAttributes(typeof(T), false).FirstOrDefault(); + } + else + { + var propertyInfo = type.GetProperty(name); + if (propertyInfo != null) + { + attribute = + propertyInfo.GetCustomAttributes(typeof(T), false).FirstOrDefault(); + } + + var fieldInfo = type.GetField(name); + if (fieldInfo != null) + { + attribute = fieldInfo.GetCustomAttributes(typeof(T), false).FirstOrDefault(); + } + } + + return attribute == null ? null : attributeValueAction((T)attribute); + } + + /// + /// 缓存Collection Name Key + /// + private static string BuildKey(Type type, string name) + { + if (string.IsNullOrEmpty(name)) + { + return type.FullName; + } + + return type.FullName + "." + name; + } + } +} diff --git a/JY.Utility/DataList.cs b/JY.Utility/DataList.cs new file mode 100644 index 0000000..0ffbf7d --- /dev/null +++ b/JY.Utility/DataList.cs @@ -0,0 +1,99 @@ +namespace JY.Utility +{ + public class DataList + { + private string g1; + private string g2; + private string g3; + private string g4; + private string g5; + private string g6; + private string g7; + private string g8; + + + public string G1 + { + get + { + return g1; + } + set + { + g1 = value; + } + } + + public string G2 + { + get + { + return g2; + } + set + { + g2 = value; + } + } + + public string G3 + { + get + { + return g3; + } + set + { + g3 = value; + } + } + + public string G4 + { + get + { + return g4; + } + set + { + g4 = value; + } + } + + public string G5 + { + get + { + return g5; + } + set + { + g5 = value; + } + } + + public string G6 + { + get + { + return g6; + } + set + { + g6 = value; + } + } + + public string G7 + { + get + { + return g7; + } + set + { + g7 = value; + } + } + } +} diff --git a/JY.Utility/EPPlusExcelHelper.cs b/JY.Utility/EPPlusExcelHelper.cs new file mode 100644 index 0000000..6b984a5 --- /dev/null +++ b/JY.Utility/EPPlusExcelHelper.cs @@ -0,0 +1,379 @@ +using OfficeOpenXml; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Data; +using System.Text; +using System.Threading.Tasks; +using System.Drawing.Drawing2D; +using System.ComponentModel; +using OfficeOpenXml.Style; + +namespace JY.Utility +{ + public class EPPlusExcelHelper : IDisposable + { + public ExcelPackage ExcelPackage { get; private set; } + private Stream fs; + + public EPPlusExcelHelper(string filePath) + { + if (File.Exists(filePath)) + { + var file = new FileInfo(filePath); + ExcelPackage = new ExcelPackage(file); + } + else + { + fs = File.Create(filePath); + ExcelPackage = new ExcelPackage(fs); + + } + } + /// + /// 将List集合导出到Excel中 + /// + /// + /// + /// + public void ExportList(IEnumerable list, string sheetName = "") + { + if (string.IsNullOrEmpty(sheetName)) + { + sheetName = ExcelPackage.File.Name; + } + AppendSheetToWorkBook(list, sheetName); + Save(); + } + + /// + /// 将List集合导出到Excel中 + /// + /// + /// + /// + public void ExportDataTable(string strFileName,DataTable dt) + { + AppendSheetToWorkBook(strFileName,dt); + Save(); + } + + /// + /// 获取sheet,没有则创建 + /// + /// + /// + public ExcelWorksheet GetOrAddSheet(string sheetName) + { + ExcelWorksheet ws = ExcelPackage.Workbook.Worksheets.FirstOrDefault(i => i.Name == sheetName); + if (ws == null) + { + ws = ExcelPackage.Workbook.Worksheets.Add(sheetName); + } + return ws; + } + + /// + /// DataTable数据导出到Excel(xlsx) + /// + /// ExcelPackage + /// 数据源 + public void AppendSheetToWorkBook(string strFileName,DataTable sourceTable) + { + AppendSheetToWorkBook(strFileName,sourceTable, true); + } + + /// + /// DataTable数据导出到Excel(xlsx) + /// + /// ExcelPackage + /// 数据源 + /// 是否删除同名的sheet + public void AppendSheetToWorkBook(string strFileName,DataTable sourceTable, bool isDeleteSameNameSheet) + { + //创建worksheet + ExcelWorksheet ws = AddSheet(strFileName, isDeleteSameNameSheet); + //ExcelWorksheet ws = AddSheet(sourceTable.TableName, isDeleteSameNameSheet); + //从单元格A1开始,将数据表加载到工作表中。第1行输出列名 + ws.Cells["A1"].LoadFromDataTable(sourceTable, true); + //格式化Row + FromatRow(sourceTable.Rows.Count, sourceTable.Columns.Count, ws); + } + + + /// + /// 删除指定的sheet + /// + /// + /// + public void DeleteSheet(string sheetName) + { + var sheet = ExcelPackage.Workbook.Worksheets.FirstOrDefault(i => i.Name == sheetName); + if (sheet != null) + { + ExcelPackage.Workbook.Worksheets.Delete(sheet); + } + } + + /// + /// 导出列表到excel,已存在同名sheet将删除已存在的 + /// + /// + /// + /// 数据源 + /// sheet名称 + public void AppendSheetToWorkBook(IEnumerable list, string sheetName) + { + AppendSheetToWorkBook(list, sheetName, true); + } + + /// + /// 导出列表到excel,已存在同名sheet将删除已存在的 + /// + /// + /// + /// 数据源 + /// sheet名称 + /// 是否删除已存在的同名sheet,false时将重命名导出的sheet + public void AppendSheetToWorkBook(IEnumerable list, string sheetName, bool isDeleteSameNameSheet) + { + ExcelWorksheet ws = AddSheet(sheetName, isDeleteSameNameSheet); + ws.Cells["A1"].LoadFromCollection(list, true); + } + + /// + /// 添加文字图片 + /// + /// + /// 要转换成图片的文字 + public void AddPicture(string sheetName, string msg) + { + Bitmap img = GetPictureString(msg); + + var sheet = GetOrAddSheet(sheetName); + var picName = "92FF5CFE-2C1D-4A6B-92C6-661BDB9ED016"; + var pic = sheet.Drawings.FirstOrDefault(i => i.Name == picName); + if (pic != null) + { + sheet.Drawings.Remove(pic); + } + pic = sheet.Drawings.AddPicture(picName, msg); + + pic.SetPosition(3, 0, 6, 0); + } + + /// + /// 文字绘制图片 + /// + /// + /// + private static Bitmap GetPictureString(string msg) + { + var msgs = msg.Split(new string[] { System.Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); + var maxLenght = msgs.Max(i => i.Length); + var rowCount = msgs.Count(); + var rowHeight = 23; + var fontWidth = 17; + var img = new Bitmap(maxLenght * fontWidth, rowCount * rowHeight); + using (Graphics g = Graphics.FromImage(img)) + { + g.Clear(Color.White); + Font font = new Font("Arial", 12, (FontStyle.Bold)); + LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, img.Width, img.Height), Color.Blue, Color.DarkRed, 1.2f, true); + + for (int i = 0; i < msgs.Count(); i++) + { + g.DrawString(msgs[i], font, brush, 3, 2 + rowHeight * i); + } + } + return img; + } + + /// + /// List转DataTable + /// + /// + /// + /// + public DataTable ListToDataTable(IEnumerable data) + { + PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T)); + DataTable dataTable = new DataTable(); + for (int i = 0; i < properties.Count; i++) + { + PropertyDescriptor property = properties[i]; + dataTable.Columns.Add(property.Name, Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType); + } + object[] values = new object[properties.Count]; + foreach (T item in data) + { + for (int i = 0; i < values.Length; i++) + { + values[i] = properties[i].GetValue(item); + } + + dataTable.Rows.Add(values); + } + return dataTable; + } + + /// + /// 插入行 + /// + /// + /// 行类容,一个单元格一个对象 + /// 插入位置,起始位置为1 + public void InsertValues(string sheetName, List values, int rowIndex) + { + var sheet = GetOrAddSheet(sheetName); + sheet.InsertRow(rowIndex, 1); + int i = 1; + foreach (var item in values) + { + sheet.SetValue(rowIndex, i, item); + i++; + } + } + + /// + /// 保存修改 + /// + public void Save() + { + try + { + ExcelPackage.Save(); + ExcelPackage.Stream.Close(); + } + catch (Exception ex) + { + throw ex; + } + + } + + /// + /// 添加Sheet到ExcelPackage + /// + /// ExcelPackage + /// sheet名称 + /// 如果存在同名的sheet是否删除 + /// + private ExcelWorksheet AddSheet(string sheetName, bool isDeleteSameNameSheet) + { + if (isDeleteSameNameSheet) + { + DeleteSheet(sheetName); + } + else + { + while (ExcelPackage.Workbook.Worksheets.Any(i => i.Name == sheetName)) + { + sheetName = sheetName + "(1)"; + } + } + + ExcelWorksheet ws = ExcelPackage.Workbook.Worksheets.Add(sheetName); + return ws; + } + + private void FromatRow(int rowCount, int colCount, ExcelWorksheet ws) + { + ExcelBorderStyle borderStyle = ExcelBorderStyle.Thin; + Color borderColor = Color.FromArgb(155, 155, 155); + + using (ExcelRange rng = ws.Cells[1, 1, rowCount + 1, colCount]) + { + rng.Style.Font.Name = "宋体"; + rng.Style.Font.Size = 10; + rng.Style.Fill.PatternType = ExcelFillStyle.Solid; //设置图案的背景为Solid + rng.Style.Fill.BackgroundColor.SetColor(Color.FromArgb(255, 255, 255)); + + rng.Style.Border.Top.Style = borderStyle; + rng.Style.Border.Top.Color.SetColor(borderColor); + + rng.Style.Border.Bottom.Style = borderStyle; + rng.Style.Border.Bottom.Color.SetColor(borderColor); + + rng.Style.Border.Right.Style = borderStyle; + rng.Style.Border.Right.Color.SetColor(borderColor); + } + + // 格式化标题行 + using (ExcelRange rng = ws.Cells[1, 1, 1, colCount]) + { + rng.Style.Font.Bold = true; + rng.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; + rng.Style.Fill.BackgroundColor.SetColor(Color.FromArgb(234, 241, 246)); + rng.Style.Font.Color.SetColor(Color.FromArgb(51, 51, 51)); + } + } + + /// + /// + /// 导入Excel(EPPlus只支持.xlsx) + /// + /// 第几个Sheet + /// + public DataTable ImportExcel(int sheetindex = 1) + { + DataSet ds = new DataSet(); + using (ExcelWorksheet worksheet = ExcelPackage.Workbook.Worksheets[sheetindex]) + { + if (worksheet.Dimension == null) + { + return null; + } + DataTable table = new DataTable(worksheet.Name); + for (int rowNum = 1; rowNum <= worksheet.Dimension.End.Row; rowNum++) + { + + #region 创建列 + if (table.Columns.Count == 0) + { + #region 第一行数据作为表头 + for (int columnNum = 1; columnNum <= worksheet.Dimension.End.Column; columnNum++) + { + table.Columns.Add(worksheet.Cells[rowNum, columnNum].Value.ToString().Trim(), typeof(string)); + } + continue; + #endregion + } + #endregion + + #region 新增行 + DataRow dr = table.NewRow(); + for (int columnNum = 1; columnNum <= table.Columns.Count; columnNum++) + { + if (worksheet.Cells[rowNum, columnNum].Value==null) + { + dr[columnNum - 1] =string.Empty; + } + else + { + dr[columnNum - 1] = worksheet.Cells[rowNum, columnNum].Value.ToString().Trim(); + } + + } + table.Rows.Add(dr); + #endregion + } + return table; + } + + } + + public void Dispose() + { + ExcelPackage.Dispose(); + if (fs != null) + { + fs.Dispose(); + fs.Close(); + } + } + } + +} diff --git a/JY.Utility/ExcelImporter.cs b/JY.Utility/ExcelImporter.cs new file mode 100644 index 0000000..b0bba52 --- /dev/null +++ b/JY.Utility/ExcelImporter.cs @@ -0,0 +1,92 @@ +using OfficeOpenXml; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.Linq; + +namespace JY.Utility +{ + public static class ExcelImporter + { + public static List Import(string filePath, string sheetName = "Sheet1") where T : new() + { + // 设置 LicenseContext(非商业用途) + ExcelPackage.License.SetNonCommercialPersonal("EVE"); + + if (!File.Exists(filePath)) + { + throw new FileNotFoundException("Excel文件不存在", filePath); + } + + var result = new List(); + var fileInfo = new FileInfo(filePath); + + using (var package = new ExcelPackage(fileInfo)) + { + var worksheet = package.Workbook.Worksheets.FirstOrDefault(w => w.Name.Equals(sheetName, StringComparison.OrdinalIgnoreCase)); + if (worksheet == null) + { + throw new ArgumentException($"指定的工作表 '{sheetName}' 不存在"); + } + + if (worksheet.Dimension == null) + { + return result; + } + + var dimension = worksheet.Dimension; + var headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + + for (int col = dimension.Start.Column; col <= dimension.End.Column; col++) + { + var headerValue = worksheet.Cells[1, col].Value?.ToString().Trim(); + if (!string.IsNullOrEmpty(headerValue)) + { + headers[headerValue] = col; + } + } + + var properties = TypeDescriptor.GetProperties(typeof(T)); + + for (int row = dimension.Start.Row + 1; row <= dimension.End.Row; row++) + { + var item = new T(); + bool hasData = false; + + foreach (PropertyDescriptor property in properties) + { + if (headers.TryGetValue(property.Description, out int col)) + { + var cellValue = worksheet.Cells[row, col].Value; + + if (cellValue != null) + { + hasData = true; + var stringValue = cellValue.ToString().Trim(); + + try + { + var targetType = Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType; + var convertedValue = Convert.ChangeType(stringValue, targetType); + property.SetValue(item, convertedValue); + } + catch + { + property.SetValue(item, null); + } + } + } + } + + if (hasData) + { + result.Add(item); + } + } + } + + return result; + } + } +} diff --git a/JY.Utility/IniFileHelper.cs b/JY.Utility/IniFileHelper.cs new file mode 100644 index 0000000..a908546 --- /dev/null +++ b/JY.Utility/IniFileHelper.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace JY.Utility +{ + public class IniFileHelper + { + private static string iniFilePath = "ComConfig.ini"; + + [DllImport("kernel32")] + private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); + + [DllImport("kernel32")] + private static extern long GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath); + + public static string ReadIniData(string Section, string Key) + { + try + { + if (File.Exists(iniFilePath)) + { + StringBuilder temp = new StringBuilder(1024); + GetPrivateProfileString(Section, Key, "", temp, 1024, iniFilePath); + return temp.ToString(); + } + MessageBox.Show("节点:" + Section + ",键名:" + Key + ":读取配置文件错误!"); + return null; + } + catch + { + throw; + } + } + + public static bool WriteIniData(string Section, string Key, string Value) + { + try + { + if (File.Exists(iniFilePath)) + { + if (WritePrivateProfileString(Section, Key, Value, iniFilePath) == 0L) + { + return false; + } + return true; + } + File.Create(iniFilePath).Close(); + if (WritePrivateProfileString(Section, Key, Value, iniFilePath) == 0L) + { + return false; + } + return true; + } + catch + { + throw; + } + } + + public static void CreateIniFile(string StartupPath, string AppName) + { + iniFilePath = StartupPath + AppName; + if (!Directory.Exists(StartupPath)) + { + Directory.CreateDirectory(StartupPath); + } + if (!File.Exists(iniFilePath)) + { + File.Create(iniFilePath).Close(); + } + } + } +} diff --git a/JY.Utility/JY.Utility.csproj b/JY.Utility/JY.Utility.csproj new file mode 100644 index 0000000..73418e6 --- /dev/null +++ b/JY.Utility/JY.Utility.csproj @@ -0,0 +1,126 @@ + + + + + Debug + AnyCPU + {76DE07E0-9E97-44AB-8148-01B44C5C1ADD} + Library + Properties + JY.Utility + JY.Utility + v4.8 + 512 + true + + + + true + full + false + ..\..\..\..\JY.Inspection\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Portable.BouncyCastle.1.8.9\lib\net40\BouncyCastle.Crypto.dll + + + ..\packages\CsvHelper.30.0.1\lib\net47\CsvHelper.dll + + + ..\packages\EPPlus.8.0.8\lib\net462\EPPlus.dll + + + ..\packages\EPPlus.Interfaces.8.0.0\lib\net462\EPPlus.Interfaces.dll + + + ..\packages\SharpZipLib.1.4.2\lib\netstandard2.0\ICSharpCode.SharpZipLib.dll + + + ..\packages\log4net.2.0.13\lib\net45\log4net.dll + + + ..\packages\Microsoft.IO.RecyclableMemoryStream.3.0.1\lib\netstandard2.0\Microsoft.IO.RecyclableMemoryStream.dll + + + ..\packages\NPOI.2.5.5\lib\net45\NPOI.dll + + + ..\packages\NPOI.2.5.5\lib\net45\NPOI.OOXML.dll + + + ..\packages\NPOI.2.5.5\lib\net45\NPOI.OpenXml4Net.dll + + + ..\packages\NPOI.2.5.5\lib\net45\NPOI.OpenXmlFormats.dll + + + + + ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll + + + ..\packages\System.ComponentModel.Annotations.5.0.0\lib\net461\System.ComponentModel.Annotations.dll + + + + + + + ..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll + + + + ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + + + + ..\packages\System.Security.Cryptography.Xml.8.0.2\lib\net462\System.Security.Cryptography.Xml.dll + + + ..\packages\System.ValueTuple.4.3.0\lib\netstandard1.0\System.ValueTuple.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JY.Utility/JY.Utility.csproj.user b/JY.Utility/JY.Utility.csproj.user new file mode 100644 index 0000000..c10e84b --- /dev/null +++ b/JY.Utility/JY.Utility.csproj.user @@ -0,0 +1,6 @@ + + + + ProjectFiles + + \ No newline at end of file diff --git a/JY.Utility/LogHelper.cs b/JY.Utility/LogHelper.cs new file mode 100644 index 0000000..5b5063e --- /dev/null +++ b/JY.Utility/LogHelper.cs @@ -0,0 +1,389 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Xml; +using log4net; +using log4net.Appender; +using log4net.Config; + +namespace JY.Utility +{ + /// + /// LogHelper 用来记录系统的日志,包括异常等. + /// + public static class LogHelper + { + private static readonly ILog log; + + /// + /// + public static bool DebugMode = false; + + #region 构造函数 + + /// + /// 构造函数 + /// + static LogHelper() + { + var repository = LogManager.CreateRepository("NETCoreRepository"); + var c = XmlConfigurator.Configure(repository, new FileInfo("Log4net.config")); + log = LogManager.GetLogger(repository.Name, "Test"); + RunClearJob(); + } + + #endregion + + #region 清除过期日志 + + /// + /// 启动清除过期日志线程 + /// + private static void RunClearJob() + { + Task.Run(() => + { + try + { + while (true) + { + ClearOverdue(); + WriteLine("清除log4net过期日志"); + //24小时清一次 + Thread.Sleep(1000 * 60 * 60 * 24); + } + } + catch (Exception e) + { + WriteException(e); + } + }); + } + + /// + /// 定期清除过期日志 + /// + private static void ClearOverdue() + { + var days = 7; + if (File.Exists("Log4net.config")) + { + try + { + XmlDocument doc = new XmlDocument(); + doc.Load(@"Log4net.config"); + var node = doc.SelectSingleNode("/configuration/log4net"); + days = Convert.ToInt32(node.Attributes["OverdueDays"].Value); + } + catch + { + // ignored + } + } + + + var apps = log.Logger.Repository.GetAppenders(); + if (apps.Length <= 0) + { + return; + } + + var now = DateTime.UtcNow.AddDays(-days); + foreach (var item in apps) + { + if (item is RollingFileAppender roll) + { + var dir = Path.GetDirectoryName(roll.File); + var files = Directory.GetFiles(dir, "*.log.*"); + //var sample = "log.txt2017-10-23.txt"; + + foreach (var filePath in files) + { + var file = new FileInfo(filePath); + if (file.CreationTime < now || file.LastWriteTime < now) + { + try + { + file.Delete(); + } + catch (Exception) + { + + } + } + } + } + } + } + + #endregion + + + #region 公布的写日志函数 + + /// + /// 记录一条日志信息。注意:在记录时该程序会自动在左侧增加一格日期。 + /// + /// 字符串的组成格式 + /// 参数 + public static void WriteLine(string strFormat, params object[] args) + { + try + { + log.Info($"{string.Format(strFormat, args)}"); + } + catch (Exception exp) + { + Trace.WriteLine("LOG ERROR: " + exp.Message); + } + } + + /// + /// 记录一条日志信息。注意:在记录时该程序会自动在左侧增加一格日期。 + /// + /// 字符串的组成格式 + public static void WriteLine(string strLog) + { + try + { + Debug.Assert(strLog != null); + log.Info($"{strLog}"); + } + catch (Exception exp) + { + Trace.WriteLine("LOG ERROR: " + exp.Message); + } + } + + /// + /// 记录一条错误日志信息。注意:在记录时该程序会自动在左侧增加一格日期。 + /// + /// + public static void WriteErrorLine(string strLog) + { + try + { + Debug.Assert(strLog != null); + log.Error($"{strLog}"); + } + catch (Exception exp) + { + Trace.WriteLine("LOG ERROR: " + exp.Message); + } + } + + /// + /// 记录一条日志信息。注意:在记录时该程序会自动在左侧增加一格日期。 + /// + /// 字符串的组成格式 + public static void WriteDebugLine(string strLog) + { + try + { + Debug.Assert(strLog != null); + log.Debug($"{strLog}"); + } + catch (Exception exp) + { + Trace.WriteLine("LOG ERROR: " + exp.Message); + } + } + + + /// + /// 记录异常(在调试模式) + /// + /// + public static void WriteDebugException(Exception exp) + { + WriteDebugException(exp, null); + } + + + /// + /// 记录异常(在调试模式) + /// + /// + /// + /// + public static void WriteDebugException(Exception exp, string strFormat, params object[] args) + { + try + { + Debug.Assert(exp != null); + var sb = new StringBuilder(); + + + sb.AppendFormat("[{0}] DEBUG 找到 [{1}] 异常: {2}\r\n", DateTime.Now.ToString("HH:mm:ss"), + exp.GetType().Name, exp.Message); + + // 附加信息 + if (strFormat != null) sb.AppendFormat(" Annex : {0}\r\n", string.Format(strFormat, args)); + + // 调试信息 + sb.AppendFormat(" Source : {0}\r\n", exp.Source); + sb.AppendFormat(" Time : {0}\r\n", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); + sb.AppendFormat(" OS/VER : {0} {1}\r\n", Environment.OSVersion.Platform, + Environment.OSVersion.Version); + sb.AppendFormat(" Thread : {0}\r\n", Thread.CurrentThread.Name); + + // 栈信息 + sb.AppendFormat(" Stack : {0}\r\n", exp.StackTrace); + + // 内部异常, 最多5级 + var inner = exp.InnerException; + for (var i = 0; i < 5 && inner != null; i++) + { + // 显示内部异常 + sb.AppendFormat(" ----- InnerException ---------------------------\r\n"); + sb.AppendFormat(" ExceptionType: {0}\r\n", inner.GetType().Name); + sb.AppendFormat(" Message: {0}\r\n", inner.Message); + sb.AppendFormat(" Stack : {0}\r\n", inner.StackTrace); + + // 获取异常的内部异常 + inner = inner.InnerException; + } + + log.Error(sb.ToString()); + } + catch (Exception ex) + { + Trace.WriteLine("LOG ERROR: " + ex.Message); + } + } + + + /// + /// 记录下该异常 + /// + /// 需要记录的异常对象 + public static void WriteException(Exception exp) + { + WriteException(exp, null); + } + + + /// + /// 记录下该异常 + /// + /// 异常对象 + /// 附加信息格式字符串,如果不需要,则该参数为 null + /// 参数 + public static void WriteException(Exception exp, string strFormat, params object[] args) + { + try + { + Debug.Assert(exp != null); + var sb = new StringBuilder(); + + { + sb.AppendFormat("[{0}] 找到 [{1}] 异常: {2}\r\n", DateTime.Now.ToString("HH:mm:ss"), exp.GetType().Name, + exp.Message); + + // 附加信息 + if (strFormat != null) sb.AppendFormat(" Annex : {0}\r\n", string.Format(strFormat, args)); + + // 调试信息 + sb.AppendFormat(" Source : {0}\r\n", exp.Source); + sb.AppendFormat(" Time : {0}\r\n", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); + sb.AppendFormat(" OS/VER : {0} {1}\r\n", Environment.OSVersion.Platform, + Environment.OSVersion.Version); + sb.AppendFormat(" Thread : {0}\r\n", Thread.CurrentThread.Name); + + // 栈信息 + sb.AppendFormat(" Stack : {0}\r\n", exp.StackTrace); + + // 内部异常, 最多5级 + var inner = exp.InnerException; + for (var i = 0; i < 5 && inner != null; i++) + { + // 显示内部异常 + sb.AppendFormat(" ----- InnerException ---------------------------\r\n"); + sb.AppendFormat(" ExceptionType: {0}\r\n", inner.GetType().Name); + sb.AppendFormat(" Message: {0}\r\n", inner.Message); + sb.AppendFormat(" Stack : {0}\r\n", inner.StackTrace); + + // 获取异常的内部异常 + inner = inner.InnerException; + } + + log.Error(sb.ToString()); + } + } + catch (Exception ex) + { + Trace.WriteLine("LOG ERROR: " + ex.Message); + } + } + + + /// + /// Dump 一个对象 + /// + /// + public static void WriteObject(object obj) + { + try + { + var sb = new StringBuilder(); + if (obj == null) + { + sb.AppendLine("-- The object is null\r\n"); + } + else + { + sb.AppendFormat("[{0}] {1} has {2} property\r\n", + DateTime.Now, obj.GetType().Name, obj.GetType().GetProperties().Length); + + var pis = obj.GetType().GetProperties(); + var iMaxLength = 0; + foreach (var pi in pis) + if (pi.CanRead && !pi.IsSpecialName) + iMaxLength = Math.Max(pi.Name.Length, iMaxLength); + + foreach (var pi in pis) + if (pi.CanRead && !pi.IsSpecialName) + sb.AppendFormat(" {0} - {1}\r\n", pi.Name.PadRight(iMaxLength, ' '), + pi.GetValue(obj, null)); + } + } + catch (Exception exp) + { + Trace.WriteLine("LOG ERROR: " + exp.Message); + } + } + + #endregion + + + /// + /// 错误日志带异常 + /// + /// + /// + public static void Error(string message,Exception ex) + { + ILog log = LogManager.GetLogger("Error"); + if (log.IsErrorEnabled) + { + log.Error(message,ex); + } + } + + // + /// 错误日志不带异常 + /// + /// 错误日志 + public static void Error(string message) + { + ILog log = LogManager.GetLogger("Error"); + if (log.IsErrorEnabled) + { + log.Error(message); + } + } + } +} \ No newline at end of file diff --git a/JY.Utility/OpenOfficeXML.cs b/JY.Utility/OpenOfficeXML.cs new file mode 100644 index 0000000..735a5c8 --- /dev/null +++ b/JY.Utility/OpenOfficeXML.cs @@ -0,0 +1,259 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Windows.Forms; +using NPOI.HSSF.UserModel; +using NPOI.SS.UserModel; +using OfficeOpenXml; + +namespace JY.Utility +{ + public class OpenOfficeXML + { + /// + /// EPPlusToExcel + /// + /// 数据集合 + /// Excel文件名 + public static void Out_CeLiang(List _D, string strFileName) + { + using (OfficeOpenXml.ExcelPackage package = new OfficeOpenXml.ExcelPackage(new FileInfo(strFileName))) + { + string TableName = DateTime.Now.ToString("yyyy-MM-dd"); + ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(TableName); + #region 绘制列头 + worksheet.Cells[1, 1].Value = "不良项目"; + worksheet.Cells[1, 2].Value = "数量"; + //worksheet.Cells[1, 3].Value = "规格3"; + //worksheet.Cells[1, 4, 1, 5].Value = "合并单元格"; + //worksheet.Cells[1, 4, 1, 5].Merge = true; + #endregion + + #region 数据行 + int i = 1; + foreach (DataList Item in _D) + { + worksheet.Cells[i + 1, 1].Value = Item.G1; + worksheet.Cells[i + 1, 2].Value = Item.G2; + //worksheet.Cells[i + 1, 3].Value = Item.G3; + //worksheet.Cells[i + 1, 4, i + 1, 5].Value = Item.G4; + //worksheet.Cells[i + 1, 4, i + 1, 5].Merge = true; + i++; + } + #endregion + + if (false == System.IO.Directory.Exists(System.AppDomain.CurrentDomain.BaseDirectory + @"Excel\")) + System.IO.Directory.CreateDirectory(System.AppDomain.CurrentDomain.BaseDirectory + @"Excel\"); + package.Save(); + } + } + + public static void Out_TimeCeLiang(List _D, string strFileName) + { + using (OfficeOpenXml.ExcelPackage package = new OfficeOpenXml.ExcelPackage(new FileInfo(strFileName))) + { + string TableName = DateTime.Now.ToString("yyyy-MM-dd"); + ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(TableName); + #region 绘制列头 + worksheet.Cells[1, 1].Value = "不良项目"; + worksheet.Cells[1, 2].Value = "数量"; + //worksheet.Cells[1, 3].Value = "规格3"; + //worksheet.Cells[1, 4, 1, 5].Value = "合并单元格"; + //worksheet.Cells[1, 4, 1, 5].Merge = true; + #endregion + + #region 数据行 + int i = 1; + foreach (DataList Item in _D) + { + worksheet.Cells[i + 1, 1].Value = Item.G1; + worksheet.Cells[i + 1, 2].Value = Item.G2; + //worksheet.Cells[i + 1, 3].Value = Item.G3; + //worksheet.Cells[i + 1, 4, i + 1, 5].Value = Item.G4; + //worksheet.Cells[i + 1, 4, i + 1, 5].Merge = true; + i++; + } + #endregion + + if (false == System.IO.Directory.Exists(System.AppDomain.CurrentDomain.BaseDirectory + @"Excel\")) + System.IO.Directory.CreateDirectory(System.AppDomain.CurrentDomain.BaseDirectory + @"Excel\"); + package.Save(); + } + } + + /// + /// ExportExcel(使用NPOI的方式) + /// + /// + public static int ExportExcel(DataTable DT, string selectDate, ref string strErr) + { + strErr = ""; + try + { + if (DT == null & DT.Rows.Count <= 0) + { + strErr = "请先查询统计数据后再执行导出操作!"; + return 1; + } + + string strFilePath = ""; + HSSFWorkbook hssfworkbookDown; + string modelExlPath = Application.StartupPath + "\\EmailTemplate\\Model.xls"; + if (File.Exists(modelExlPath) == false) //模板不存在 + { + strErr = "程序根目录下EmailTemplate文件夹内找不到导出模板文件!"; + return 2; + } + + using (FileStream file = new FileStream(modelExlPath, FileMode.Open, FileAccess.Read)) + { + hssfworkbookDown = new HSSFWorkbook(file); + file.Close(); + } + + WriterExcel(hssfworkbookDown, 0, DT); + string filename = selectDate + ".xls"; + strFilePath = Application.StartupPath + "\\Temp\\TEEnrollmentForm"; + if (Directory.Exists(strFilePath) == false) + { + Directory.CreateDirectory(strFilePath); + } + + strFilePath = strFilePath + "\\\\" + filename; + FileStream files = new FileStream(strFilePath, FileMode.Create); + hssfworkbookDown.Write(files); + files.Close(); + if (File.Exists(strFilePath) == false) //附件生成失败 + { + strErr = "生成EXCEL文件失败"; + return 3; + } + strErr = strFilePath; + return 4; + } + catch (Exception ex) + { + strErr = ex.Message; + } + return 0; + } + + /// + /// WriterExcel + /// + /// + /// + /// + public static void WriterExcel(HSSFWorkbook hssfworkbookDown, int sheetIndex, DataTable DT) + { + try + { + + #region 设置单元格样式 + + //字体 + HSSFFont fontS9 = (HSSFFont)hssfworkbookDown.CreateFont(); + fontS9.FontName = "Arial"; + fontS9.FontHeightInPoints = 10; + fontS9.Boldweight = (short)NPOI.SS.UserModel.FontBoldWeight.Normal; + //表格 + ICellStyle TableS9 = (ICellStyle)hssfworkbookDown.CreateCellStyle(); + TableS9.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin; + TableS9.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin; + TableS9.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin; + TableS9.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin; + TableS9.WrapText = true; + TableS9.SetFont(fontS9); + + #endregion + + HSSFSheet sheet = (HSSFSheet)hssfworkbookDown.GetSheetAt(sheetIndex); + hssfworkbookDown.SetSheetHidden(sheetIndex, false); + hssfworkbookDown.SetActiveSheet(sheetIndex); + + int n = 2; //因为模板有表头,所以从第2行开始写 + for (int j = 0; j < DT.Columns.Count; j++) + { + HSSFRow dataRow = (HSSFRow)sheet.CreateRow(j + n); + //string cv = DT.Columns[j].Caption; + //string strDepID = DT.Rows[j]["序号"].ToString().Trim(); + //dataRow.CreateCell(0); + //dataRow.Cells[0].SetCellValue(strDepID == "" ? DT.Rows[j]["日期"].ToString() : ""); + + dataRow.CreateCell(0); + dataRow.Cells[0].SetCellValue(DT.Rows[j]["日期"].ToString()); + dataRow.CreateCell(1); + dataRow.Cells[1].SetCellValue(DT.Rows[j]["班次"].ToString()); + dataRow.CreateCell(2); + dataRow.Cells[2].SetCellValue(DT.Rows[j]["班别"].ToString()); + dataRow.CreateCell(3); + dataRow.Cells[3].SetCellValue(DT.Rows[j]["工单号"].ToString()); + dataRow.CreateCell(4); + dataRow.Cells[4].SetCellValue(DT.Rows[j]["客户名称"].ToString()); + dataRow.CreateCell(5); + dataRow.Cells[5].SetCellValue(DT.Rows[j]["投入总数"].ToString()); + dataRow.CreateCell(6); + dataRow.Cells[6].SetCellValue(DT.Rows[j]["良品总数"].ToString()); + dataRow.CreateCell(7); + dataRow.Cells[7].SetCellValue(DT.Rows[j]["不良总数"].ToString()); + dataRow.CreateCell(8); + dataRow.Cells[8].SetCellValue(DT.Rows[j]["不良率"].ToString()); + dataRow.CreateCell(9); + dataRow.Cells[9].SetCellValue(DT.Rows[j]["质量缺陷"].ToString()); + dataRow.CreateCell(10); + dataRow.Cells[10].SetCellValue(DT.Rows[j]["非质量缺陷"].ToString()); + dataRow.CreateCell(11); + dataRow.Cells[11].SetCellValue(DT.Rows[j]["其他不良"].ToString()); + dataRow.CreateCell(12); + dataRow.Cells[12].SetCellValue(DT.Rows[j]["侧面不良"].ToString()); + dataRow.CreateCell(13); + dataRow.Cells[13].SetCellValue(DT.Rows[j]["正极不良"].ToString()); + dataRow.CreateCell(14); + dataRow.Cells[14].SetCellValue(DT.Rows[j]["负极不良"].ToString()); + dataRow.CreateCell(15); + dataRow.Cells[15].SetCellValue(DT.Rows[j]["重合不良"].ToString()); + dataRow.CreateCell(16); + dataRow.Cells[16].SetCellValue(DT.Rows[j]["喷码不良"].ToString()); + dataRow.CreateCell(17); + dataRow.Cells[17].SetCellValue(DT.Rows[j]["侧面凹坑鼓包、变形"].ToString()); + dataRow.CreateCell(18); + dataRow.Cells[18].SetCellValue(DT.Rows[j]["侧面脏污漏液"].ToString()); + dataRow.CreateCell(19); + dataRow.Cells[19].SetCellValue(DT.Rows[j]["侧面凸点、划痕、破皮、膜内异物"].ToString()); + dataRow.CreateCell(20); + dataRow.Cells[20].SetCellValue(DT.Rows[j]["正极面垫不良多放、漏放"].ToString()); + dataRow.CreateCell(21); + dataRow.Cells[21].SetCellValue(DT.Rows[j]["正极套膜不良含热缩不良、破损、褶皱、面垫翘起"].ToString()); + dataRow.CreateCell(22); + dataRow.Cells[22].SetCellValue(DT.Rows[j]["正极套膜脏污"].ToString()); + dataRow.CreateCell(23); + dataRow.Cells[23].SetCellValue(DT.Rows[j]["盖帽不良含漏液、盖帽脏污氧化生锈,划痕,变形"].ToString()); + dataRow.CreateCell(24); + dataRow.Cells[24].SetCellValue(DT.Rows[j]["负极套膜尺寸不良"].ToString()); + dataRow.CreateCell(25); + dataRow.Cells[25].SetCellValue(DT.Rows[j]["负极套膜不良含套膜褶皱变形、破损、褶皱"].ToString()); + dataRow.CreateCell(26); + dataRow.Cells[26].SetCellValue(DT.Rows[j]["负极套膜脏污"].ToString()); + dataRow.CreateCell(27); + dataRow.Cells[27].SetCellValue(DT.Rows[j]["底部不良含漏液、脏污、氧化生锈、划痕、变形"].ToString()); + dataRow.CreateCell(28); + dataRow.Cells[28].SetCellValue(DT.Rows[j]["操作员"].ToString()); + + + //for (int i = 0; i <= 2; i++) //循环列,添加样式 + //{ + // dataRow.Cells[i].CellStyle = TableS9; + //} + } + + //设定第一行,第一列的单元格选中 + sheet.SetActiveCell(0, 0); + } + catch (Exception ex) + { + //WriteLog(ex.ToString()); + } + } + } +} diff --git a/JY.Utility/Properties/AssemblyInfo.cs b/JY.Utility/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..74d0281 --- /dev/null +++ b/JY.Utility/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("JY.Utility")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("JY.Utility")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("76de07e0-9e97-44ab-8148-01b44c5c1add")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/JY.Utility/TxtHelper.cs b/JY.Utility/TxtHelper.cs new file mode 100644 index 0000000..bacf928 --- /dev/null +++ b/JY.Utility/TxtHelper.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace JY.Utility +{ + public class TxtHelper + { + static ReaderWriterLockSlim sucessLogWriteLockSlim = new ReaderWriterLockSlim(); + + /// + /// 写入TEXT文本 + /// + /// 文件名 + /// 内容 + /// 保存结果 + public static bool WriteTxt(string fullName, string content) + { + FileStream fs = null; + StreamWriter sw = null; + + try + { + string directory = fullName.Substring(0, fullName.LastIndexOf('\\')); + if (!Directory.Exists(directory)) + { + Directory.CreateDirectory(directory); + } + + sucessLogWriteLockSlim.EnterWriteLock();//加锁防止抢占 + if (!File.Exists(fullName)) + { + fs = new FileStream(fullName, FileMode.Create, FileAccess.Write); + sw = new StreamWriter(fs, Encoding.UTF8); + } + else + { + fs = new FileStream(fullName, FileMode.Append, FileAccess.Write); + sw = new StreamWriter(fs, Encoding.UTF8); + } + + sw.WriteLine(content); + + sw.Close(); + fs.Close(); + + return true; + } + catch (Exception ex) + { + sw?.Close(); + fs?.Close(); + + } + finally + { + sucessLogWriteLockSlim.ExitWriteLock(); + } + + return false; + } + + } +} diff --git a/JY.Utility/app.config b/JY.Utility/app.config new file mode 100644 index 0000000..fb45d0e --- /dev/null +++ b/JY.Utility/app.config @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/JY.Utility/packages.config b/JY.Utility/packages.config new file mode 100644 index 0000000..dfb4291 --- /dev/null +++ b/JY.Utility/packages.config @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PLCCommunication/App.config b/PLCCommunication/App.config new file mode 100644 index 0000000..4bfa005 --- /dev/null +++ b/PLCCommunication/App.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/PLCCommunication/Common/DemoUtils.cs b/PLCCommunication/Common/DemoUtils.cs new file mode 100644 index 0000000..2581cfc --- /dev/null +++ b/PLCCommunication/Common/DemoUtils.cs @@ -0,0 +1,103 @@ +using HslCommunication; +using HslCommunication.BasicFramework; +using HslCommunication.Core; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace PLCCommunication +{ + public class DemoUtils + { + public static readonly string IpAddressInputWrong = "IpAddress input wrong"; + + public static readonly string PortInputWrong = "Port input wrong"; + + public static readonly string SlotInputWrong = "Slot input wrong"; + + public static readonly string BaudRateInputWrong = "Baud rate input wrong"; + + public static readonly string DataBitsInputWrong = "Data bit input wrong"; + + public static readonly string StopBitInputWrong = "Stop bit input wrong"; + + public static void ReadResultRender(OperateResult result, string address, TextBox textBox) + { + if (result.IsSuccess) + { + textBox.AppendText(DateTime.Now.ToString("[HH:mm:ss] ") + $"[{address}] {result.Content}{Environment.NewLine}"); + return; + } + MessageBox.Show(DateTime.Now.ToString("[HH:mm:ss] ") + "[" + address + "] Read Failed " + Environment.NewLine + "Reason:" + result.ToMessageShowString()); + } + + public static void ReadResultRender(OperateResult result, string address, TextBox textBox) + { + string resTemp = string.Empty; + if (result.IsSuccess) + { + for (int i = 0; i < result.Content.Length; i++) + { + resTemp = string.Concat(resTemp, result.Content[i], ","); + } + string Result = resTemp.Substring(0, resTemp.Length - 1); + textBox.AppendText(DateTime.Now.ToString("[HH:mm:ss] ") + "[" + address + "] " + Result + Environment.NewLine); + } + else + { + MessageBox.Show(DateTime.Now.ToString("[HH:mm:ss] ") + "[" + address + "] Read Failed " + Environment.NewLine + "Reason:" + result.ToMessageShowString()); + } + } + + public static void WriteResultRender(OperateResult result, string address) + { + if (result.IsSuccess) + { + MessageBox.Show(DateTime.Now.ToString("[HH:mm:ss] ") + "[" + address + "] Write Success"); + return; + } + MessageBox.Show(DateTime.Now.ToString("[HH:mm:ss] ") + "[" + address + "] Write Failed " + Environment.NewLine + " Reason:" + result.ToMessageShowString()); + } + + public static void WriteResultRender(Func write, string address) + { + try + { + OperateResult result = write(); + if (result.IsSuccess) + { + MessageBox.Show(DateTime.Now.ToString("[HH:mm:ss] ") + "[" + address + "] Write Success"); + return; + } + MessageBox.Show(DateTime.Now.ToString("[HH:mm:ss] ") + "[" + address + "] Write Failed " + Environment.NewLine + " Reason:" + result.ToMessageShowString()); + } + catch (Exception ex) + { + MessageBox.Show("Data for writting is not corrent: " + ex.Message); + } + } + + public static void BulkReadRenderResult(IReadWriteNet readWrite, TextBox addTextBox, TextBox lengthTextBox, TextBox resultTextBox) + { + try + { + OperateResult read = readWrite.Read(addTextBox.Text, ushort.Parse(lengthTextBox.Text)); + if (read.IsSuccess) + { + resultTextBox.Text = "Result:" + SoftBasic.ByteToHexString(read.Content); + } + else + { + MessageBox.Show("Read Failed:" + read.ToMessageShowString()); + } + } + catch (Exception ex) + { + MessageBox.Show("Read Failed:" + ex.Message); + } + } + } +} diff --git a/PLCCommunication/Common/IniHelper.cs b/PLCCommunication/Common/IniHelper.cs new file mode 100644 index 0000000..a2db5cb --- /dev/null +++ b/PLCCommunication/Common/IniHelper.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace PLCCommunication +{ + public class IniHelper + { + public string path; + public IniHelper(string INIPath) + { + path = INIPath; + } + [DllImport("kernel32", CharSet = CharSet.Unicode)] + private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); + + [DllImport("kernel32", CharSet = CharSet.Unicode)] + private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath); + + [DllImport("kernel32", CharSet = CharSet.Unicode)] + private static extern int GetPrivateProfileString(string section, string key, string defVal, byte[] retVal, int size, string filePath); + public void IniWriteValue(string Section, string Key, string Value) + { + WritePrivateProfileString(Section, Key, Value, path); + } + public string IniReadValue(string Section, string Key) + { + try + { + StringBuilder temp = new StringBuilder(255); + int i = GetPrivateProfileString(Section, Key, "", temp, 255, path); + return temp.ToString(); + } + catch (Exception) + { + return null; + } + } + public byte[] IniReadValues(string section, string key) + { + byte[] temp = new byte[255]; + int i = GetPrivateProfileString(section, key, "", temp, 255, path); + return temp; + } + + public void ClearAllSection() + { + IniWriteValue(null, null, null); + } + + public void ClearSection(string Section) + { + IniWriteValue(Section, null, null); + } + } + +} diff --git a/PLCCommunication/Entity/DataFormatType.cs b/PLCCommunication/Entity/DataFormatType.cs new file mode 100644 index 0000000..ae69433 --- /dev/null +++ b/PLCCommunication/Entity/DataFormatType.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PLCCommunication +{ + public enum DataFormatType + { + /// + /// 按照顺序排序 + /// + ABCD, + /// + /// 按照单字反转 + /// + BADC, + /// + /// 按照双字反转 + /// + CDAB, + /// + /// 按照倒序排序 + /// + DCBA + } +} + diff --git a/PLCCommunication/Entity/PLCConfig.cs b/PLCCommunication/Entity/PLCConfig.cs new file mode 100644 index 0000000..3477665 --- /dev/null +++ b/PLCCommunication/Entity/PLCConfig.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PLCCommunication +{ + [Serializable] + public class PLCConfig + { + /// + /// + /// + public int Index; + /// + /// PLC IP地址 + /// + public string IP; + /// + /// PLC端口号 + /// + public int Port; + /// + /// + /// + public int JobCount; + /// + /// 是否启用心跳消息 + /// + public bool HeartBeat; + /// + /// 心跳设置地址 + /// + public string HeartAddr; + /// + /// 扫描间隔时间 + /// + public int ScanTime; + /// + /// 上位机的节点地址,假如你的电脑的Ip地址为192.168.1.30,那么这个值就是30 + /// + public int SA1; + /// + /// PLC的插槽号,通常都为0 + /// + public int Solt; + /// + /// 如果设置为True,当数据读取失败的时候,会自动变更当前的SA1值,会选择自动增加,但不会和DA1一致,本值需要在对象实例化之后立即设置。 + /// + public bool ChangeSA1; + /// + /// 获取或设置在解析字符串的时候是否将字节按照字单位反转,获取或设置数据解析的格式,可选ABCD, BADC,CDAB,DCBA格式 + /// + public int DataFormat; + + public List lstTgrParams; + } +} diff --git a/PLCCommunication/Entity/TriggerParams.cs b/PLCCommunication/Entity/TriggerParams.cs new file mode 100644 index 0000000..24ddf38 --- /dev/null +++ b/PLCCommunication/Entity/TriggerParams.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PLCCommunication +{ + public class TriggerParams + { + public int Index; + + public string ThreadName; + + public string TriggerAddr; + + public string TriggerCmd; + + public VarType TriggerType; + + public string ResultAddr; + + public VarType ResultType; + + public bool IsRead; + + public string ReadAddr; + + public int ReadLength; + + public VarType ReadType; + } +} diff --git a/PLCCommunication/Entity/VarType.cs b/PLCCommunication/Entity/VarType.cs new file mode 100644 index 0000000..6045d55 --- /dev/null +++ b/PLCCommunication/Entity/VarType.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PLCCommunication +{ + public enum VarType + { + Bit, + Short, + Int, + Float, + String, + Byte + } + + +} diff --git a/PLCCommunication/FrmOmronPLCCom.Designer.cs b/PLCCommunication/FrmOmronPLCCom.Designer.cs new file mode 100644 index 0000000..a4ca8fa --- /dev/null +++ b/PLCCommunication/FrmOmronPLCCom.Designer.cs @@ -0,0 +1,86 @@ + +namespace PLCCommunication +{ + partial class FrmOmronPLCCom + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows 窗体设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.tabCt_MePlcUI = new System.Windows.Forms.TabControl(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.tabCt_MePlcUI.SuspendLayout(); + this.SuspendLayout(); + // + // tabCt_MePlcUI + // + this.tabCt_MePlcUI.Controls.Add(this.tabPage1); + this.tabCt_MePlcUI.Dock = System.Windows.Forms.DockStyle.Fill; + this.tabCt_MePlcUI.ItemSize = new System.Drawing.Size(85, 28); + this.tabCt_MePlcUI.Location = new System.Drawing.Point(0, 0); + this.tabCt_MePlcUI.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.tabCt_MePlcUI.Name = "tabCt_MePlcUI"; + this.tabCt_MePlcUI.SelectedIndex = 0; + this.tabCt_MePlcUI.Size = new System.Drawing.Size(1828, 974); + this.tabCt_MePlcUI.SizeMode = System.Windows.Forms.TabSizeMode.Fixed; + this.tabCt_MePlcUI.TabIndex = 1; + // + // tabPage1 + // + this.tabPage1.Location = new System.Drawing.Point(4, 32); + this.tabPage1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.tabPage1.Size = new System.Drawing.Size(1820, 938); + this.tabPage1.TabIndex = 0; + this.tabPage1.Text = "1#通讯块"; + this.tabPage1.UseVisualStyleBackColor = true; + // + // FrmOmronPLCCom + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.White; + this.ClientSize = new System.Drawing.Size(1828, 974); + this.Controls.Add(this.tabCt_MePlcUI); + this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.MaximizeBox = false; + this.Name = "FrmOmronPLCCom"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "欧姆龙PLC通讯"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmOmronPLCCom_FormClosing); + this.tabCt_MePlcUI.ResumeLayout(false); + this.ResumeLayout(false); + + } + + + #endregion + private System.Windows.Forms.TabControl tabCt_MePlcUI; + private System.Windows.Forms.TabPage tabPage1; + + } +} + diff --git a/PLCCommunication/FrmOmronPLCCom.cs b/PLCCommunication/FrmOmronPLCCom.cs new file mode 100644 index 0000000..a7ab8c1 --- /dev/null +++ b/PLCCommunication/FrmOmronPLCCom.cs @@ -0,0 +1,217 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace PLCCommunication +{ + public partial class FrmOmronPLCCom : Form + { + /// + /// 定义MelsecPLCUI自定义控件List集合 + /// + public List lstMcUI = new List(); + /// + /// 配置文件实体类 + /// + private List lstPLCConfig = new List(); + /// + /// PLC读取寄存器配置文件 + /// + private string ConfigPath = Path.Combine(System.Windows.Forms.Application.StartupPath, "Config\\PlcConfig.ini"); + + /// + /// 加载lstMcUI窗口次数 + /// + private int ComCount; + + public FrmOmronPLCCom(string path) + { + InitializeComponent(); + ConfigPath = path; + ComCount = int.Parse(new IniHelper(ConfigPath).IniReadValue("SystemConfig", "ComCount")); + ReadPlcConfig(ComCount); + LoadUI(ComCount); + } + + + /// + /// 读取配置文件 + /// + /// + public void ReadPlcConfig(int Count) + { + try + { + for (int j = 0; j < Count; j++) + { + PLCConfig plcConfig = new PLCConfig(); + plcConfig.Index = j + 1; + plcConfig.IP = new IniHelper(ConfigPath).IniReadValue(plcConfig.Index + "#PLCParameter", "IP"); + plcConfig.Port = int.Parse(new IniHelper(ConfigPath).IniReadValue(plcConfig.Index + "#PLCParameter", "Port")); + plcConfig.JobCount = int.Parse(new IniHelper(ConfigPath).IniReadValue(plcConfig.Index + "#PLCParameter", "JobCount")); + plcConfig.HeartBeat = bool.Parse(new IniHelper(ConfigPath).IniReadValue(plcConfig.Index + "#PLCParameter", "HeartBeat")); + plcConfig.HeartAddr = new IniHelper(ConfigPath).IniReadValue(plcConfig.Index + "#PLCParameter", "HeartAddr"); + plcConfig.ScanTime = int.Parse(new IniHelper(ConfigPath).IniReadValue(plcConfig.Index + "#PLCParameter", "ScanTime")); + plcConfig.Solt = int.Parse(new IniHelper(ConfigPath).IniReadValue(plcConfig.Index + "#PLCParameter", "Solt")); + List lstTgrParamsTemp = new List(); + for (int i = 0; i < plcConfig.JobCount; i++) + { + TriggerParams trigger = new TriggerParams(); + trigger.Index = i + 1; + trigger.ThreadName=new IniHelper(ConfigPath).IniReadValue(plcConfig.Index + "#PLCParameter", i + 1 + "#ThreadName"); + trigger.TriggerAddr = new IniHelper(ConfigPath).IniReadValue(plcConfig.Index + "#PLCParameter", i + 1 + "#RecvAddr"); + string recvType = new IniHelper(ConfigPath).IniReadValue(plcConfig.Index + "#PLCParameter", i + 1 + "#RecvType"); + trigger.TriggerType = (VarType)Enum.Parse(typeof(VarType), recvType, false); + string bb = new IniHelper(ConfigPath).IniReadValue(plcConfig.Index + "#PLCParameter", i + 1 + "#IsRead"); + + if (bb == "True") + { + trigger.IsRead = true; + } + else + { + trigger.IsRead = false; + } + + trigger.ReadAddr = new IniHelper(ConfigPath).IniReadValue(plcConfig.Index + "#PLCParameter", i + 1 + "#ReadAddr"); + trigger.ReadLength =Convert.ToInt16(new IniHelper(ConfigPath).IniReadValue(plcConfig.Index + "#PLCParameter", i + 1 + "#ReadLength")); + string readType = new IniHelper(ConfigPath).IniReadValue(plcConfig.Index + "#PLCParameter", i + 1 + "#ReadType"); + trigger.ReadType = (VarType)Enum.Parse(typeof(VarType), readType, false); + trigger.TriggerCmd = new IniHelper(ConfigPath).IniReadValue(plcConfig.Index + "#PLCParameter", i + 1 + "#TriggerCmd"); + trigger.ResultAddr = new IniHelper(ConfigPath).IniReadValue(plcConfig.Index + "#PLCParameter", i + 1 + "#WriteAddr"); + string writeype = new IniHelper(ConfigPath).IniReadValue(plcConfig.Index + "#PLCParameter", i + 1 + "#WriteType"); + trigger.ResultType = (VarType)Enum.Parse(typeof(VarType), writeype, false); + lstTgrParamsTemp.Add(trigger); + } + plcConfig.lstTgrParams = lstTgrParamsTemp; + lstPLCConfig.Add(plcConfig); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + } + } + + + /// + /// 加载MelsecPLCUI窗口 + /// + /// + public void LoadUI(int Count) + { + tabCt_MePlcUI.TabPages.Clear(); + for (int i = 0; i < Count; i++) + { + tabCt_MePlcUI.TabPages.Add(i + 1 + "#通讯模块"); + Panel panelUI = new Panel(); + panelUI.Dock = DockStyle.Fill; + tabCt_MePlcUI.TabPages[i].Controls.Add(panelUI); + OmronPLCUI plcUI = new OmronPLCUI(lstPLCConfig[i]); + plcUI.Dock = DockStyle.Fill; + plcUI.SaveParamsEvent += plcUI_SaveParamsEvent; + lstMcUI.Add(plcUI); + panelUI.Controls.Add(plcUI); + } + } + + + #region 参数保存 + /// + /// 循环保存参数 + /// + /// + /// + private void plcUI_SaveParamsEvent(int plcIndex, int trgIndex) + { + if (trgIndex == 0) + { + for (int i = 0; i < lstMcUI[plcIndex - 1].JobCount; i++) + { + SaveTrgParam(plcIndex, i + 1, lstMcUI[plcIndex - 1].lstTrgUI[i].TrgParams); + } + SavePLCParam(plcIndex); + } + else + { + SaveTrgParam(plcIndex, trgIndex, lstMcUI[plcIndex - 1].lstTrgUI[trgIndex - 1].TrgParams); + } + } + /// + /// 界面设置参数写入到配置文件 + /// + /// + /// + /// + public void SaveTrgParam(int plcIndex, int trgIndex, TriggerParams triggerParams) + { + new IniHelper(ConfigPath).IniWriteValue(plcIndex + "#PLCParameter", trgIndex + "#RecvAddr", triggerParams.TriggerAddr); + new IniHelper(ConfigPath).IniWriteValue(plcIndex + "#PLCParameter", trgIndex + "#RecvType", triggerParams.TriggerType.ToString()); + new IniHelper(ConfigPath).IniWriteValue(plcIndex + "#PLCParameter", trgIndex + "#WriteAddr", triggerParams.ResultAddr); + new IniHelper(ConfigPath).IniWriteValue(plcIndex + "#PLCParameter", trgIndex + "#WriteType", triggerParams.ResultType.ToString()); + new IniHelper(ConfigPath).IniWriteValue(plcIndex + "#PLCParameter", trgIndex + "#TriggerCmd", triggerParams.TriggerCmd); + if (triggerParams.IsRead) + { + new IniHelper(ConfigPath).IniWriteValue(plcIndex + "#PLCParameter", trgIndex + "#IsRead", "True"); + } + else + { + new IniHelper(ConfigPath).IniWriteValue(plcIndex + "#PLCParameter", trgIndex + "#IsRead", "False"); + } + new IniHelper(ConfigPath).IniWriteValue(plcIndex + "#PLCParameter", trgIndex + "#IsRead", triggerParams.IsRead==true?"True":"False"); + new IniHelper(ConfigPath).IniWriteValue(plcIndex + "#PLCParameter", trgIndex + "#ReadAddr", triggerParams.ReadAddr); + new IniHelper(ConfigPath).IniWriteValue(plcIndex + "#PLCParameter", trgIndex + "#ReadType", triggerParams.ReadType.ToString()); + new IniHelper(ConfigPath).IniWriteValue(plcIndex + "#PLCParameter", trgIndex + "#ReadLength", triggerParams.ReadLength.ToString()); + } + + /// + /// + /// + /// + public void SavePLCParam(int plcIndex) + { + new IniHelper(ConfigPath).IniWriteValue(plcIndex + "#PLCParameter", "Index", lstMcUI[plcIndex - 1].PlcConfig.Index.ToString()); + new IniHelper(ConfigPath).IniWriteValue(plcIndex + "#PLCParameter", "IP", lstMcUI[plcIndex - 1].PlcConfig.IP.ToString()); + new IniHelper(ConfigPath).IniWriteValue(plcIndex + "#PLCParameter", "Port", lstMcUI[plcIndex - 1].PlcConfig.Port.ToString()); + new IniHelper(ConfigPath).IniWriteValue(plcIndex + "#PLCParameter", "JobCount", lstMcUI[plcIndex - 1].PlcConfig.JobCount.ToString()); + new IniHelper(ConfigPath).IniWriteValue(plcIndex + "#PLCParameter", "HeartBeat", lstMcUI[plcIndex - 1].PlcConfig.HeartBeat.ToString()); + new IniHelper(ConfigPath).IniWriteValue(plcIndex + "#PLCParameter", "HeartAddr", lstMcUI[plcIndex - 1].PlcConfig.HeartAddr.ToString()); + new IniHelper(ConfigPath).IniWriteValue(plcIndex + "#PLCParameter", "ScanTime", lstMcUI[plcIndex - 1].PlcConfig.ScanTime.ToString()); + new IniHelper(ConfigPath).IniWriteValue(plcIndex + "#PLCParameter", "Solt", lstMcUI[plcIndex - 1].PlcConfig.Solt.ToString()); + } + + #endregion + + /// + /// 关闭lstMcUI窗口 + /// + public void ShutDown() + { + for (int i = 0; i < ComCount; i++) + { + if (lstMcUI[i] != null) + { + lstMcUI[i].Shutdown(); + } + } + } + + /// + /// 关闭本窗口 + /// + /// + /// + private void FrmOmronPLCCom_FormClosing(object sender, FormClosingEventArgs e) + { + this.Visible = false; + e.Cancel = true; + } + } +} diff --git a/PLCCommunication/FrmOmronPLCCom.resx b/PLCCommunication/FrmOmronPLCCom.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/PLCCommunication/FrmOmronPLCCom.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/PLCCommunication/OmronPLCUI.Designer.cs b/PLCCommunication/OmronPLCUI.Designer.cs new file mode 100644 index 0000000..5cb15b4 --- /dev/null +++ b/PLCCommunication/OmronPLCUI.Designer.cs @@ -0,0 +1,848 @@ + +using System.Windows.Forms; + +namespace PLCCommunication +{ + partial class OmronPLCUI + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(OmronPLCUI)); + this.label2 = new System.Windows.Forms.Label(); + this.txtReadTestLength = new System.Windows.Forms.TextBox(); + this.txtWriteValue = new System.Windows.Forms.TextBox(); + this.cbTest = new System.Windows.Forms.CheckBox(); + this.label9 = new System.Windows.Forms.Label(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.lstResWrite = new System.Windows.Forms.ListView(); + this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.imageList1 = new System.Windows.Forms.ImageList(this.components); + this.lstSend = new System.Windows.Forms.ListView(); + this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.btnClearRecv = new System.Windows.Forms.Button(); + this.cbDispCurrent = new System.Windows.Forms.CheckBox(); + this.lstTrgCmd = new System.Windows.Forms.ListView(); + this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.lstRecv = new System.Windows.Forms.ListView(); + this.InfoTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.InfoContent = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.button1 = new System.Windows.Forms.Button(); + this.txtReadResultTest = new System.Windows.Forms.TextBox(); + this.panel1 = new System.Windows.Forms.Panel(); + this.txtSolt = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.btnStart = new System.Windows.Forms.Button(); + this.btnSaveConfig = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.txtPort = new System.Windows.Forms.TextBox(); + this.label26 = new System.Windows.Forms.Label(); + this.txtIP = new System.Windows.Forms.TextBox(); + this.label27 = new System.Windows.Forms.Label(); + this.BtnDisConnect = new System.Windows.Forms.Button(); + this.BtnConnect = new System.Windows.Forms.Button(); + this.PanelTest = new System.Windows.Forms.Panel(); + this.lblTip = new System.Windows.Forms.Label(); + this.BtnWriteTest = new System.Windows.Forms.Button(); + this.label7 = new System.Windows.Forms.Label(); + this.cboReadType = new System.Windows.Forms.ComboBox(); + this.txtReadAddrTest = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.BtnReadTest = new System.Windows.Forms.Button(); + this.gb_RWTest = new System.Windows.Forms.GroupBox(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.label3 = new System.Windows.Forms.Label(); + this.txtHeartAddr = new System.Windows.Forms.TextBox(); + this.cbHeartBeat = new System.Windows.Forms.CheckBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.tabConTrgUI = new System.Windows.Forms.TabControl(); + this.skinTabPage1 = new System.Windows.Forms.TabPage(); + this.skinTabPage2 = new System.Windows.Forms.TabPage(); + this.lblConnectStatus = new System.Windows.Forms.PictureBox(); + this.groupBox3.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.panel1.SuspendLayout(); + this.PanelTest.SuspendLayout(); + this.gb_RWTest.SuspendLayout(); + this.groupBox4.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.tabConTrgUI.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.lblConnectStatus)).BeginInit(); + this.SuspendLayout(); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("黑体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label2.Location = new System.Drawing.Point(8, 198); + this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(89, 20); + this.label2.TabIndex = 24; + this.label2.Text = "写入值:"; + // + // txtReadTestLength + // + this.txtReadTestLength.Font = new System.Drawing.Font("黑体", 12.75F); + this.txtReadTestLength.Location = new System.Drawing.Point(505, 124); + this.txtReadTestLength.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txtReadTestLength.Name = "txtReadTestLength"; + this.txtReadTestLength.Size = new System.Drawing.Size(153, 32); + this.txtReadTestLength.TabIndex = 22; + this.txtReadTestLength.Text = "1"; + // + // txtWriteValue + // + this.txtWriteValue.Font = new System.Drawing.Font("宋体", 12F); + this.txtWriteValue.Location = new System.Drawing.Point(111, 194); + this.txtWriteValue.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txtWriteValue.Name = "txtWriteValue"; + this.txtWriteValue.Size = new System.Drawing.Size(357, 30); + this.txtWriteValue.TabIndex = 23; + this.txtWriteValue.Text = "1"; + // + // cbTest + // + this.cbTest.AutoSize = true; + this.cbTest.Location = new System.Drawing.Point(156, 0); + this.cbTest.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.cbTest.Name = "cbTest"; + this.cbTest.Size = new System.Drawing.Size(66, 21); + this.cbTest.TabIndex = 13; + this.cbTest.Text = "测试"; + this.cbTest.UseVisualStyleBackColor = true; + this.cbTest.CheckedChanged += new System.EventHandler(this.cbTest_CheckedChanged); + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Location = new System.Drawing.Point(501, 88); + this.label9.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(120, 22); + this.label9.TabIndex = 25; + this.label9.Text = "读取长度:"; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.lstResWrite); + this.groupBox3.Controls.Add(this.lstSend); + this.groupBox3.Font = new System.Drawing.Font("黑体", 10F); + this.groupBox3.Location = new System.Drawing.Point(727, 372); + this.groupBox3.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.groupBox3.Size = new System.Drawing.Size(1085, 474); + this.groupBox3.TabIndex = 18; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "发送显示"; + // + // lstResWrite + // + this.lstResWrite.BackColor = System.Drawing.SystemColors.Control; + this.lstResWrite.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader5, + this.columnHeader6}); + this.lstResWrite.Font = new System.Drawing.Font("宋体", 9F); + this.lstResWrite.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; + this.lstResWrite.HideSelection = false; + this.lstResWrite.Location = new System.Drawing.Point(516, 16); + this.lstResWrite.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.lstResWrite.Name = "lstResWrite"; + this.lstResWrite.Size = new System.Drawing.Size(551, 449); + this.lstResWrite.SmallImageList = this.imageList1; + this.lstResWrite.TabIndex = 23; + this.lstResWrite.UseCompatibleStateImageBehavior = false; + this.lstResWrite.View = System.Windows.Forms.View.Details; + // + // columnHeader5 + // + this.columnHeader5.Width = 220; + // + // columnHeader6 + // + this.columnHeader6.Width = 600; + // + // imageList1 + // + this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream"))); + this.imageList1.TransparentColor = System.Drawing.Color.Transparent; + this.imageList1.Images.SetKeyName(0, "info.png"); + this.imageList1.Images.SetKeyName(1, "error.png"); + // + // lstSend + // + this.lstSend.BackColor = System.Drawing.SystemColors.Control; + this.lstSend.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader1, + this.columnHeader2}); + this.lstSend.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lstSend.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; + this.lstSend.HideSelection = false; + this.lstSend.Location = new System.Drawing.Point(3, 16); + this.lstSend.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.lstSend.Name = "lstSend"; + this.lstSend.Size = new System.Drawing.Size(504, 449); + this.lstSend.SmallImageList = this.imageList1; + this.lstSend.TabIndex = 22; + this.lstSend.UseCompatibleStateImageBehavior = false; + this.lstSend.View = System.Windows.Forms.View.Details; + // + // columnHeader1 + // + this.columnHeader1.Width = 220; + // + // columnHeader2 + // + this.columnHeader2.Width = 400; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.btnClearRecv); + this.groupBox2.Controls.Add(this.cbDispCurrent); + this.groupBox2.Controls.Add(this.lstTrgCmd); + this.groupBox2.Controls.Add(this.lstRecv); + this.groupBox2.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.groupBox2.Font = new System.Drawing.Font("黑体", 10F); + this.groupBox2.Location = new System.Drawing.Point(727, 71); + this.groupBox2.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.groupBox2.Size = new System.Drawing.Size(1085, 294); + this.groupBox2.TabIndex = 17; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "接收显示"; + // + // btnClearRecv + // + this.btnClearRecv.BackColor = System.Drawing.SystemColors.ControlDark; + this.btnClearRecv.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnClearRecv.Font = new System.Drawing.Font("黑体", 9F); + this.btnClearRecv.Location = new System.Drawing.Point(257, -4); + this.btnClearRecv.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnClearRecv.Name = "btnClearRecv"; + this.btnClearRecv.Size = new System.Drawing.Size(104, 28); + this.btnClearRecv.TabIndex = 22; + this.btnClearRecv.Text = "清空接收"; + this.btnClearRecv.UseVisualStyleBackColor = false; + this.btnClearRecv.Click += new System.EventHandler(this.btnClearRecv_Click); + // + // cbDispCurrent + // + this.cbDispCurrent.AutoSize = true; + this.cbDispCurrent.Location = new System.Drawing.Point(115, 0); + this.cbDispCurrent.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.cbDispCurrent.Name = "cbDispCurrent"; + this.cbDispCurrent.Size = new System.Drawing.Size(102, 21); + this.cbDispCurrent.TabIndex = 23; + this.cbDispCurrent.Text = "显示实时"; + this.cbDispCurrent.UseVisualStyleBackColor = true; + this.cbDispCurrent.CheckedChanged += new System.EventHandler(this.cbDispCurrent_CheckedChanged); + // + // lstTrgCmd + // + this.lstTrgCmd.BackColor = System.Drawing.SystemColors.Control; + this.lstTrgCmd.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader3, + this.columnHeader4}); + this.lstTrgCmd.Font = new System.Drawing.Font("宋体", 9F); + this.lstTrgCmd.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; + this.lstTrgCmd.HideSelection = false; + this.lstTrgCmd.Location = new System.Drawing.Point(515, 28); + this.lstTrgCmd.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.lstTrgCmd.Name = "lstTrgCmd"; + this.lstTrgCmd.Size = new System.Drawing.Size(561, 258); + this.lstTrgCmd.SmallImageList = this.imageList1; + this.lstTrgCmd.TabIndex = 22; + this.lstTrgCmd.UseCompatibleStateImageBehavior = false; + this.lstTrgCmd.View = System.Windows.Forms.View.Details; + // + // columnHeader3 + // + this.columnHeader3.Width = 220; + // + // columnHeader4 + // + this.columnHeader4.Width = 600; + // + // lstRecv + // + this.lstRecv.BackColor = System.Drawing.SystemColors.Control; + this.lstRecv.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.InfoTime, + this.InfoContent}); + this.lstRecv.Font = new System.Drawing.Font("宋体", 9F); + this.lstRecv.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; + this.lstRecv.HideSelection = false; + this.lstRecv.Location = new System.Drawing.Point(8, 28); + this.lstRecv.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.lstRecv.Name = "lstRecv"; + this.lstRecv.Size = new System.Drawing.Size(499, 258); + this.lstRecv.SmallImageList = this.imageList1; + this.lstRecv.TabIndex = 21; + this.lstRecv.UseCompatibleStateImageBehavior = false; + this.lstRecv.View = System.Windows.Forms.View.Details; + // + // InfoTime + // + this.InfoTime.Width = 220; + // + // InfoContent + // + this.InfoContent.Width = 400; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(1004, 0); + this.button1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(139, 44); + this.button1.TabIndex = 34; + this.button1.Text = "启动"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Visible = false; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // txtReadResultTest + // + this.txtReadResultTest.Font = new System.Drawing.Font("宋体", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtReadResultTest.Location = new System.Drawing.Point(111, 54); + this.txtReadResultTest.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txtReadResultTest.Multiline = true; + this.txtReadResultTest.Name = "txtReadResultTest"; + this.txtReadResultTest.Size = new System.Drawing.Size(365, 105); + this.txtReadResultTest.TabIndex = 19; + // + // panel1 + // + this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panel1.Controls.Add(this.lblConnectStatus); + this.panel1.Controls.Add(this.button1); + this.panel1.Controls.Add(this.txtSolt); + this.panel1.Controls.Add(this.label4); + this.panel1.Controls.Add(this.btnStart); + this.panel1.Controls.Add(this.btnSaveConfig); + this.panel1.Controls.Add(this.label1); + this.panel1.Controls.Add(this.txtPort); + this.panel1.Controls.Add(this.label26); + this.panel1.Controls.Add(this.txtIP); + this.panel1.Controls.Add(this.label27); + this.panel1.Controls.Add(this.BtnDisConnect); + this.panel1.Controls.Add(this.BtnConnect); + this.panel1.Font = new System.Drawing.Font("宋体", 9F); + this.panel1.Location = new System.Drawing.Point(16, 5); + this.panel1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(1795, 56); + this.panel1.TabIndex = 15; + // + // txtSolt + // + this.txtSolt.Font = new System.Drawing.Font("黑体", 12.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtSolt.Location = new System.Drawing.Point(508, 15); + this.txtSolt.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txtSolt.Name = "txtSolt"; + this.txtSolt.Size = new System.Drawing.Size(71, 32); + this.txtSolt.TabIndex = 26; + this.txtSolt.Text = "0"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Font = new System.Drawing.Font("黑体", 12.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label4.Location = new System.Drawing.Point(417, 20); + this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(76, 22); + this.label4.TabIndex = 25; + this.label4.Text = "Solt:"; + this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // btnStart + // + this.btnStart.Font = new System.Drawing.Font("黑体", 12.75F); + this.btnStart.Location = new System.Drawing.Point(787, 5); + this.btnStart.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnStart.Name = "btnStart"; + this.btnStart.Size = new System.Drawing.Size(127, 44); + this.btnStart.TabIndex = 24; + this.btnStart.Text = "启动"; + this.btnStart.UseVisualStyleBackColor = true; + this.btnStart.Click += new System.EventHandler(this.btnStart_Click); + // + // btnSaveConfig + // + this.btnSaveConfig.Font = new System.Drawing.Font("黑体", 12.75F); + this.btnSaveConfig.Location = new System.Drawing.Point(617, 5); + this.btnSaveConfig.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnSaveConfig.Name = "btnSaveConfig"; + this.btnSaveConfig.Size = new System.Drawing.Size(127, 44); + this.btnSaveConfig.TabIndex = 23; + this.btnSaveConfig.Text = "保存配置"; + this.btnSaveConfig.UseVisualStyleBackColor = true; + this.btnSaveConfig.Click += new System.EventHandler(this.btnSaveConfig_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("黑体", 10F); + this.label1.Location = new System.Drawing.Point(1169, 15); + this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(98, 17); + this.label1.TabIndex = 20; + this.label1.Text = "连接状态:"; + // + // txtPort + // + this.txtPort.Font = new System.Drawing.Font("黑体", 12.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtPort.Location = new System.Drawing.Point(319, 15); + this.txtPort.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txtPort.Name = "txtPort"; + this.txtPort.Size = new System.Drawing.Size(71, 32); + this.txtPort.TabIndex = 19; + this.txtPort.Text = "44818"; + // + // label26 + // + this.label26.AutoSize = true; + this.label26.Font = new System.Drawing.Font("黑体", 12.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label26.Location = new System.Drawing.Point(252, 22); + this.label26.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label26.Name = "label26"; + this.label26.Size = new System.Drawing.Size(76, 22); + this.label26.TabIndex = 18; + this.label26.Text = "端口:"; + // + // txtIP + // + this.txtIP.Font = new System.Drawing.Font("黑体", 12.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtIP.Location = new System.Drawing.Point(84, 15); + this.txtIP.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txtIP.Name = "txtIP"; + this.txtIP.Size = new System.Drawing.Size(159, 32); + this.txtIP.TabIndex = 17; + this.txtIP.Text = "192.168.1.50"; + // + // label27 + // + this.label27.AutoSize = true; + this.label27.Font = new System.Drawing.Font("黑体", 12.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label27.Location = new System.Drawing.Point(0, 20); + this.label27.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label27.Name = "label27"; + this.label27.Size = new System.Drawing.Size(98, 22); + this.label27.TabIndex = 16; + this.label27.Text = "IP地址:"; + this.label27.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // BtnDisConnect + // + this.BtnDisConnect.Enabled = false; + this.BtnDisConnect.Font = new System.Drawing.Font("黑体", 12.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.BtnDisConnect.Location = new System.Drawing.Point(1611, 4); + this.BtnDisConnect.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.BtnDisConnect.Name = "BtnDisConnect"; + this.BtnDisConnect.Size = new System.Drawing.Size(127, 44); + this.BtnDisConnect.TabIndex = 5; + this.BtnDisConnect.Text = "断开连接"; + this.BtnDisConnect.UseVisualStyleBackColor = true; + this.BtnDisConnect.Click += new System.EventHandler(this.BtnDisConnect_Click); + // + // BtnConnect + // + this.BtnConnect.Font = new System.Drawing.Font("黑体", 12.75F); + this.BtnConnect.Location = new System.Drawing.Point(1459, 4); + this.BtnConnect.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.BtnConnect.Name = "BtnConnect"; + this.BtnConnect.Size = new System.Drawing.Size(127, 44); + this.BtnConnect.TabIndex = 4; + this.BtnConnect.Text = "开始连接"; + this.BtnConnect.UseVisualStyleBackColor = true; + this.BtnConnect.Click += new System.EventHandler(this.BtnConnect_Click); + // + // PanelTest + // + this.PanelTest.Controls.Add(this.txtWriteValue); + this.PanelTest.Controls.Add(this.lblTip); + this.PanelTest.Controls.Add(this.label9); + this.PanelTest.Controls.Add(this.label2); + this.PanelTest.Controls.Add(this.txtReadTestLength); + this.PanelTest.Controls.Add(this.txtReadResultTest); + this.PanelTest.Controls.Add(this.BtnWriteTest); + this.PanelTest.Controls.Add(this.label7); + this.PanelTest.Controls.Add(this.cboReadType); + this.PanelTest.Controls.Add(this.txtReadAddrTest); + this.PanelTest.Controls.Add(this.label6); + this.PanelTest.Controls.Add(this.BtnReadTest); + this.PanelTest.Font = new System.Drawing.Font("黑体", 12.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.PanelTest.Location = new System.Drawing.Point(8, 36); + this.PanelTest.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.PanelTest.Name = "PanelTest"; + this.PanelTest.Size = new System.Drawing.Size(681, 246); + this.PanelTest.TabIndex = 1; + // + // lblTip + // + this.lblTip.AutoSize = true; + this.lblTip.Location = new System.Drawing.Point(108, 169); + this.lblTip.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblTip.Name = "lblTip"; + this.lblTip.Size = new System.Drawing.Size(252, 22); + this.lblTip.TabIndex = 26; + this.lblTip.Text = "(多个写入时用\',\'隔开)"; + // + // BtnWriteTest + // + this.BtnWriteTest.Location = new System.Drawing.Point(500, 194); + this.BtnWriteTest.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.BtnWriteTest.Name = "BtnWriteTest"; + this.BtnWriteTest.Size = new System.Drawing.Size(160, 38); + this.BtnWriteTest.TabIndex = 21; + this.BtnWriteTest.Text = "写入"; + this.BtnWriteTest.UseVisualStyleBackColor = true; + this.BtnWriteTest.Click += new System.EventHandler(this.BtnWriteTest_Click); + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Font = new System.Drawing.Font("黑体", 12F); + this.label7.Location = new System.Drawing.Point(23, 64); + this.label7.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(69, 20); + this.label7.TabIndex = 18; + this.label7.Text = "结果:"; + // + // cboReadType + // + this.cboReadType.FormattingEnabled = true; + this.cboReadType.Location = new System.Drawing.Point(316, 14); + this.cboReadType.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.cboReadType.Name = "cboReadType"; + this.cboReadType.Size = new System.Drawing.Size(160, 29); + this.cboReadType.TabIndex = 17; + // + // txtReadAddrTest + // + this.txtReadAddrTest.Font = new System.Drawing.Font("黑体", 12.75F); + this.txtReadAddrTest.Location = new System.Drawing.Point(112, 14); + this.txtReadAddrTest.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txtReadAddrTest.Name = "txtReadAddrTest"; + this.txtReadAddrTest.Size = new System.Drawing.Size(175, 32); + this.txtReadAddrTest.TabIndex = 16; + this.txtReadAddrTest.Text = "W1000"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Font = new System.Drawing.Font("黑体", 12F); + this.label6.Location = new System.Drawing.Point(23, 16); + this.label6.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(69, 20); + this.label6.TabIndex = 15; + this.label6.Text = "地址:"; + // + // BtnReadTest + // + this.BtnReadTest.Font = new System.Drawing.Font("黑体", 12.75F); + this.BtnReadTest.Location = new System.Drawing.Point(505, 8); + this.BtnReadTest.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.BtnReadTest.Name = "BtnReadTest"; + this.BtnReadTest.Size = new System.Drawing.Size(159, 39); + this.BtnReadTest.TabIndex = 20; + this.BtnReadTest.Text = "读取"; + this.BtnReadTest.UseVisualStyleBackColor = true; + this.BtnReadTest.Click += new System.EventHandler(this.BtnReadTest_Click); + // + // gb_RWTest + // + this.gb_RWTest.Controls.Add(this.PanelTest); + this.gb_RWTest.Controls.Add(this.cbTest); + this.gb_RWTest.Font = new System.Drawing.Font("黑体", 10F); + this.gb_RWTest.Location = new System.Drawing.Point(16, 70); + this.gb_RWTest.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.gb_RWTest.Name = "gb_RWTest"; + this.gb_RWTest.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.gb_RWTest.Size = new System.Drawing.Size(703, 295); + this.gb_RWTest.TabIndex = 16; + this.gb_RWTest.TabStop = false; + this.gb_RWTest.Text = "读写测试"; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.label3); + this.groupBox4.Controls.Add(this.txtHeartAddr); + this.groupBox4.Controls.Add(this.cbHeartBeat); + this.groupBox4.Font = new System.Drawing.Font("黑体", 10F); + this.groupBox4.Location = new System.Drawing.Point(16, 781); + this.groupBox4.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.groupBox4.Size = new System.Drawing.Size(703, 65); + this.groupBox4.TabIndex = 20; + this.groupBox4.TabStop = false; + this.groupBox4.Text = "心跳包设置"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("黑体", 10F); + this.label3.Location = new System.Drawing.Point(44, 31); + this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(116, 17); + this.label3.TabIndex = 25; + this.label3.Text = "心跳包地址:"; + // + // txtHeartAddr + // + this.txtHeartAddr.Font = new System.Drawing.Font("黑体", 12.75F); + this.txtHeartAddr.Location = new System.Drawing.Point(173, 24); + this.txtHeartAddr.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txtHeartAddr.Name = "txtHeartAddr"; + this.txtHeartAddr.Size = new System.Drawing.Size(149, 32); + this.txtHeartAddr.TabIndex = 24; + this.txtHeartAddr.Text = "W100"; + this.txtHeartAddr.TextChanged += new System.EventHandler(this.txtHeartAddr_TextChanged); + // + // cbHeartBeat + // + this.cbHeartBeat.AutoSize = true; + this.cbHeartBeat.Location = new System.Drawing.Point(347, 29); + this.cbHeartBeat.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.cbHeartBeat.Name = "cbHeartBeat"; + this.cbHeartBeat.Size = new System.Drawing.Size(66, 21); + this.cbHeartBeat.TabIndex = 0; + this.cbHeartBeat.Text = "启用"; + this.cbHeartBeat.UseVisualStyleBackColor = true; + this.cbHeartBeat.CheckedChanged += new System.EventHandler(this.cbHeartBeat_CheckedChanged); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.tabConTrgUI); + this.groupBox1.Font = new System.Drawing.Font("黑体", 10F); + this.groupBox1.Location = new System.Drawing.Point(16, 372); + this.groupBox1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.groupBox1.Size = new System.Drawing.Size(703, 399); + this.groupBox1.TabIndex = 21; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "参数设置"; + // + // tabConTrgUI + // + this.tabConTrgUI.Controls.Add(this.skinTabPage1); + this.tabConTrgUI.Controls.Add(this.skinTabPage2); + this.tabConTrgUI.Dock = System.Windows.Forms.DockStyle.Fill; + this.tabConTrgUI.Font = new System.Drawing.Font("宋体", 9F); + this.tabConTrgUI.ItemSize = new System.Drawing.Size(85, 28); + this.tabConTrgUI.Location = new System.Drawing.Point(4, 24); + this.tabConTrgUI.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.tabConTrgUI.Name = "tabConTrgUI"; + this.tabConTrgUI.SelectedIndex = 0; + this.tabConTrgUI.Size = new System.Drawing.Size(695, 371); + this.tabConTrgUI.SizeMode = System.Windows.Forms.TabSizeMode.Fixed; + this.tabConTrgUI.TabIndex = 0; + // + // skinTabPage1 + // + this.skinTabPage1.BackColor = System.Drawing.Color.White; + this.skinTabPage1.Dock = System.Windows.Forms.DockStyle.Fill; + this.skinTabPage1.Font = new System.Drawing.Font("宋体", 9F); + this.skinTabPage1.Location = new System.Drawing.Point(4, 32); + this.skinTabPage1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.skinTabPage1.Name = "skinTabPage1"; + this.skinTabPage1.Size = new System.Drawing.Size(687, 335); + this.skinTabPage1.TabIndex = 0; + this.skinTabPage1.Text = "skinTabPage1"; + // + // skinTabPage2 + // + this.skinTabPage2.BackColor = System.Drawing.Color.White; + this.skinTabPage2.Dock = System.Windows.Forms.DockStyle.Fill; + this.skinTabPage2.Font = new System.Drawing.Font("宋体", 9F); + this.skinTabPage2.Location = new System.Drawing.Point(4, 32); + this.skinTabPage2.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.skinTabPage2.Name = "skinTabPage2"; + this.skinTabPage2.Size = new System.Drawing.Size(687, 335); + this.skinTabPage2.TabIndex = 1; + this.skinTabPage2.Text = "skinTabPage2"; + // + // lblConnectStatus + // + this.lblConnectStatus.Image = global::PLCCommunication.Properties.Resources.red; + this.lblConnectStatus.Location = new System.Drawing.Point(1294, 3); + this.lblConnectStatus.Name = "lblConnectStatus"; + this.lblConnectStatus.Size = new System.Drawing.Size(50, 50); + this.lblConnectStatus.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.lblConnectStatus.TabIndex = 35; + this.lblConnectStatus.TabStop = false; + // + // OmronPLCUI + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.White; + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox4); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.panel1); + this.Controls.Add(this.gb_RWTest); + this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.Name = "OmronPLCUI"; + this.Size = new System.Drawing.Size(1819, 856); + this.Load += new System.EventHandler(this.MelsecPLCUI_Load); + this.groupBox3.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + this.PanelTest.ResumeLayout(false); + this.PanelTest.PerformLayout(); + this.gb_RWTest.ResumeLayout(false); + this.gb_RWTest.PerformLayout(); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.tabConTrgUI.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.lblConnectStatus)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private Label label2; + + private TextBox txtReadTestLength; + + private TextBox txtWriteValue; + + private CheckBox cbTest; + + private Label label9; + + private GroupBox groupBox3; + + private GroupBox groupBox2; + + private TextBox txtReadResultTest; + + private Panel panel1; + + private TextBox txtPort; + + private Label label26; + + private TextBox txtIP; + + private Label label27; + + private Button BtnDisConnect; + + private Button BtnConnect; + + private Panel PanelTest; + + private Button BtnWriteTest; + + private Label label7; + + private ComboBox cboReadType; + + private TextBox txtReadAddrTest; + + private Label label6; + + private Button BtnReadTest; + + private GroupBox gb_RWTest; + + private Label label1; + + private GroupBox groupBox4; + + private Label label3; + + private TextBox txtHeartAddr; + + private CheckBox cbHeartBeat; + + private ListView lstSend; + + private ColumnHeader columnHeader1; + + private ColumnHeader columnHeader2; + + private ListView lstRecv; + + private ColumnHeader InfoTime; + + private ColumnHeader InfoContent; + + private ImageList imageList1; + + private Button btnClearRecv; + + private Label lblTip; + + private GroupBox groupBox1; + + private Button btnSaveConfig; + + private ListView lstTrgCmd; + + private ColumnHeader columnHeader3; + + private ColumnHeader columnHeader4; + + private ListView lstResWrite; + + private ColumnHeader columnHeader5; + + private ColumnHeader columnHeader6; + + private CheckBox cbDispCurrent; + + public Button btnStart; + private System.Windows.Forms.TabControl tabConTrgUI; + private System.Windows.Forms.TabPage skinTabPage1; + private System.Windows.Forms.TabPage skinTabPage2; + public Button button1; + private TextBox txtSolt; + private Label label4; + private PictureBox lblConnectStatus; + } +} diff --git a/PLCCommunication/OmronPLCUI.cs b/PLCCommunication/OmronPLCUI.cs new file mode 100644 index 0000000..f2f526b --- /dev/null +++ b/PLCCommunication/OmronPLCUI.cs @@ -0,0 +1,1472 @@ +using HslCommunication; +using HslCommunication.Profinet.Omron; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace PLCCommunication +{ + + // 摘要: + // 欧姆龙PLC通讯类,采用Fins-Tcp通信协议实现,支持的地址信息参见api文档信息。 + // Omron PLC communication class is implemented using Fins-Tcp communication protocol. + // For the supported address information, please refer to the api document information. + // + // 言论: + // 实例化之后,使用之前,需要初始化三个参数信息,具体见三个参数的说明:HslCommunication.Profinet.Omron.OmronFinsNet.SA1,HslCommunication.Profinet.Omron.OmronFinsNet.DA1,HslCommunication.Profinet.Omron.OmronFinsNet.DA2 + // 第二个需要注意的是,当网络异常掉线时,无法立即连接上PLC,PLC对于当前的节点进行拒绝,如果想要支持在断线后的快速连接,就需要将 HslCommunication.Profinet.Omron.OmronFinsNet.IsChangeSA1AfterReadFailed设置为True,详细的可以参考 + // HslCommunication.Profinet.Omron.OmronFinsNet.IsChangeSA1AfterReadFailed + // 如果在测试的时候报错误码64,经网友 上海-Lex 指点,是因为PLC中产生了报警,如伺服报警,模块错误等产生的,但是数据还是能正常读到的,屏蔽64报警或清除plc错误可解决 + // 地址支持的列表如下: + // 地址名称 – 地址代号 – 示例 – 地址进制 – 字操作 – 位操作 – 备注 – + // DM Area – D – D100,D200 – 10 – √ – √ – – + // CIO Area – C – C100,C200 – 10 – √ – √ – – + // Work Area – W – W100,W200 – 10 – √ – √ – – + // Holding Bit Area – H – H100,H200 – 10 – √ – √ – – + // Auxiliary Bit Area – A – A100,A200 – 10 – √ – √ – – + // EM Area – E – E0.0,EF.200,E10.100 – 10 – √ – √ – – + + public partial class OmronPLCUI : UserControl + { + /// + /// 批量读取PLC数据委托 + /// + /// + /// + /// + public delegate void ReceiveHandler(int Index, string msg, OperateResult resByte); + public event ReceiveHandler ReceiveEvent; + + + /// + /// 读取PLC心跳消息状态至主窗口委托 + /// + /// + public delegate void UpHeartBeatHandler(bool b); + public event UpHeartBeatHandler UpHeartBeatEvent; + + /// + /// 保存配置事件委托 + /// + /// + /// + public delegate void SaveParamsHandler(int plcIndex, int trgIndex); + public event SaveParamsHandler SaveParamsEvent; + + public int Index; + /// + /// 欧姆龙Fins协议 + /// + public HslCommunication.Profinet.Omron.OmronCipNet omronCipNet = null; + /// + /// 是否链接PLC + /// + private bool _isConnected = false; + /// + /// 是否开启心跳消息 + /// + private bool _heartBeat = false; + /// + /// 断线后是否更换SA1的值 + /// + private bool _changesa1 = false; + /// + /// 心跳消息寄存器地址 + /// + private string _heartAddr = "100"; + /// + /// + /// + public Dictionary dicJobToTrgParams = new Dictionary(); + /// + /// + /// + public List lstTrgUI = new List(); + /// + /// + /// + public List lstTgrParams = new List(); + /// + /// + /// + public PLCConfig PlcConfig = new PLCConfig(); + /// + /// + /// + public CancellationTokenSource mCTSRecv = new CancellationTokenSource(); + public CancellationTokenSource mCTSHeart = new CancellationTokenSource(); + private ManualResetEvent resetEventRecv = new ManualResetEvent(true); + private ManualResetEvent resetEventHeart = new ManualResetEvent(true); + + /// + /// + /// + public bool IsConnected + { + get + { + return _isConnected; + } + set + { + _isConnected = value; + if (_isConnected) + { + //lblConnectStatus.ForeColor = Color.Green; + lblConnectStatus.Image = Properties.Resources.green; + + } + else + { + lblConnectStatus.Image = Properties.Resources.red; + } + } + } + + /// + /// + /// + public bool IsRun { get; set; } = false; + /// + /// + /// + private string CurrentTime => DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss:fff"); + + public bool HeartBeat + { + get + { + return _heartBeat; + } + set + { + _heartBeat = value; + } + } + + public bool ChangeSA1 + { + get + { + return _changesa1; + } + set + { + _changesa1 = value; + } + } + + + public string HeartAddr + { + get + { + return _heartAddr; + } + set + { + _heartAddr = value; + txtHeartAddr.Text = value.ToString(); + } + } + + /// + /// 读取PLC数据线程等待时间 + /// + public int ScanTime { get; set; } = 100; + public int JobCount { get; set; } + /// + /// PLCIP地址 + /// + public string IP { get; set; } + /// + /// PLC端口 + /// + public int Port { get; set; } + public bool DispCurrent { get; set; } = false; + + + + public OmronPLCUI() + { + InitializeComponent(); + omronCipNet = new OmronCipNet(); + omronCipNet.ConnectTimeOut = 2000; + PanelTest.Enabled = false; + } + + public OmronPLCUI(PLCConfig plcConfig) + : this() + { + PlcConfig = plcConfig; + Index = plcConfig.Index; + IP = plcConfig.IP; + Port = plcConfig.Port; + JobCount = plcConfig.JobCount; + ScanTime = plcConfig.ScanTime; + HeartBeat = plcConfig.HeartBeat; + ChangeSA1 = plcConfig.ChangeSA1; + lstTgrParams = plcConfig.lstTgrParams; + _heartAddr = plcConfig.HeartAddr; + + InitialTiggerModule(lstTgrParams); + cboReadType.DataSource = Enum.GetNames(typeof(VarType)); + cboReadType.SelectedIndex = 0; + if (HeartBeat) + { + cbHeartBeat.Checked = true; + } + else + { + cbHeartBeat.Checked = false; + } + + txtIP.Text = PlcConfig.IP.Trim(); + txtPort.Text = PlcConfig.Port.ToString(); + txtHeartAddr.Text = PlcConfig.HeartAddr; + txtSolt.Text = PlcConfig.Solt.ToString(); + InitialAndConnect(); + Task HeartTask = Task.Factory.StartNew(delegate { CheckHeart(); }, mCTSHeart.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default); + if (!IsRun) + { + resetEventRecv.Reset(); + } + SetStyle(ControlStyles.UserPaint, true); + SetStyle(ControlStyles.AllPaintingInWmPaint, true); + SetStyle(ControlStyles.DoubleBuffer, true); + } + + + private void MelsecPLCUI_Load(object sender, EventArgs e) + { + List ipv4_ips = GetLocalIpAddress("InterNetwork");//获取ipv4类型的ip + //string da = ipv4_ips[0].LastIndexOf('.')-1; + } + + + //List ips = GetLocalIpAddress("");//获取本地所有ip + //List ipv4_ips = GetLocalIpAddress("InterNetwork");//获取ipv4类型的ip + //List ipv6_ips = GetLocalIpAddress("InterNetworkV6");//获取ipv6类型的ip + + /// + /// 获取本机所有ip地址 + /// + /// "InterNetwork":ipv4地址,"InterNetworkV6":ipv6地址 + /// ip地址集合 + public static List GetLocalIpAddress(string netType) + { + string hostName = Dns.GetHostName(); //获取主机名称 + IPAddress[] addresses = Dns.GetHostAddresses(hostName); //解析主机IP地址 + + List IPList = new List(); + if (netType == string.Empty) + { + for (int i = 0; i < addresses.Length; i++) + { + IPList.Add(addresses[i].ToString()); + } + } + else + { + //AddressFamily.InterNetwork表示此IP为IPv4, + //AddressFamily.InterNetworkV6表示此地址为IPv6类型 + for (int i = 0; i < addresses.Length; i++) + { + if (addresses[i].AddressFamily.ToString() == netType) + { + if (addresses[i].ToString().Contains("192")) + { + IPList.Add(addresses[i].ToString()); + } + + } + } + } + return IPList; + } + + public void InitialTiggerModule(List lstTrgParams) + { + tabConTrgUI.TabPages.Clear(); + for (int i = 0; i < lstTrgParams.Count; i++) + { + TriggerUI triggerUI = new TriggerUI(lstTrgParams[i]); + tabConTrgUI.TabPages.Add(lstTrgParams[i].ThreadName); + Panel panel = new Panel(); + tabConTrgUI.TabPages[i].Controls.Add(panel); + panel.Dock = DockStyle.Fill; + panel.Controls.Add(triggerUI); + triggerUI.Dock = DockStyle.Fill; + triggerUI.TrgParamChangeEvent += TriggerUI_TrgParamChangeEvent; + lstTrgUI.Add(triggerUI); + } + + } + + private void TriggerUI_TrgParamChangeEvent(int tgrIndex) + { + OnSaveParams(Index, tgrIndex); + } + + public bool Connect() + { + if (!IPAddress.TryParse(txtIP.Text, out IPAddress address)) + { + AddLog(lstRecv, 1, "PLCIP地址格式不正确"); + return false; + } + if (!int.TryParse(txtPort.Text, out int port)) + { + AddLog(lstRecv, 1, "端口号格式不正确"); + return false; + } + if (!byte.TryParse(txtSolt.Text, out byte solt)) + { + AddLog(lstRecv, 1, "PLC插槽号设置错误!"); + return false; + } + string str = ""; + omronCipNet.IpAddress = address.ToString(); + omronCipNet.Port = port; + omronCipNet.Slot = solt; + omronCipNet.ConnectClose(); + try + { + omronCipNet.ConnectTimeOut = 2000; + OperateResult connect = omronCipNet.ConnectServer(); + if (connect.IsSuccess) + { + IsConnected = true; + BtnDisConnect.Enabled = true; + BtnConnect.Enabled = false; + str = StringResources.Language.ConnectedSuccess; + AddLog(lstRecv, 0, StringResources.Language.ConnectedSuccess); + return true; + } + else + { + IsConnected = false; + str = StringResources.Language.ConnectedFailed; + AddLog(lstRecv,1, StringResources.Language.ConnectedFailed); + } + + } + catch (Exception ex) + { + str = ex.Message; + IsConnected = false; + AddLog(lstRecv, 1, ex.Message); + } + //LogManagerControl.AddLog($"{str}", LogAddtype.local, Logtype.Message); + return false; + } + + /// + /// 对PLC进行链接 + /// + /// + /// + private void BtnConnect_Click(object sender, EventArgs e) + { + Connect(); + } + + /// + /// 与LC断开链接 + /// + /// + /// + private void BtnDisConnect_Click(object sender, EventArgs e) + { + ConnectClose(); + } + + /// + /// 断开PLC的链接 + /// + public void ConnectClose() + { + omronCipNet.ConnectClose(); + BtnDisConnect.Enabled = false; + BtnConnect.Enabled = true; + lblConnectStatus.Image = Properties.Resources.red; + IsConnected = false; + AddLog(lstRecv, 0, "断开连接"); + } + + + /// + /// 界面测试复选框 + /// + /// + /// + private void cbTest_CheckedChanged(object sender, EventArgs e) + { + if (cbTest.Checked) + { + PanelTest.Enabled = true; + } + else + { + PanelTest.Enabled = false; + } + } + + + /// + /// 读取PLC数据 + /// + /// + /// + private void BtnReadTest_Click(object sender, EventArgs e) + { + if (!IsConnected) + { + AddLog(lstRecv, 1, "未连接到PLC,请检查连接状态"); + return; + } + if (txtReadAddrTest.Text.Trim() == "") + { + AddLog(lstRecv, 1, "读取地址不能为空"); + return; + } + if (txtReadTestLength.Text.Trim() == "") + { + AddLog(lstRecv, 1, "读取长度不能为空"); + return; + } + try + { + + switch ((VarType)Enum.Parse(typeof(VarType), cboReadType.SelectedItem.ToString(), false)) + { + case VarType.Bit: + DemoUtils.ReadResultRender(omronCipNet.ReadBool(txtReadAddrTest.Text, ushort.Parse(txtReadTestLength.Text.Trim())), txtReadAddrTest.Text, txtReadResultTest); + break; + case VarType.Short: + DemoUtils.ReadResultRender(omronCipNet.ReadInt16(txtReadAddrTest.Text, ushort.Parse(txtReadTestLength.Text.Trim())), txtReadAddrTest.Text, txtReadResultTest); + break; + case VarType.Int: + DemoUtils.ReadResultRender(omronCipNet.ReadInt32(txtReadAddrTest.Text, ushort.Parse(txtReadTestLength.Text.Trim())), txtReadAddrTest.Text, txtReadResultTest); + break; + case VarType.Float: + DemoUtils.ReadResultRender(omronCipNet.ReadFloat(txtReadAddrTest.Text, ushort.Parse(txtReadTestLength.Text.Trim())), txtReadAddrTest.Text, txtReadResultTest); + break; + case VarType.String: + DemoUtils.ReadResultRender(omronCipNet.ReadString(txtReadAddrTest.Text, ushort.Parse(txtReadTestLength.Text.Trim())), txtReadAddrTest.Text, txtReadResultTest); + break; + case VarType.Byte: + DemoUtils.ReadResultRender(omronCipNet.Read(txtReadAddrTest.Text, ushort.Parse(txtReadTestLength.Text.Trim())), txtReadAddrTest.Text, txtReadResultTest); + break; + } + } + catch (Exception ex) + { + AddLog(lstRecv, 1, "读取失败,请检查地址类型或连接状态" + ex.Message); + } + } + + /// + /// 写入PLC数据 + /// + /// + /// + private void BtnWriteTest_Click(object sender, EventArgs e) + { + if (!IsConnected) + { + AddLog(lstRecv, 1, "未连接到PLC,请检查连接状态"); + return; + } + if (txtReadAddrTest.Text.Trim() == "") + { + AddLog(lstRecv, 1, "写入地址不能位空"); + return; + } + if (txtReadTestLength.Text.Trim() == "") + { + AddLog(lstRecv, 1, "写入长度不能为空"); + return; + } + try + { + VarType varType = (VarType)Enum.Parse(typeof(VarType), cboReadType.SelectedItem.ToString(), false); + switch (varType) + { + case VarType.Bit: + { + string type = txtWriteValue.Text.Trim().Substring(0, 1); + if (type != "D" && type != "W") + { + MessageBox.Show("暂只支持D,W存储区"); + break; + } + bool[] boolArray = GetBoolArray(txtWriteValue.Text.Trim()); + DemoUtils.WriteResultRender(() => omronCipNet.Write(txtReadAddrTest.Text.Trim(), boolArray), txtReadAddrTest.Text.Trim()); + break; + } + case VarType.Short: + { + short[] shortArray = GetShortArray(txtWriteValue.Text.Trim()); + DemoUtils.WriteResultRender(() => omronCipNet.Write(txtReadAddrTest.Text.Trim(), shortArray), txtReadAddrTest.Text.Trim()); + break; + } + case VarType.Int: + { + int[] intArray = GetIntArray(txtWriteValue.Text.Trim()); + DemoUtils.WriteResultRender(() => omronCipNet.Write(txtReadAddrTest.Text.Trim(), intArray), txtReadAddrTest.Text.Trim()); + break; + } + case VarType.Float: + { + float[] floatArray = GetFloatArray(txtWriteValue.Text.Trim()); + DemoUtils.WriteResultRender(() => omronCipNet.Write(txtReadAddrTest.Text.Trim(), floatArray), txtReadAddrTest.Text.Trim()); + break; + } + case VarType.Byte: + { + DemoUtils.WriteResultRender(() => omronCipNet.Write(txtReadAddrTest.Text.Trim(), txtWriteValue.Text.Trim()), txtReadAddrTest.Text.Trim()); + break; + } + case VarType.String: + { + DemoUtils.WriteResultRender(() => omronCipNet.Write(txtReadAddrTest.Text.Trim(), txtWriteValue.Text.Trim()), txtReadAddrTest.Text.Trim()); + break; + } + } + } + catch (Exception ex) + { + AddLog(lstRecv, 1, "写入失败,请检查地址类型或连接状态" + ex.Message); + } + } + + /// + /// 开启 + /// + public void InitialAndConnect() + { + Task RecvTask = Task.Factory.StartNew(delegate { GetMelsecValue(); }, mCTSRecv.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default); + } + + + /// + /// 链接PLC状态 + /// + /// + public void OmronStart(bool status) + { + if (status) + { + resetEventRecv.Set(); + } + else + { + resetEventRecv.Reset(); + } + } + + /// + /// 循环读取PLC数据 + /// + private void GetMelsecValue() + { + while (true) + { + if (mCTSRecv.Token.IsCancellationRequested) + { + return; + } + resetEventRecv.WaitOne(); + if (IsRun) + { + if (IsConnected) + { + OperateResult resByte = null; + for (int i = 0; i < JobCount; i++) + { + StringBuilder res = new StringBuilder(string.Empty); + switch (lstTrgUI[i].TrgParams.TriggerType) + { + case VarType.Bit: + res.Append(omronCipNet.ReadBool(lstTrgUI[i].TrgParams.TriggerAddr).Content.ToString()); + break; + case VarType.Short: + res.Append(omronCipNet.ReadInt16(lstTrgUI[i].TrgParams.TriggerAddr).Content.ToString()); + break; + case VarType.Int: + res.Append(omronCipNet.ReadInt32(lstTrgUI[i].TrgParams.TriggerAddr).Content.ToString()); + break; + case VarType.Float: + res.Append(omronCipNet.ReadFloat(lstTrgUI[i].TrgParams.TriggerAddr).Content.ToString()); + break; + case VarType.String: + res.Append(omronCipNet.ReadString(lstTrgUI[i].TrgParams.TriggerAddr, Convert.ToUInt16(txtReadTestLength.Text.Trim())).Content.ToString()); + break; + case VarType.Byte: + resByte = omronCipNet.Read(lstTrgUI[i].TrgParams.TriggerAddr, Convert.ToUInt16(txtReadTestLength.Text.Trim())); + res.Append(HslCommunication.BasicFramework.SoftBasic.ByteToHexString(resByte.Content)); + break; + } + if (lstTrgUI[i].TrgParams.IsRead) + { + resByte = omronCipNet.Read(lstTrgUI[i].TrgParams.ReadAddr, Convert.ToUInt16(lstTrgUI[i].TrgParams.ReadLength)); + //res.Append(HslCommunication.BasicFramework.SoftBasic.ByteToHexString(resByte.Content)); + } + if (DispCurrent) + { + AddLog(lstRecv, 0, lstTrgUI[i].TrgParams.TriggerAddr + "-->" + res.ToString()); + } + if (res.ToString() == lstTrgUI[i].TrgParams.TriggerCmd) + { + AddLog(lstTrgCmd, 0, $"{lstTrgUI[i].TrgParams.TriggerAddr}-->{res}"); + } + OnReceive(i + 1, res.ToString(), resByte); + Thread.Sleep(5); + } + Thread.Sleep(ScanTime); + } + else if (HeartBeat) + { + Thread.Sleep(5000); + if (!IPAddress.TryParse(txtIP.Text, out IPAddress address)) + { + AddLog(lstRecv, 1, "PLCIP地址格式不正确"); + return; + } + if (!int.TryParse(txtPort.Text, out int port)) + { + AddLog(lstRecv, 1, "端口号格式不正确"); + return; + } + if (!byte.TryParse(txtSolt.Text, out byte solt)) + { + AddLog(lstRecv, 1, "PLC单元设置错误"); + break; + } + omronCipNet.IpAddress = address.ToString(); + omronCipNet.Port = port; + omronCipNet.Slot = solt; + omronCipNet.ConnectTimeOut = 2000; + OperateResult connect = omronCipNet.ConnectServer(); + if (connect.IsSuccess) + { + Invoke((Action)delegate + { + IsConnected = true; + BtnDisConnect.Enabled = true; + BtnConnect.Enabled = false; + lblConnectStatus.Image = Properties.Resources.red; + }); + } + } + else + { + Thread.Sleep(10000); + } + } + else + { + Thread.Sleep(2000); + } + } + AddLog(lstRecv, 1, "端口号格式不正确"); + } + + /// + /// 心跳消息 + /// + private void CheckHeart() + { + while (!mCTSHeart.Token.IsCancellationRequested) + { + if (IsRun) + { + if (HeartBeat) + { + try + { + Thread.Sleep(1000); + OperateResult result = omronCipNet.Write(HeartAddr, (short)1); + if (result.IsSuccess) + { + OnUpHeartBeat(true); + AddLog(lstSend, 0, $"心跳 {txtHeartAddr.Text}-> {1}"); + continue; + } + Invoke((Action)delegate + { + OnUpHeartBeat(false); + IsConnected = false; + BtnConnect.Enabled = true; + BtnDisConnect.Enabled = false; + //lblConnectStatus.IsFlash = false; + //lblConnectStatus.LedStatus = false; + + }); + AddLog(lstSend, 2, $"心跳 {txtHeartAddr.Text}-> {1}失败"); + } + catch (Exception ex) + { + Invoke((Action)delegate + { + OnUpHeartBeat(false); + IsConnected = false; + BtnConnect.Enabled = true; + BtnDisConnect.Enabled = false; + //lblConnectStatus.IsFlash = false; + //lblConnectStatus.LedStatus = false; + + }); + AddLog(lstSend, 2, ex.Message); + } + } + else + { + Thread.Sleep(1000); + } + } + } + } + + /// + /// 对PLC某寄存器清零 + /// + /// + /// + public void ClearReg(string iAddr, VarType varType) + { + string type = iAddr.Substring(0, 1); + if (type != "D" && type != "W") + { + AddLog(lstSend, 2, "暂只支持D,W存储区"); + return; + } + switch (varType) + { + case VarType.Bit: + omronCipNet.Write(iAddr, false); + break; + case VarType.Float: + omronCipNet.Write(iAddr, 0f); + break; + case VarType.Short: + omronCipNet.Write(iAddr, (short)0); + break; + case VarType.Int: + omronCipNet.Write(iAddr, 0); + break; + case VarType.String: + omronCipNet.Write(iAddr, 0); + break; + } + } + + /// + ///读取BOOL值 + /// + /// + /// + public bool ReadBoolDReg(string iAddr) + { + bool result = false; + try + { + string type = iAddr.Substring(0, 1); + if (type != "D" && type != "W") + { + AddLog(lstSend, 2, "暂只支持D,W存储区"); + } + else if (IsConnected) + { + result = omronCipNet.ReadBool(iAddr).Content; + AddLog(lstResWrite, 0, $"{iAddr} --> {result.ToString()}"); + } + } + catch (Exception ex) + { + AddLog(lstResWrite, 2, $"{iAddr} --> {ex.Message}"); + } + return result; + } + + /// + ///读取String值 + /// + /// + /// + public string ReadStringDReg(string iAddr) + { + string result = ""; + try + { + string type = iAddr.Substring(0, 1); + if (type != "D" && type != "W") + { + AddLog(lstSend, 2, "暂只支持D,W存储区"); + } + else if (IsConnected) + { + result = omronCipNet.ReadString(iAddr).Content; + AddLog(lstResWrite, 0, $"{iAddr} --> {result}"); + } + } + catch (Exception ex) + { + AddLog(lstResWrite, 2, $"{iAddr} --> {ex.Message}"); + } + return result; + } + + /// + /// 读取16位整数 + /// + /// + /// + public short ReadshortDReg(string iAddr) + { + short result = 0; + try + { + string type = iAddr.Substring(0, 1); + if (type != "D" && type != "W") + { + AddLog(lstSend, 2, "暂只支持D,W存储区"); + } + else if (IsConnected) + { + result = omronCipNet.ReadInt16(iAddr).Content; + AddLog(lstResWrite, 0, $"{iAddr} --> {result.ToString()}"); + } + } + catch (Exception ex) + { + AddLog(lstResWrite, 2, $"{iAddr} --> {ex.Message}"); + } + return result; + } + + /// + /// 读取32位整数 + /// + /// + /// + public int ReadIntDReg(string iAddr) + { + int result = 0; + try + { + string type = iAddr.Substring(0, 1); + if (type != "D" && type != "W" && type != "H") + { + AddLog(lstSend, 2, "暂只支持D,W存储区"); + } + else if (IsConnected) + { + result = omronCipNet.ReadInt32(iAddr).Content; + AddLog(lstResWrite, 0, $"{iAddr} --> {result.ToString()}"); + } + } + catch (Exception ex) + { + AddLog(lstResWrite, 2, $"{iAddr} --> {ex.Message}"); + } + return result; + } + + /// + /// 读取浮点数 + /// + /// + /// + public float ReadFloatDReg(string iAddr) + { + float result = 0; + try + { + string type = iAddr.Substring(0, 1); + if (type != "D" && type != "W" && type != "H") + { + AddLog(lstSend, 2, "暂只支持D,W存储区"); + } + else if (IsConnected) + { + result = omronCipNet.ReadFloat(iAddr).Content; + AddLog(lstResWrite, 0, $"{iAddr} --> {result.ToString()}"); + } + } + catch (Exception ex) + { + AddLog(lstResWrite, 2, $"{iAddr} --> {ex.Message}"); + } + + return result; + } + + /// + /// 读取byte + /// + /// 数据地址 + /// 读取长度 + /// + public byte[] Readbyte(string iAddr, ushort lenght) + { + byte[] result = null; + try + { + //string type = iAddr.Substring(0, 1); + //if (type != "D" && type != "R") + //{ + // AddLog(lstSend, 2, "暂只支持D,R存储区"); + //} + if (IsConnected) + { + result = omronCipNet.Read(iAddr, lenght).Content; + AddLog(lstResWrite, 0, $"{iAddr} --> {result.ToString()}"); + } + } + catch (Exception ex) + { + AddLog(lstResWrite, 2, $"{iAddr} --> {ex.Message}"); + } + + return result; + } + + /// + /// 写入byte数组 + /// + /// + /// + public void WriteDReg(string iAddr, byte[] Value) + { + string type = iAddr.Substring(0, 1); + if (type != "D" && type != "W") + { + AddLog(lstSend, 2, "暂只支持D,W存储区"); + } + else if (IsConnected) + { + + OperateResult result = omronCipNet.Write(iAddr, Value); + //OperateResult result = omronCipNet.WriteTag(iAddr,210, Value); + if (result.IsSuccess) + { + AddLog(lstResWrite, 0, $"{iAddr} --> {Value}"); + } + else + { + AddLog(lstResWrite, 2, $"{iAddr} --> {Value}"); + } + } + } + public void WriteDReg(string iAddr, float Value) + { + string type = iAddr.Substring(0, 1); + if (type != "D" && type != "W") + { + AddLog(lstSend, 2, "暂只支持D,W存储区"); + } + else if (IsConnected) + { + + OperateResult result = omronCipNet.Write(iAddr, Value); + //OperateResult result = omronCipNet.WriteTag(iAddr,210, Value); + if (result.IsSuccess) + { + AddLog(lstResWrite, 0, $"{iAddr} --> {Value}"); + } + else + { + AddLog(lstResWrite, 2, $"{iAddr} --> {Value}"); + } + } + } + + /// + /// 写入单个int类型数据 + /// + /// + /// + public void WriteDReg(string iAddr, string Value) + { + string type = iAddr.Substring(0, 1); + if (type != "D" && type != "W") + { + AddLog(lstSend, 2, "暂只支持D,W存储区"); + } + else if (IsConnected) + { + OperateResult result = omronCipNet.Write(iAddr, Value); + if (result.IsSuccess) + { + AddLog(lstResWrite, 0, $"{iAddr} --> {Value}"); + } + else + { + AddLog(lstResWrite, 2, $"{iAddr} --> {Value}"); + } + } + } + + + /// + /// 写入单个int类型数据 + /// + /// + /// + public void WriteDReg(string iAddr, int Value) + { + string type = iAddr.Substring(0, 1); + if (type != "D" && type != "W") + { + AddLog(lstSend, 2, "暂只支持D,W存储区"); + } + else if (IsConnected) + { + OperateResult result = omronCipNet.Write(iAddr, Value); + if (result.IsSuccess) + { + AddLog(lstResWrite, 0, $"{iAddr} --> {Value}"); + } + else + { + AddLog(lstResWrite, 2, $"{iAddr} --> {Value}"); + } + } + } + + /// + /// 批量写入int类型数据 + /// + /// + /// + public void WriteDReg(string iAddr, int[] Value) + { + string type = iAddr.Substring(0, 1); + if (type != "D" && type != "W") + { + AddLog(lstSend, 2, "暂只支持D,W存储区"); + } + else if (IsConnected) + { + OperateResult result = omronCipNet.Write(iAddr, Value); + if (result.IsSuccess) + { + AddLog(lstResWrite, 0, $"{iAddr} --> {Value}"); + } + else + { + AddLog(lstResWrite, 2, $"{iAddr} --> {Value}"); + } + } + } + + /// + /// 批量写入ushort类型数据 + /// + /// + /// + public void WriteDReg(string iAddr, short[] Value) + { + string type = iAddr.Substring(0, 1); + if (type != "D" && type != "W") + { + AddLog(lstSend, 2, "暂只支持D,W存储区"); + } + else if (IsConnected) + { + OperateResult result = omronCipNet.Write(iAddr, Value); + if (result.IsSuccess) + { + for (int i = 0; i < Value.Length; i++) + { + AddLog(lstResWrite, 0, $"{iAddr} --> {Value[i]}"); + } + + } + else + { + for (int i = 0; i < Value.Length; i++) + { + AddLog(lstResWrite, 2, $"{iAddr} --> {Value[i]}"); + } + } + } + } + + + + /// + /// 写入单个Short类型数据 + /// + /// + /// + public void WriteDReg(string iAddr, short Value) + { + string type = iAddr.Substring(0, 1); + if (type != "D" && type != "W") + { + AddLog(lstSend, 2, "暂只支持D,W存储区"); + } + else if (IsConnected) + { + OperateResult result = omronCipNet.Write(iAddr, Value); + if (result.IsSuccess) + { + AddLog(lstResWrite, 0, $"{iAddr} --> {Value}"); + } + else + { + AddLog(lstResWrite, 2, $"{iAddr} --> {Value}"); + } + } + } + + /// + /// 写BOOL + /// + /// + /// + public void WriteDReg(string iAddr, bool Value) + { + string type = iAddr.Substring(0, 1); + if (type != "D" && type != "W") + { + AddLog(lstSend, 2, "暂只支持D,W存储区"); + } + else if (IsConnected) + { + OperateResult result = omronCipNet.Write(iAddr, Value); + if (result.IsSuccess) + { + AddLog(lstResWrite, 0, $"{iAddr} --> {Value}"); + } + else + { + AddLog(lstResWrite, 2, $"{iAddr} --> {Value}"); + } + } + } + + /// + /// 是否启用心跳消息 + /// + /// + /// + private void cbHeartBeat_CheckedChanged(object sender, EventArgs e) + { + if (cbHeartBeat.Checked) + { + HeartBeat = true; + } + else + { + HeartBeat = false; + } + } + + + /// + /// 保存配置 + /// + /// + /// + private void btnSaveConfig_Click(object sender, EventArgs e) + { + try + { + PlcConfig.Index = Index; + PlcConfig.IP = txtIP.Text.Trim(); + PlcConfig.Port = Convert.ToInt32(txtPort.Text.Trim()); + PlcConfig.HeartBeat = cbHeartBeat.Checked; + PlcConfig.HeartAddr = txtHeartAddr.Text.Trim(); + PlcConfig.JobCount = JobCount; + PlcConfig.ScanTime = ScanTime; + PlcConfig.Solt= Convert.ToInt32(txtSolt.Text.Trim()); + OnSaveParams(Index, 0); + AddLog(lstRecv, 0, "保存参数成功"); + } + catch (Exception ex) + { + AddLog(lstRecv, 1, "保存参数失败" + ex.Message); + } + } + + /// + /// 日志显示 + /// + /// + /// + /// + private void AddLog(ListView lstView, int type, string info) + { + ListViewItem lst = new ListViewItem(" " + CurrentTime, type); + lst.SubItems.Add(info); + if (base.InvokeRequired) + { + Invoke((Action)delegate + { + lstView.Items.Insert(0, lst); + if (lstView.Items.Count > 2000) + { + lstView.Items.Clear(); + } + }); + } + else + { + if (lstView.Items.Count > 2000) + { + lstView.Items.Clear(); + } + lstView.Items.Insert(0, lst); + } + } + + /// + /// + /// + /// + /// + private bool[] GetBoolArray(string val) + { + try + { + List Result = new List(); + if (val.Contains(',')) + { + string[] str = Regex.Split(val, ",", RegexOptions.IgnoreCase); + string[] array = str; + foreach (string item in array) + { + Result.Add(item.ToLower() == "true" || item.ToLower() == "1"); + } + } + else + { + Result.Add(val.ToLower() == "true" || val.ToLower() == "1"); + } + return Result.ToArray(); + } + catch (Exception) + { + return null; + } + } + + private short[] GetShortArray(string val) + { + try + { + List Result = new List(); + if (val.Contains(',')) + { + string[] str = Regex.Split(val, ",", RegexOptions.IgnoreCase); + string[] array = str; + foreach (string item in array) + { + Result.Add(Convert.ToInt16(item)); + } + } + else + { + Result.Add(Convert.ToInt16(val)); + } + return Result.ToArray(); + } + catch (Exception) + { + return null; + } + } + + private int[] GetIntArray(string val) + { + try + { + List Result = new List(); + if (val.Contains(',')) + { + string[] str = Regex.Split(val, ",", RegexOptions.IgnoreCase); + string[] array = str; + foreach (string item in array) + { + Result.Add(Convert.ToInt32(item)); + } + } + else + { + Result.Add(Convert.ToInt32(val)); + } + return Result.ToArray(); + } + catch (Exception) + { + return null; + } + } + + private float[] GetFloatArray(string val) + { + try + { + List Result = new List(); + if (val.Contains(',')) + { + string[] str = Regex.Split(val, ",", RegexOptions.IgnoreCase); + string[] array = str; + foreach (string item in array) + { + Result.Add(Convert.ToSingle(item)); + } + } + else + { + Result.Add(Convert.ToSingle(val)); + } + return Result.ToArray(); + } + catch (Exception) + { + return null; + } + } + + /// + /// 清除消息 + /// + /// + /// + private void btnClearRecv_Click(object sender, EventArgs e) + { + lstRecv.Items.Clear(); + } + + /// + /// 数据接受委托事件 + /// + /// + /// + /// + public void OnReceive(int Index, string msg, OperateResult resByte) + { + if (this.ReceiveEvent != null) + { + this.ReceiveEvent(Index, msg, resByte); + } + } + + /// + /// 心跳消息委托事件 + /// + /// + public void OnUpHeartBeat(bool b) + { + if (this.UpHeartBeatEvent != null) + { + this.UpHeartBeatEvent(b); + } + } + + /// + /// 保存信息委托事件 + /// + /// + /// + public void OnSaveParams(int plcIndex, int trgIndex) + { + if (this.SaveParamsEvent != null) + { + this.SaveParamsEvent(plcIndex, trgIndex); + } + } + + /// + /// 关闭读取PLC数据 + /// + public void Shutdown() + { + if (omronCipNet != null) + { + try + { + mCTSRecv.Cancel(); + mCTSHeart.Cancel(); + } + catch (Exception) + { + } + } + } + + /// + /// 链接PLC开始启动 + /// + /// + /// + private void btnStart_Click(object sender, EventArgs e) + { + if (!IsRun) + { + Connect(); + OmronStart(true); + IsRun = true; + btnStart.Text = "停止"; + } + else + { + ConnectClose(); + OmronStart(false); + IsRun = false; + btnStart.Text = "启动"; + } + } + + /// + /// + /// + /// + /// + private void cbDispCurrent_CheckedChanged(object sender, EventArgs e) + { + if (cbDispCurrent.Checked) + { + DispCurrent = true; + } + else + { + DispCurrent = false; + } + } + + /// + /// 心跳消息赋值 + /// + /// + /// + private void txtHeartAddr_TextChanged(object sender, EventArgs e) + { + _heartAddr = txtHeartAddr.Text; + } + + private void button1_Click(object sender, EventArgs e) + { + //OperateResult operateResult = omron_finsnet.ReadCpuUnitData(); + //if (operateResult.IsSuccess) + //{ + // txtReadResultTest.Text = operateResult.Content.ToJsonString(); + //} + //else + //{ + // MessageBox.Show("read failed:" + operateResult.Message); + //} + } + } +} diff --git a/PLCCommunication/OmronPLCUI.resx b/PLCCommunication/OmronPLCUI.resx new file mode 100644 index 0000000..6bb0a8d --- /dev/null +++ b/PLCCommunication/OmronPLCUI.resx @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAo + CQAAAk1TRnQBSQFMAgEBAgEAAUgBAAFIAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA + AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 + AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA + AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm + AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM + AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA + ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz + AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ + AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM + AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA + AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA + AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ + AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/ + AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA + AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm + ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ + Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz + AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA + AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM + AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM + ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM + Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA + AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM + AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ + AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz + AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm + AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw + AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wUAAf8B8gHCAp4BwgHy + Af8IAAH/ARoBBwJNAQcBGgH/JwAB8gGeBpcBngHyBgAB8wFNBiUBTQHzJQAMlwQADCUjAAEIDJcBCAIA + AZkMJQGZIQAB/wHADJcBwAL/AU0CJQEWAfQBFgIlARYB9AEWAiUBTQH/IAAB8gSXAXgC9AF4BpcB8gEa + AyUB9AEAAf8CFgH/AQAB9AMlARogAAEIA5cBeAT0AXgFlwEIAQcDJQEWAf8BAAL/AQAB/wEWAyUBByAA + AXgClwF4AvQCeAL0AXgElwF4AUwEJQEWAf8CAAH/ARYEJQFMIAABngKXAfAB9AF4ApcBeAL0AXgDlwGe + AUwEJQEWAf8CAAH/ARYEJQFMIAABwgiXAXgC9AF4ApcBwgEHAyUBFgH/AQAC/wEAAf8BFgMlAQcgAAHy + CZcBeAH0AfAClwHyARoDJQH0AQAB/wIWAf8BAAH0AyUBGiAAAf8BngyXAZ4C/wFNAiUBFgH0ARYCJQEW + AfQBFgIlAU0B/yEAAfIMlwHyAgABmQwlAZkjAAyXBAAMJSUAAQgBwAaXAcABCAYAAfMBTQYlAU0B8ycA + Af8B8gEIAngBCAHyAf8IAAH/ARoBBwJNAQcBGgH/JAABQgFNAT4HAAE+AwABKAMAAUADAAEQAwABAQEA + AQEFAAGAFwAD/wEAAfABDwHwAQ8EAAHgAQcB4AEHBAABwAEDAcABAwQAAYABAQGAAQEOAAEEASAGAAEC + AUAGAAEBAYAGAAEBAYAGAAECAUAGAAEEASAMAAGAAQEBgAEBBAABwAEDAcABAwQAAeABBwHgAQcEAAHw + AQ8B8AEPBAAL + + + + 32 + + \ No newline at end of file diff --git a/PLCCommunication/PLCCommunication.csproj b/PLCCommunication/PLCCommunication.csproj new file mode 100644 index 0000000..123bc06 --- /dev/null +++ b/PLCCommunication/PLCCommunication.csproj @@ -0,0 +1,118 @@ + + + + + Debug + AnyCPU + {796C9DFE-1D66-4921-B998-C5FCF15C2983} + WinExe + PLCCommunication + PLCCommunication + v4.8 + 512 + true + true + + + + AnyCPU + true + full + false + ..\..\..\..\JY.Inspection\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\JY.Inspection\Lib\HslCommunication.dll + + + + + + + + + + + + + + + + + + + + + + Form + + + FrmOmronPLCCom.cs + + + UserControl + + + OmronPLCUI.cs + + + + + UserControl + + + TriggerUI.cs + + + FrmOmronPLCCom.cs + + + OmronPLCUI.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + TriggerUI.cs + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + + + + + + \ No newline at end of file diff --git a/PLCCommunication/PLCCommunication.csproj.user b/PLCCommunication/PLCCommunication.csproj.user new file mode 100644 index 0000000..c10e84b --- /dev/null +++ b/PLCCommunication/PLCCommunication.csproj.user @@ -0,0 +1,6 @@ + + + + ProjectFiles + + \ No newline at end of file diff --git a/PLCCommunication/Program.cs b/PLCCommunication/Program.cs new file mode 100644 index 0000000..39ceee8 --- /dev/null +++ b/PLCCommunication/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace PLCCommunication +{ + static class Program + { + /// + /// 应用程序的主入口点。 + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form()); + } + } +} diff --git a/PLCCommunication/Properties/AssemblyInfo.cs b/PLCCommunication/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..0f80c53 --- /dev/null +++ b/PLCCommunication/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("PLCCommunication")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("PLCCommunication")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("796c9dfe-1d66-4921-b998-c5fcf15c2983")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/PLCCommunication/Properties/Resources.Designer.cs b/PLCCommunication/Properties/Resources.Designer.cs new file mode 100644 index 0000000..ccf4ef3 --- /dev/null +++ b/PLCCommunication/Properties/Resources.Designer.cs @@ -0,0 +1,83 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace PLCCommunication.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.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() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [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("PLCCommunication.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap green { + get { + object obj = ResourceManager.GetObject("green", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap red { + get { + object obj = ResourceManager.GetObject("red", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/PLCCommunication/Properties/Resources.resx b/PLCCommunication/Properties/Resources.resx new file mode 100644 index 0000000..a647b1d --- /dev/null +++ b/PLCCommunication/Properties/Resources.resx @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\red.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/PLCCommunication/Properties/Settings.Designer.cs b/PLCCommunication/Properties/Settings.Designer.cs new file mode 100644 index 0000000..92e0219 --- /dev/null +++ b/PLCCommunication/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace PLCCommunication.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.11.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; + } + } + } +} diff --git a/PLCCommunication/Properties/Settings.settings b/PLCCommunication/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/PLCCommunication/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/PLCCommunication/Resources/green.png b/PLCCommunication/Resources/green.png new file mode 100644 index 0000000000000000000000000000000000000000..7abdd5fd43ab65d4eeae5b789eff42dcfc39b31c GIT binary patch literal 1501 zcmY*ZX;4!K5Psn_@rV@=5$g+DK+ZT)#0n-LP=W`c98v`ns+CJIDpUkRUH~nMM{rb7 zIUXq>j#dH+0=6U^RZx@wf)-RlijhEwp-CWwB=0r0zxw0*zTIzkc4lXG_I!9)$Wq*D z8~^}ILn%QK0Dw^&F^e%ZI$MLvj~E4$77?-?GyKdQGA7t#l)Y&Hu-NJ|Fu<+SRYuby zd{O<}UvhgqbLY8%Yw)Wn28(k9;yTC$gFNrm-tO zAHG@+y^!sEDca0L2C|xFRaI)=+SVLSYs_d{j_l}|K^pBaV+Ts~9-ZEyr{cD~$9+5s zm6QABZfgmUPHEXK;y2?KHxXIvIHjJpNl`#5U|#82H_w|6woi7+8Ze)+fz9|Gj*G)H zncrDlt0cw(F|+lPfkQsF6*u&Pm^9n_o-iRVWmuKHd#PeI$(xxp|J3B`BHqn_OOldU zyTN_@*Cq?MsnOsq{$ut_$zk{S)7mM!KWY3dptP;40B-`j(%KGVmb=rvf!S6C>w4>t z+QW9!!K9Vh%eBh2u762@b47v`z_7B|bnFbv^%PNEKbF^5lWVJt0L)8-is(h`jm#$= zlp=#DX4JPHelU6=`^5rb&PDdb5A;7ikF(jZjPAf5m~zX^oL6DeaiG_z8`F~=AWp+X z&BOsVV&R^;b^2kzwSzq2`n?qrXR<}w`n)C&?+Wb#Y{*&B^Iq609ORUfE+#t_4uC5t z#iTB?V>`f%(LnGTiL3s`sqnR81?46y-z?&`$RVd;@}Xu#J?vZ&slzU$nq)SLoWj|( zml@bQni8|98j&YvXtGH)rGD!epD+5Vf|T7tcdnDo$js&}SY>V8PM%eB-a&yY`?6Xz zZ-ljfG2O)4WTLLRV(qlODyjXY6i1Y${0%Da4zJtod zzcqoMcuBf?jn5;)4c*OD`a7!gDa{|GU*y73=Z5SNozTi}>?5)`RU}jx`*D2Bl`R*1(W)qf!NanyLT0_XXAVBv85lUKXHS5%?2>;H>?$^h3(D z0<4=`&}mM$ch`^=mza80Z#NYxXQ4X;f@%>upx{hugle5U3{9$t9|uJOODlM#f}63Q zw4LlxJ_l78+#c)iLKbpCfDY8G3cn-X6;2cK}@n&4c%R0I)));u+*g|nL>LVwI z>ELlh7B;0A|Es<-PmDJtd&MO+mm)jMoODTVE`*m(YA%b vLx1ED&JpmBq*dhcV8ThQ1REhqL`+?mEJGYmY&u~4y+CMiSWxZu_}qU0woMjy literal 0 HcmV?d00001 diff --git a/PLCCommunication/Resources/red.png b/PLCCommunication/Resources/red.png new file mode 100644 index 0000000000000000000000000000000000000000..c05a90ab28b9b1e7f0953ef3183e5e5d5772feca GIT binary patch literal 2320 zcmd5;`&ScZ8lG4L3TuD@4JemY+XL<*C@L(W6C@ATn z<+gjM#}x>Wq#h8Kq!w2$;ST{khBKfeS)wy80Z;fckKFQ(Mo zgZJI7e~8byU!$F!GONzt^!wGa;*Ej_H*PH{_~f~inKZXuR#x1npK+QZ&6|^&$?0p& zkMesjhKcG5l1t+>2E|6SVliW#bmX4>*ttp}qxLMld&?TWLQ=0~=zLGfXGLZmkHAXFuwIpX@3z_&2A-b2o{10s5P)%-bEMExqhc32u`>4NvSLtJ} z8l_oLhi`Hmw#qpktA=i$jAwyAeK%ZeYLjQC&*~q)Bh1uz*?B(SrTa2-UH>8`IK;hw zrFd&)^^>kfJ5F)*&=3tjqLFGm-PLn`I)zxSZ4^x-A0X0Mtdb?FLHzh5pqHA++z=Kwkmm42UUJ@70C=P+A>8yzK!7j$I_GC5qq$xTAKv(Trft5^nKes?dX_li&kh4#%H z#7E|sl&M-y&TeFQ03UcgJZq}l>!LgIz=WOZyv*eV@LT_Zo>-1h-r3uyf$?f$!>c*( zF_3X$_al=xJqAWU!#{0qX-%bMtY+#0iQ_42`cpnK{XQo5t0ixc`LB_vD-L+L3;tk6 zs`*RHF`?KiLQLMI=v)pU^I=#-8+v<4mX#;HXr4J0w#GY5U7IK&x72;>5mzX$-=~_I z(+7`NauY2@dfQyoiQwP##g9~H14v4|Z^Hr9-WxYk{gH)bzYS5gS^kL#p^{FpDDAzY zVGat`OkF78%+VSDT_%<7a0m#i&bBPGcUAw)vOtA$nMIsVL?HbBmj$50pS2jkZ%1nf z+IGZY~eUtvD?W z6YM-%S{h42nh7Ptwo8|C~Ty8tRYztW1)8fQXD4W1}lvP7NruPbd+J} zRq|BV&mheufVm%(L!gXDq%hVocqL<`a`1}Gw0M!DcU}B5N59)eoh8(^$0~7J?Qx~? zIdDt?WhW>>z%M~r49bNYIJUV zf;cYq?)vq4^UZ)qrz@Dk^&7N9!5-@VfQ8x6L7u828EHNSZ1XgcO5+1o_ST#HnWs@j zNm`CxB%ut<%c-|{m`%}nZM(z#6wda>9)h4PU7-87G+=M?6kyYDr$6qWkLYa!!~(Xq zy>_;5j_v)=Ygh;E$|*p!r342UAqAIHG_4=$s5vN0mXse?Qth%iMUE5wxSN8fI`l{F zmTS|!ASG4Ao%VUFj5WyKEI@t=*4YLkOG?~55q~0-RX9o$%)8-oYfs}oo!e{3+%j6| zi~d!3(&4~KpHdt6;Y<9BWf?QoLt=PE=SO_3KJ+?&4*4z?9rvpwn-1|CPhjj^sUg)# ztqbBy^(bSRUVF!lsuAGVCg|Vx?}NVq!zL6>I4maj+QSnE@TyR(@UW<+XCM4z1HV+; z65QaaUOuYJE|f38RbJe8kv<=E{B$MR;KJ_@!BkCA4!_$^oh0F}wno^5TEWlK@jp~Z zD;jMj^Cxv5ceR9iRy7scA)kOxJh_&P*zv!)hw)hSF=}An$W{D81*0Ow6<%t={j%f+ zPe%zcJBFp=bTNnLi&TA$MmSt%<-f^a2uI!jGp;5zMS=rZ(<4*;kukIx#BTzcn>%Vrxs^nMbog@f72Bfv+i};`Lpvn_-U%Nj;SQo))O-%BH6$9 UmHBT}@CO3LFj$ca`q@kW1{hv~-T(jq literal 0 HcmV?d00001 diff --git a/PLCCommunication/TriggerUI.Designer.cs b/PLCCommunication/TriggerUI.Designer.cs new file mode 100644 index 0000000..74d1078 --- /dev/null +++ b/PLCCommunication/TriggerUI.Designer.cs @@ -0,0 +1,297 @@ + +using System.Windows.Forms; + +namespace PLCCommunication +{ + partial class TriggerUI + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.label8 = new System.Windows.Forms.Label(); + this.cbo_WriteType = new System.Windows.Forms.ComboBox(); + this.label11 = new System.Windows.Forms.Label(); + this.label10 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.txtResultAddr = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.txtReadLength = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.txtReadAddr = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.cbIsRead = new System.Windows.Forms.CheckBox(); + this.cboReadType = new System.Windows.Forms.ComboBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.cboTriggerType = new System.Windows.Forms.ComboBox(); + this.txtTriggerAddr = new System.Windows.Forms.TextBox(); + this.txtTrrigerCommand = new System.Windows.Forms.TextBox(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Font = new System.Drawing.Font("黑体", 12.75F); + this.label8.Location = new System.Drawing.Point(6, 53); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(98, 17); + this.label8.TabIndex = 50; + this.label8.Text = "触发指令:"; + // + // cbo_WriteType + // + this.cbo_WriteType.Font = new System.Drawing.Font("黑体", 12.75F); + this.cbo_WriteType.FormattingEnabled = true; + this.cbo_WriteType.Location = new System.Drawing.Point(373, 81); + this.cbo_WriteType.Name = "cbo_WriteType"; + this.cbo_WriteType.Size = new System.Drawing.Size(101, 25); + this.cbo_WriteType.TabIndex = 49; + this.cbo_WriteType.SelectedIndexChanged += new System.EventHandler(this.cbo_WriteType_SelectedIndexChanged); + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Font = new System.Drawing.Font("黑体", 12.75F); + this.label11.Location = new System.Drawing.Point(276, 84); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(98, 17); + this.label11.TabIndex = 48; + this.label11.Text = "写入类型:"; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Font = new System.Drawing.Font("黑体", 12.75F); + this.label10.Location = new System.Drawing.Point(277, 22); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(98, 17); + this.label10.TabIndex = 47; + this.label10.Text = "接收类型:"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Font = new System.Drawing.Font("黑体", 12.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label5.Location = new System.Drawing.Point(6, 23); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(134, 17); + this.label5.TabIndex = 44; + this.label5.Text = "接收触发地址:"; + // + // txtResultAddr + // + this.txtResultAddr.Font = new System.Drawing.Font("黑体", 12.75F); + this.txtResultAddr.Location = new System.Drawing.Point(170, 81); + this.txtResultAddr.Name = "txtResultAddr"; + this.txtResultAddr.Size = new System.Drawing.Size(97, 27); + this.txtResultAddr.TabIndex = 43; + this.txtResultAddr.Text = "D4960"; + this.txtResultAddr.TextChanged += new System.EventHandler(this.txtResultAddr_TextChanged); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Font = new System.Drawing.Font("黑体", 12.75F); + this.label4.Location = new System.Drawing.Point(6, 85); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(170, 17); + this.label4.TabIndex = 42; + this.label4.Text = "结果写入起始地址:"; + // + // txtReadLength + // + this.txtReadLength.Font = new System.Drawing.Font("黑体", 12.75F); + this.txtReadLength.Location = new System.Drawing.Point(177, 49); + this.txtReadLength.Name = "txtReadLength"; + this.txtReadLength.Size = new System.Drawing.Size(45, 27); + this.txtReadLength.TabIndex = 56; + this.txtReadLength.Text = "1"; + this.txtReadLength.TextChanged += new System.EventHandler(this.txtReadLength_TextChanged); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("黑体", 10F); + this.label1.Location = new System.Drawing.Point(162, 29); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(63, 14); + this.label1.TabIndex = 55; + this.label1.Text = "接收长度"; + // + // txtReadAddr + // + this.txtReadAddr.Font = new System.Drawing.Font("黑体", 12.75F); + this.txtReadAddr.Location = new System.Drawing.Point(36, 49); + this.txtReadAddr.Name = "txtReadAddr"; + this.txtReadAddr.Size = new System.Drawing.Size(97, 27); + this.txtReadAddr.TabIndex = 53; + this.txtReadAddr.Text = "D4610"; + this.txtReadAddr.TextChanged += new System.EventHandler(this.txtReadAddr_TextChanged); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("黑体", 10F); + this.label3.Location = new System.Drawing.Point(293, 29); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(63, 14); + this.label3.TabIndex = 58; + this.label3.Text = "接收类型"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("黑体", 10F); + this.label2.Location = new System.Drawing.Point(11, 29); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(119, 14); + this.label2.TabIndex = 52; + this.label2.Text = "批量读取起始地址"; + // + // cbIsRead + // + this.cbIsRead.AutoSize = true; + this.cbIsRead.Font = new System.Drawing.Font("黑体", 10F); + this.cbIsRead.Location = new System.Drawing.Point(406, 49); + this.cbIsRead.Name = "cbIsRead"; + this.cbIsRead.Size = new System.Drawing.Size(54, 18); + this.cbIsRead.TabIndex = 59; + this.cbIsRead.Text = "启用"; + this.cbIsRead.UseVisualStyleBackColor = true; + this.cbIsRead.CheckedChanged += new System.EventHandler(this.cbIsRead_CheckedChanged); + // + // cboReadType + // + this.cboReadType.Font = new System.Drawing.Font("黑体", 12.75F); + this.cboReadType.FormattingEnabled = true; + this.cboReadType.Location = new System.Drawing.Point(283, 51); + this.cboReadType.Name = "cboReadType"; + this.cboReadType.Size = new System.Drawing.Size(94, 25); + this.cboReadType.TabIndex = 57; + this.cboReadType.SelectedIndexChanged += new System.EventHandler(this.cboReadType_SelectedIndexChanged); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.cboReadType); + this.groupBox1.Controls.Add(this.cbIsRead); + this.groupBox1.Controls.Add(this.label2); + this.groupBox1.Controls.Add(this.label3); + this.groupBox1.Controls.Add(this.txtReadAddr); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Controls.Add(this.txtReadLength); + this.groupBox1.Font = new System.Drawing.Font("黑体", 12.75F); + this.groupBox1.Location = new System.Drawing.Point(14, 148); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(477, 86); + this.groupBox1.TabIndex = 60; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "批量读取PLC数据"; + // + // cboTriggerType + // + this.cboTriggerType.Font = new System.Drawing.Font("黑体", 12.75F); + this.cboTriggerType.FormattingEnabled = true; + this.cboTriggerType.Location = new System.Drawing.Point(373, 19); + this.cboTriggerType.Name = "cboTriggerType"; + this.cboTriggerType.Size = new System.Drawing.Size(101, 25); + this.cboTriggerType.TabIndex = 46; + this.cboTriggerType.SelectedIndexChanged += new System.EventHandler(this.cboTriggerType_SelectedIndexChanged); + // + // txtTriggerAddr + // + this.txtTriggerAddr.Font = new System.Drawing.Font("黑体", 12.75F); + this.txtTriggerAddr.Location = new System.Drawing.Point(170, 19); + this.txtTriggerAddr.Name = "txtTriggerAddr"; + this.txtTriggerAddr.Size = new System.Drawing.Size(97, 27); + this.txtTriggerAddr.TabIndex = 45; + this.txtTriggerAddr.Text = "D4610"; + this.txtTriggerAddr.TextChanged += new System.EventHandler(this.txtTriggerAddr_TextChanged); + // + // txtTrrigerCommand + // + this.txtTrrigerCommand.Font = new System.Drawing.Font("黑体", 12.75F); + this.txtTrrigerCommand.Location = new System.Drawing.Point(170, 50); + this.txtTrrigerCommand.Name = "txtTrrigerCommand"; + this.txtTrrigerCommand.Size = new System.Drawing.Size(97, 27); + this.txtTrrigerCommand.TabIndex = 51; + this.txtTrrigerCommand.Text = "1"; + this.txtTrrigerCommand.TextChanged += new System.EventHandler(this.txtTrrigerCommand_TextChanged); + // + // TriggerUI + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.White; + this.Controls.Add(this.cboTriggerType); + this.Controls.Add(this.txtTrrigerCommand); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.label8); + this.Controls.Add(this.cbo_WriteType); + this.Controls.Add(this.label11); + this.Controls.Add(this.label10); + this.Controls.Add(this.txtTriggerAddr); + this.Controls.Add(this.label5); + this.Controls.Add(this.txtResultAddr); + this.Controls.Add(this.label4); + this.Name = "TriggerUI"; + this.Size = new System.Drawing.Size(513, 244); + this.Load += new System.EventHandler(this.TriggerUI_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private Label label8; + + private ComboBox cbo_WriteType; + + private Label label11; + + private Label label10; + + private Label label5; + + private TextBox txtResultAddr; + + private Label label4; + private TextBox txtReadLength; + private Label label1; + private TextBox txtReadAddr; + private Label label3; + private Label label2; + private CheckBox cbIsRead; + private ComboBox cboReadType; + private GroupBox groupBox1; + private ComboBox cboTriggerType; + private TextBox txtTriggerAddr; + private TextBox txtTrrigerCommand; + } +} diff --git a/PLCCommunication/TriggerUI.cs b/PLCCommunication/TriggerUI.cs new file mode 100644 index 0000000..4e0e6dc --- /dev/null +++ b/PLCCommunication/TriggerUI.cs @@ -0,0 +1,120 @@ + +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 PLCCommunication +{ + public partial class TriggerUI : UserControl + { + public delegate void TrgParamChangeHandler(int Index); + + public TriggerParams TrgParams = new TriggerParams(); + + public event TrgParamChangeHandler TrgParamChangeEvent; + + public TriggerUI() + { + InitializeComponent(); + } + + public TriggerUI(TriggerParams _trgParam) + { + InitializeComponent(); + cbo_WriteType.DataSource = Enum.GetNames(typeof(VarType)); + cboTriggerType.DataSource = Enum.GetNames(typeof(VarType)); + cboReadType.DataSource = Enum.GetNames(typeof(VarType)); + TrgParams = _trgParam; + } + + private void TriggerUI_Load(object sender, EventArgs e) + { + txtResultAddr.Text = TrgParams.ResultAddr; + txtTriggerAddr.Text = TrgParams.TriggerAddr; + txtTrrigerCommand.Text = TrgParams.TriggerCmd; + txtReadAddr.Text = TrgParams.ReadAddr; + txtReadLength.Text =TrgParams.ReadLength.ToString(); + cboReadType.Text = TrgParams.ReadType.ToString(); + cbo_WriteType.Text = TrgParams.ResultType.ToString(); + cboTriggerType.Text = TrgParams.TriggerType.ToString(); + cbIsRead.Checked = TrgParams.IsRead; + } + + private void cbo_WriteType_SelectedIndexChanged(object sender, EventArgs e) + { + TrgParams.ResultType = (VarType)Enum.Parse(typeof(VarType), cbo_WriteType.SelectedItem.ToString(), false); + OnTrgParamChange(TrgParams.Index); + } + + private void cboTriggerType_SelectedIndexChanged(object sender, EventArgs e) + { + TrgParams.TriggerType = (VarType)Enum.Parse(typeof(VarType), cboTriggerType.SelectedItem.ToString(), false); + OnTrgParamChange(TrgParams.Index); + } + + private void txtResultAddr_TextChanged(object sender, EventArgs e) + { + TrgParams.ResultAddr = txtResultAddr.Text; + OnTrgParamChange(TrgParams.Index); + } + + private void txtTriggerAddr_TextChanged(object sender, EventArgs e) + { + TrgParams.TriggerAddr = txtTriggerAddr.Text; + OnTrgParamChange(TrgParams.Index); + } + + private void txtTrrigerCommand_TextChanged(object sender, EventArgs e) + { + TrgParams.TriggerCmd = txtTrrigerCommand.Text; + OnTrgParamChange(TrgParams.Index); + } + + public void OnTrgParamChange(int Index) + { + if (this.TrgParamChangeEvent != null) + { + this.TrgParamChangeEvent(Index); + } + } + + private void txtReadAddr_TextChanged(object sender, EventArgs e) + { + TrgParams.ReadAddr = txtReadAddr.Text; + OnTrgParamChange(TrgParams.Index); + } + + private void txtReadLength_TextChanged(object sender, EventArgs e) + { + TrgParams.ReadLength =int.Parse( txtReadLength.Text.Trim()); + OnTrgParamChange(TrgParams.Index); + } + + private void cboReadType_SelectedIndexChanged(object sender, EventArgs e) + { + TrgParams.ReadType = (VarType)Enum.Parse(typeof(VarType), cboReadType.SelectedItem.ToString(), false); + OnTrgParamChange(TrgParams.Index); + } + + private void cbIsRead_CheckedChanged(object sender, EventArgs e) + { + if (cbIsRead.Checked) + { + TrgParams.IsRead = true; + + } + else + { + TrgParams.IsRead = false; + } + + OnTrgParamChange(TrgParams.Index); + } + } +} diff --git a/PLCCommunication/TriggerUI.resx b/PLCCommunication/TriggerUI.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/PLCCommunication/TriggerUI.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/README.en.md b/README.en.md new file mode 100644 index 0000000..d89c5a6 --- /dev/null +++ b/README.en.md @@ -0,0 +1,36 @@ +# 1319上位机 + +#### Description +{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**} + +#### Software Architecture +Software architecture description + +#### Installation + +1. xxxx +2. xxxx +3. xxxx + +#### Instructions + +1. xxxx +2. xxxx +3. xxxx + +#### Contribution + +1. Fork the repository +2. Create Feat_xxx branch +3. Commit your code +4. Create Pull Request + + +#### Gitee Feature + +1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md +2. Gitee blog [blog.gitee.com](https://blog.gitee.com) +3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) +4. The most valuable open source project [GVP](https://gitee.com/gvp) +5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) +6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README.md b/README.md new file mode 100644 index 0000000..314fb18 --- /dev/null +++ b/README.md @@ -0,0 +1,39 @@ +# 1319上位机 + +#### 介绍 +{**以下是 Gitee 平台说明,您可以替换此简介** +Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台 +无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)} + +#### 软件架构 +软件架构说明 + + +#### 安装教程 + +1. xxxx +2. xxxx +3. xxxx + +#### 使用说明 + +1. xxxx +2. xxxx +3. xxxx + +#### 参与贡献 + +1. Fork 本仓库 +2. 新建 Feat_xxx 分支 +3. 提交代码 +4. 新建 Pull Request + + +#### 特技 + +1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md +2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) +3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 +4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 +5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) +6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/S1270.sln b/S1270.sln new file mode 100644 index 0000000..a34129d --- /dev/null +++ b/S1270.sln @@ -0,0 +1,149 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29403.142 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JY.Model", "JY.Model\JY.Model.csproj", "{F7DB3A93-FCA2-479B-8B2E-380116AAE9FC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JY.DAL", "JY.DAL\JY.DAL.csproj", "{D5889580-58F9-467E-87D3-EFA37A300E67}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JY.Inspection", "JY.Inspection\JY.Inspection.csproj", "{607AF967-65F7-483E-8BD9-2D92AD17D151}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JY.Utility", "JY.Utility\JY.Utility.csproj", "{76DE07E0-9E97-44AB-8148-01B44C5C1ADD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JY.Control", "JY.Control\JY.Control.csproj", "{01A2AA2C-9B80-41AA-9F47-3CB67E60AF24}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PLCCommunication", "PLCCommunication\PLCCommunication.csproj", "{796C9DFE-1D66-4921-B998-C5FCF15C2983}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleCommunication", "SimpleServer\SimpleCommunication.csproj", "{D73FAE32-AAA3-4A51-BB0A-F1A5DC5A7260}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SocketHelper", "SocketHelper\SocketHelper.csproj", "{2E9AC112-75CC-4FB6-B058-F9C7424514EF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JY.MES", "JY.MES\JY.MES.csproj", "{168C8644-3975-450D-94D2-29D21C135C16}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F7DB3A93-FCA2-479B-8B2E-380116AAE9FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F7DB3A93-FCA2-479B-8B2E-380116AAE9FC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F7DB3A93-FCA2-479B-8B2E-380116AAE9FC}.Debug|x64.ActiveCfg = Debug|Any CPU + {F7DB3A93-FCA2-479B-8B2E-380116AAE9FC}.Debug|x64.Build.0 = Debug|Any CPU + {F7DB3A93-FCA2-479B-8B2E-380116AAE9FC}.Debug|x86.ActiveCfg = Debug|Any CPU + {F7DB3A93-FCA2-479B-8B2E-380116AAE9FC}.Debug|x86.Build.0 = Debug|Any CPU + {F7DB3A93-FCA2-479B-8B2E-380116AAE9FC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F7DB3A93-FCA2-479B-8B2E-380116AAE9FC}.Release|Any CPU.Build.0 = Release|Any CPU + {F7DB3A93-FCA2-479B-8B2E-380116AAE9FC}.Release|x64.ActiveCfg = Release|Any CPU + {F7DB3A93-FCA2-479B-8B2E-380116AAE9FC}.Release|x64.Build.0 = Release|Any CPU + {F7DB3A93-FCA2-479B-8B2E-380116AAE9FC}.Release|x86.ActiveCfg = Release|Any CPU + {F7DB3A93-FCA2-479B-8B2E-380116AAE9FC}.Release|x86.Build.0 = Release|Any CPU + {D5889580-58F9-467E-87D3-EFA37A300E67}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D5889580-58F9-467E-87D3-EFA37A300E67}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D5889580-58F9-467E-87D3-EFA37A300E67}.Debug|x64.ActiveCfg = Debug|Any CPU + {D5889580-58F9-467E-87D3-EFA37A300E67}.Debug|x64.Build.0 = Debug|Any CPU + {D5889580-58F9-467E-87D3-EFA37A300E67}.Debug|x86.ActiveCfg = Debug|Any CPU + {D5889580-58F9-467E-87D3-EFA37A300E67}.Debug|x86.Build.0 = Debug|Any CPU + {D5889580-58F9-467E-87D3-EFA37A300E67}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D5889580-58F9-467E-87D3-EFA37A300E67}.Release|Any CPU.Build.0 = Release|Any CPU + {D5889580-58F9-467E-87D3-EFA37A300E67}.Release|x64.ActiveCfg = Release|Any CPU + {D5889580-58F9-467E-87D3-EFA37A300E67}.Release|x64.Build.0 = Release|Any CPU + {D5889580-58F9-467E-87D3-EFA37A300E67}.Release|x86.ActiveCfg = Release|Any CPU + {D5889580-58F9-467E-87D3-EFA37A300E67}.Release|x86.Build.0 = Release|Any CPU + {607AF967-65F7-483E-8BD9-2D92AD17D151}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {607AF967-65F7-483E-8BD9-2D92AD17D151}.Debug|Any CPU.Build.0 = Debug|Any CPU + {607AF967-65F7-483E-8BD9-2D92AD17D151}.Debug|x64.ActiveCfg = Debug|Any CPU + {607AF967-65F7-483E-8BD9-2D92AD17D151}.Debug|x64.Build.0 = Debug|Any CPU + {607AF967-65F7-483E-8BD9-2D92AD17D151}.Debug|x86.ActiveCfg = Debug|Any CPU + {607AF967-65F7-483E-8BD9-2D92AD17D151}.Debug|x86.Build.0 = Debug|Any CPU + {607AF967-65F7-483E-8BD9-2D92AD17D151}.Release|Any CPU.ActiveCfg = Release|Any CPU + {607AF967-65F7-483E-8BD9-2D92AD17D151}.Release|Any CPU.Build.0 = Release|Any CPU + {607AF967-65F7-483E-8BD9-2D92AD17D151}.Release|x64.ActiveCfg = Release|Any CPU + {607AF967-65F7-483E-8BD9-2D92AD17D151}.Release|x64.Build.0 = Release|Any CPU + {607AF967-65F7-483E-8BD9-2D92AD17D151}.Release|x86.ActiveCfg = Release|Any CPU + {607AF967-65F7-483E-8BD9-2D92AD17D151}.Release|x86.Build.0 = Release|Any CPU + {76DE07E0-9E97-44AB-8148-01B44C5C1ADD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {76DE07E0-9E97-44AB-8148-01B44C5C1ADD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {76DE07E0-9E97-44AB-8148-01B44C5C1ADD}.Debug|x64.ActiveCfg = Debug|Any CPU + {76DE07E0-9E97-44AB-8148-01B44C5C1ADD}.Debug|x64.Build.0 = Debug|Any CPU + {76DE07E0-9E97-44AB-8148-01B44C5C1ADD}.Debug|x86.ActiveCfg = Debug|Any CPU + {76DE07E0-9E97-44AB-8148-01B44C5C1ADD}.Debug|x86.Build.0 = Debug|Any CPU + {76DE07E0-9E97-44AB-8148-01B44C5C1ADD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {76DE07E0-9E97-44AB-8148-01B44C5C1ADD}.Release|Any CPU.Build.0 = Release|Any CPU + {76DE07E0-9E97-44AB-8148-01B44C5C1ADD}.Release|x64.ActiveCfg = Release|Any CPU + {76DE07E0-9E97-44AB-8148-01B44C5C1ADD}.Release|x64.Build.0 = Release|Any CPU + {76DE07E0-9E97-44AB-8148-01B44C5C1ADD}.Release|x86.ActiveCfg = Release|Any CPU + {76DE07E0-9E97-44AB-8148-01B44C5C1ADD}.Release|x86.Build.0 = Release|Any CPU + {01A2AA2C-9B80-41AA-9F47-3CB67E60AF24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {01A2AA2C-9B80-41AA-9F47-3CB67E60AF24}.Debug|Any CPU.Build.0 = Debug|Any CPU + {01A2AA2C-9B80-41AA-9F47-3CB67E60AF24}.Debug|x64.ActiveCfg = Debug|Any CPU + {01A2AA2C-9B80-41AA-9F47-3CB67E60AF24}.Debug|x64.Build.0 = Debug|Any CPU + {01A2AA2C-9B80-41AA-9F47-3CB67E60AF24}.Debug|x86.ActiveCfg = Debug|Any CPU + {01A2AA2C-9B80-41AA-9F47-3CB67E60AF24}.Debug|x86.Build.0 = Debug|Any CPU + {01A2AA2C-9B80-41AA-9F47-3CB67E60AF24}.Release|Any CPU.ActiveCfg = Release|Any CPU + {01A2AA2C-9B80-41AA-9F47-3CB67E60AF24}.Release|Any CPU.Build.0 = Release|Any CPU + {01A2AA2C-9B80-41AA-9F47-3CB67E60AF24}.Release|x64.ActiveCfg = Release|Any CPU + {01A2AA2C-9B80-41AA-9F47-3CB67E60AF24}.Release|x64.Build.0 = Release|Any CPU + {01A2AA2C-9B80-41AA-9F47-3CB67E60AF24}.Release|x86.ActiveCfg = Release|Any CPU + {01A2AA2C-9B80-41AA-9F47-3CB67E60AF24}.Release|x86.Build.0 = Release|Any CPU + {796C9DFE-1D66-4921-B998-C5FCF15C2983}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {796C9DFE-1D66-4921-B998-C5FCF15C2983}.Debug|Any CPU.Build.0 = Debug|Any CPU + {796C9DFE-1D66-4921-B998-C5FCF15C2983}.Debug|x64.ActiveCfg = Debug|Any CPU + {796C9DFE-1D66-4921-B998-C5FCF15C2983}.Debug|x64.Build.0 = Debug|Any CPU + {796C9DFE-1D66-4921-B998-C5FCF15C2983}.Debug|x86.ActiveCfg = Debug|Any CPU + {796C9DFE-1D66-4921-B998-C5FCF15C2983}.Debug|x86.Build.0 = Debug|Any CPU + {796C9DFE-1D66-4921-B998-C5FCF15C2983}.Release|Any CPU.ActiveCfg = Release|Any CPU + {796C9DFE-1D66-4921-B998-C5FCF15C2983}.Release|Any CPU.Build.0 = Release|Any CPU + {796C9DFE-1D66-4921-B998-C5FCF15C2983}.Release|x64.ActiveCfg = Release|Any CPU + {796C9DFE-1D66-4921-B998-C5FCF15C2983}.Release|x64.Build.0 = Release|Any CPU + {796C9DFE-1D66-4921-B998-C5FCF15C2983}.Release|x86.ActiveCfg = Release|Any CPU + {796C9DFE-1D66-4921-B998-C5FCF15C2983}.Release|x86.Build.0 = Release|Any CPU + {D73FAE32-AAA3-4A51-BB0A-F1A5DC5A7260}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D73FAE32-AAA3-4A51-BB0A-F1A5DC5A7260}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D73FAE32-AAA3-4A51-BB0A-F1A5DC5A7260}.Debug|x64.ActiveCfg = Debug|x64 + {D73FAE32-AAA3-4A51-BB0A-F1A5DC5A7260}.Debug|x64.Build.0 = Debug|x64 + {D73FAE32-AAA3-4A51-BB0A-F1A5DC5A7260}.Debug|x86.ActiveCfg = Debug|x86 + {D73FAE32-AAA3-4A51-BB0A-F1A5DC5A7260}.Debug|x86.Build.0 = Debug|x86 + {D73FAE32-AAA3-4A51-BB0A-F1A5DC5A7260}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D73FAE32-AAA3-4A51-BB0A-F1A5DC5A7260}.Release|Any CPU.Build.0 = Release|Any CPU + {D73FAE32-AAA3-4A51-BB0A-F1A5DC5A7260}.Release|x64.ActiveCfg = Release|x64 + {D73FAE32-AAA3-4A51-BB0A-F1A5DC5A7260}.Release|x64.Build.0 = Release|x64 + {D73FAE32-AAA3-4A51-BB0A-F1A5DC5A7260}.Release|x86.ActiveCfg = Release|x86 + {D73FAE32-AAA3-4A51-BB0A-F1A5DC5A7260}.Release|x86.Build.0 = Release|x86 + {2E9AC112-75CC-4FB6-B058-F9C7424514EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2E9AC112-75CC-4FB6-B058-F9C7424514EF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2E9AC112-75CC-4FB6-B058-F9C7424514EF}.Debug|x64.ActiveCfg = Debug|Any CPU + {2E9AC112-75CC-4FB6-B058-F9C7424514EF}.Debug|x64.Build.0 = Debug|Any CPU + {2E9AC112-75CC-4FB6-B058-F9C7424514EF}.Debug|x86.ActiveCfg = Debug|Any CPU + {2E9AC112-75CC-4FB6-B058-F9C7424514EF}.Debug|x86.Build.0 = Debug|Any CPU + {2E9AC112-75CC-4FB6-B058-F9C7424514EF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2E9AC112-75CC-4FB6-B058-F9C7424514EF}.Release|Any CPU.Build.0 = Release|Any CPU + {2E9AC112-75CC-4FB6-B058-F9C7424514EF}.Release|x64.ActiveCfg = Release|Any CPU + {2E9AC112-75CC-4FB6-B058-F9C7424514EF}.Release|x64.Build.0 = Release|Any CPU + {2E9AC112-75CC-4FB6-B058-F9C7424514EF}.Release|x86.ActiveCfg = Release|Any CPU + {2E9AC112-75CC-4FB6-B058-F9C7424514EF}.Release|x86.Build.0 = Release|Any CPU + {168C8644-3975-450D-94D2-29D21C135C16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {168C8644-3975-450D-94D2-29D21C135C16}.Debug|Any CPU.Build.0 = Debug|Any CPU + {168C8644-3975-450D-94D2-29D21C135C16}.Debug|x64.ActiveCfg = Debug|Any CPU + {168C8644-3975-450D-94D2-29D21C135C16}.Debug|x64.Build.0 = Debug|Any CPU + {168C8644-3975-450D-94D2-29D21C135C16}.Debug|x86.ActiveCfg = Debug|Any CPU + {168C8644-3975-450D-94D2-29D21C135C16}.Debug|x86.Build.0 = Debug|Any CPU + {168C8644-3975-450D-94D2-29D21C135C16}.Release|Any CPU.ActiveCfg = Release|Any CPU + {168C8644-3975-450D-94D2-29D21C135C16}.Release|Any CPU.Build.0 = Release|Any CPU + {168C8644-3975-450D-94D2-29D21C135C16}.Release|x64.ActiveCfg = Release|Any CPU + {168C8644-3975-450D-94D2-29D21C135C16}.Release|x64.Build.0 = Release|Any CPU + {168C8644-3975-450D-94D2-29D21C135C16}.Release|x86.ActiveCfg = Release|Any CPU + {168C8644-3975-450D-94D2-29D21C135C16}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {DCC8281F-06BE-4262-A133-ECB6FAB4EF4C} + EndGlobalSection +EndGlobal diff --git a/SimpleServer/Client.cs b/SimpleServer/Client.cs new file mode 100644 index 0000000..dd851a9 --- /dev/null +++ b/SimpleServer/Client.cs @@ -0,0 +1,279 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Net.Sockets; +using System.Net; +using System.Windows.Forms; + +namespace SimpleCommunication +{ + public class Client : IDisposable + { + #region DataMember & Ctor + public TcpClient tcpclient; + private NetworkStream netstream; + public string IP; + public string Port; + private byte[] readBytes; + private object tcpClientLock = new object();//锁TcpClient;Dispose之后就不允许EndRead,远程连接断开以后,就不允许再调用Dispose + private bool closed = false;//包括本地主动断开和远程断开 + + //在事务处理结束后才触发下列事件 + public event DlgNoParam ConnectFailEvent; + public event DlgOneParam NewClientEvent; + public event DlgOneParam RecvMsgEvent; + public event DlgOneParam RemoteDisconnectEvent; + public event DlgNoParam LocalDisconnectEvent; + /// + /// 客户端是否链接 + /// + public bool IsConnected => (tcpclient != null && tcpclient.Connected) ? true : false; + /// + /// 服务的client的构造函数 + /// + /// + public Client(TcpClient tcpclient) + { + this.tcpclient = tcpclient; + readBytes = new byte[tcpclient.ReceiveBufferSize];//接收数据的缓冲区大小,如果太小一段数据会多次接收完成 + netstream = tcpclient.GetStream();//如果远程客户端断开一样可以获得netstream + } + + /// + /// 客户端client的构造函数 + /// + public Client() + { + } + #endregion + + #region 数据收发 + + /// + /// 在建立连接的情况下发送消息 + /// + /// + /// + public bool SendMsg(string msg) + { + bool result = false; + try + { + if (netstream != null) + { + if (!string.IsNullOrEmpty(msg)) + { + byte[] buff = Encoding.Default.GetBytes(msg); + netstream.Write(buff, 0, buff.Length); + + + result = true; + } + } + } + catch (Exception ex) + { + throw ex; + } + return result; + } + + + + + /// + /// 服务的接收到客户端连接后最先做的操作之一,客户端接收数据线程起始 + /// + /// + public bool BeginRead() + { + bool result = false; + try + { + IP = (tcpclient.Client.RemoteEndPoint as IPEndPoint).Address.ToString(); + Port = (tcpclient.Client.RemoteEndPoint as IPEndPoint).Port.ToString(); + if (NewClientEvent != null) + { + NewClientEvent(IP + " " + Port); + } + netstream.BeginRead(readBytes, 0, readBytes.Length, EndRead, null);//如果远程客户端断开这句话一样可以执行 + result = true; + } + catch + { + throw; + } + return result; + } + + /// + /// 有互斥资源 + /// 接收数据,远程连接断开,远程程序关闭,本地连接断开,都会按顺序调用进来;因为连接关闭后不再调用BeginRead + /// 服务器listener.stop时不会进入这个函数,客户端照样通讯,服务端只是不能接收新连接而已 + /// + /// + private void EndRead(IAsyncResult ar) + { + lock (tcpClientLock) + { + if (!closed)//如果本地主动断开就不会进入 + { + try + { + string recvStr = ""; + int count = netstream.EndRead(ar); + if (count > 0) + { + recvStr = Encoding.Default.GetString(readBytes, 0, count); + recvStr = DateTime.Now.ToString("HH:mm:ss") + " [" + IP + " " + Port + "] :\n" + recvStr + "\n"; + if (RecvMsgEvent != null) + { + RecvMsgEvent(recvStr); + } + readBytes = new byte[tcpclient.ReceiveBufferSize]; + netstream.BeginRead(readBytes, 0, readBytes.Length, EndRead, null); + } + else//远程客户端主动断开 + { + LocalClientClose(); + } + } + catch (Exception ex) + { + if (ex.Message.Contains("无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接")) + { + LocalClientClose(); + } + else + { + LocalClientClose(); + } + } + } + } + } + + #endregion + + #region 客户端连接和关闭 + + /// + /// 客户端的client连接服务器 + /// + /// + /// + /// + public bool Connect(ComboBox Server_IP, TextBox txtPort) + { + bool result = false; + try + { + + if (!string.IsNullOrEmpty(Server_IP.Text) && !string.IsNullOrEmpty(txtPort.Text)) + { + IP = Server_IP.Text.Trim(); + Port = txtPort.Text.Trim(); + IPAddress ipAddress = IPAddress.Parse(IP); + IPEndPoint point = new IPEndPoint(ipAddress, int.Parse(Port)); + tcpclient = new TcpClient(AddressFamily.InterNetwork); + readBytes = new byte[tcpclient.ReceiveBufferSize]; + tcpclient.Connect(point); + + netstream = tcpclient.GetStream(); + BeginRead(); + closed = false; + result = true; + } + } + catch (Exception ex) + { + if (ex.Message.Contains("由于目标计算机积极拒绝")) + { + if (ConnectFailEvent != null) + { + ConnectFailEvent(); + } + } + else + { + } + } + return result; + } + + /// + /// 远程连接断开后(点关闭断开,程序退出断开)本地连接处理 + /// + public void LocalClientClose() + { + closed = true; + DisposeEx(); + if (RemoteDisconnectEvent != null) + { + string param = IP + " " + Port; + if (RemoteDisconnectEvent != null) + { + RemoteDisconnectEvent(param); + } + } + } + + /// + /// 有互斥资源 + /// 在已连接条件下关闭本地连接和资源释放时调用 + /// + public void Dispose() + { + lock (tcpClientLock) + { + if (!closed) + { + closed = true; + DisposeEx(); + if (LocalDisconnectEvent != null) + { + LocalDisconnectEvent(); + } + } + } + } + + /// + /// 由Dispose和LocalClientClose调用 + /// + private void DisposeEx() + { + if (netstream != null) + { + netstream.Dispose(); + netstream = null; + } + if (tcpclient != null) + { + tcpclient.Close(); + tcpclient = null; + } + } + + #endregion + } + + /// <数据结构类> + /// 数据结构类 + /// + public class StateObject + { + //客户端Socket + public Socket workSocket = null; + //接收数据大小 + public const int BufferSize = 64; + // 声明接收数据 + public byte[] buffer = new byte[BufferSize]; + // 接收数据的内容 + public StringBuilder sb = new StringBuilder(); + /// + /// 通信方网络地址 + /// + public EndPoint SEndPoint; + } +} diff --git a/SimpleServer/ComConfig.cs b/SimpleServer/ComConfig.cs new file mode 100644 index 0000000..0168702 --- /dev/null +++ b/SimpleServer/ComConfig.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SimpleCommunication +{ + public class ComConfig + { + /// + /// 通讯块数量 + /// + public int Index; + /// + /// 是否自动链接 + /// + public bool Auto_Connect; + /// + /// 链接类型,0为服务端,1为客户端 + /// + public int Connect_Typt; + /// + /// PLC IP地址 + /// + public string TCP_IP; + /// + /// PLC端口号 + /// + public int TCP_Port; + /// + /// 串口名 + /// + public string COM_Port; + /// + /// 串口波特率 + /// + public int COM_BaudRate; + /// + /// 串口校验 + /// + public string COM_Parity; + /// + /// 串口数据位 + /// + public int COM_DataBit; + /// + /// 串口停止位 + /// + public int COM_StopBit; + /// + /// 是否启用心跳消息 + /// + public bool HeartBeat; + /// + /// 心跳设置地址 + /// + public string HeartText; + /// + /// 扫描间隔时间 + /// + public int HeartTime; + + + /// + /// 触发模块数量 + /// + public int JobCount; + /// + /// 结束符号 + /// + public int Endsymbol; + + //public List lstTgrParams; + } +} diff --git a/SimpleServer/CommonHelper.cs b/SimpleServer/CommonHelper.cs new file mode 100644 index 0000000..d3dc8dd --- /dev/null +++ b/SimpleServer/CommonHelper.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SimpleCommunication +{ + public delegate void DlgOneParam(T param); + public delegate void DlgNoParam(); + + public class CommonHelper + { + } +} diff --git a/SimpleServer/CommunUI.Designer.cs b/SimpleServer/CommunUI.Designer.cs new file mode 100644 index 0000000..cf53a5d --- /dev/null +++ b/SimpleServer/CommunUI.Designer.cs @@ -0,0 +1,907 @@ +namespace SimpleCommunication +{ + partial class CommunUI + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.info_Lab = new System.Windows.Forms.Label(); + this.txtRecv = new System.Windows.Forms.RichTextBox(); + this.txtLog = new System.Windows.Forms.TextBox(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.lbl_sendNum = new System.Windows.Forms.Label(); + this.label9 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.receive_CheckBox = new System.Windows.Forms.CheckBox(); + this.lbl_receiveNum = new System.Windows.Forms.Label(); + this.btnClear = new System.Windows.Forms.LinkLabel(); + this.com_GroupBox = new System.Windows.Forms.GroupBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label8 = new System.Windows.Forms.Label(); + this.stopBits_Box = new System.Windows.Forms.ComboBox(); + this.baudRate_Box = new System.Windows.Forms.ComboBox(); + this.label11 = new System.Windows.Forms.Label(); + this.parity_Box = new System.Windows.Forms.ComboBox(); + this.label12 = new System.Windows.Forms.Label(); + this.label13 = new System.Windows.Forms.Label(); + this.comPort_Box = new System.Windows.Forms.ComboBox(); + this.dataBits_Box = new System.Windows.Forms.ComboBox(); + this.tcp_GroupBox = new System.Windows.Forms.GroupBox(); + this.tbIP = new System.Windows.Forms.ComboBox(); + this.tbPort = new System.Windows.Forms.TextBox(); + this.label31 = new System.Windows.Forms.Label(); + this.label33 = new System.Windows.Forms.Label(); + this.tcpType_Box = new System.Windows.Forms.ComboBox(); + this.label29 = new System.Windows.Forms.Label(); + this.tcpBtn_Panel = new System.Windows.Forms.Panel(); + this.reloadtcp_Btn = new System.Windows.Forms.Button(); + this.btnStart = new System.Windows.Forms.Button(); + this.btnDisconnect = new System.Windows.Forms.Button(); + this.btnClose = new System.Windows.Forms.Button(); + this.comBtn_Panel = new System.Windows.Forms.Panel(); + this.reloadCOM_Btn = new System.Windows.Forms.Button(); + this.com_Btn = new System.Windows.Forms.Button(); + this.panel3 = new System.Windows.Forms.Panel(); + this.Server_GroupBox = new System.Windows.Forms.GroupBox(); + this.lbOnline = new System.Windows.Forms.ListBox(); + this.info_GroupBox = new System.Windows.Forms.GroupBox(); + this.txtSend = new System.Windows.Forms.RichTextBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.sendTest_CheckBox = new System.Windows.Forms.CheckBox(); + this.send_CheckBox = new System.Windows.Forms.CheckBox(); + this.sendTest_CheckCRLF = new System.Windows.Forms.CheckBox(); + this.btnSend = new System.Windows.Forms.Button(); + this.panel4 = new System.Windows.Forms.Panel(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.txtIntervalTime = new System.Windows.Forms.TextBox(); + this.cmbEndSymbol = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.pgeAuto_CheckBox = new System.Windows.Forms.CheckBox(); + this.txtHeartData = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.saveSetting_Btn = new System.Windows.Forms.Button(); + this.Auto_CheckBox = new System.Windows.Forms.CheckBox(); + this.tmHeart = new System.Windows.Forms.Timer(this.components); + this.checkBox1 = new System.Windows.Forms.CheckBox(); + this.groupBox2.SuspendLayout(); + this.com_GroupBox.SuspendLayout(); + this.tcp_GroupBox.SuspendLayout(); + this.tcpBtn_Panel.SuspendLayout(); + this.comBtn_Panel.SuspendLayout(); + this.panel3.SuspendLayout(); + this.Server_GroupBox.SuspendLayout(); + this.info_GroupBox.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.panel4.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.SuspendLayout(); + // + // info_Lab + // + this.info_Lab.BackColor = System.Drawing.Color.Red; + this.info_Lab.Font = new System.Drawing.Font("宋体", 15F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.info_Lab.ForeColor = System.Drawing.Color.White; + this.info_Lab.Location = new System.Drawing.Point(475, 0); + this.info_Lab.Name = "info_Lab"; + this.info_Lab.Size = new System.Drawing.Size(438, 33); + this.info_Lab.TabIndex = 103; + this.info_Lab.Text = "未连接"; + this.info_Lab.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // txtRecv + // + this.txtRecv.BackColor = System.Drawing.SystemColors.Window; + this.txtRecv.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtRecv.Location = new System.Drawing.Point(3, 17); + this.txtRecv.Name = "txtRecv"; + this.txtRecv.ReadOnly = true; + this.txtRecv.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical; + this.txtRecv.Size = new System.Drawing.Size(467, 337); + this.txtRecv.TabIndex = 104; + this.txtRecv.Text = ""; + // + // txtLog + // + this.txtLog.BackColor = System.Drawing.SystemColors.Window; + this.txtLog.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtLog.Location = new System.Drawing.Point(3, 16); + this.txtLog.Multiline = true; + this.txtLog.Name = "txtLog"; + this.txtLog.ReadOnly = true; + this.txtLog.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtLog.Size = new System.Drawing.Size(257, 163); + this.txtLog.TabIndex = 105; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.lbl_sendNum); + this.groupBox2.Controls.Add(this.txtRecv); + this.groupBox2.Controls.Add(this.label9); + this.groupBox2.Controls.Add(this.label5); + this.groupBox2.Controls.Add(this.receive_CheckBox); + this.groupBox2.Controls.Add(this.lbl_receiveNum); + this.groupBox2.Controls.Add(this.btnClear); + this.groupBox2.Location = new System.Drawing.Point(0, 3); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(473, 357); + this.groupBox2.TabIndex = 107; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "接收文本"; + // + // lbl_sendNum + // + this.lbl_sendNum.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.lbl_sendNum.AutoSize = true; + this.lbl_sendNum.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lbl_sendNum.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48))))); + this.lbl_sendNum.Location = new System.Drawing.Point(291, 0); + this.lbl_sendNum.Name = "lbl_sendNum"; + this.lbl_sendNum.Size = new System.Drawing.Size(15, 17); + this.lbl_sendNum.TabIndex = 222; + this.lbl_sendNum.Text = "0"; + // + // label9 + // + this.label9.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.label9.AutoSize = true; + this.label9.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label9.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48))))); + this.label9.Location = new System.Drawing.Point(319, -3); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(79, 20); + this.label9.TabIndex = 219; + this.label9.Text = "接收次数:"; + // + // label5 + // + this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.label5.AutoSize = true; + this.label5.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label5.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48))))); + this.label5.Location = new System.Drawing.Point(213, -3); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(79, 20); + this.label5.TabIndex = 221; + this.label5.Text = "发送次数:"; + // + // receive_CheckBox + // + this.receive_CheckBox.AutoSize = true; + this.receive_CheckBox.BackColor = System.Drawing.SystemColors.Control; + this.receive_CheckBox.Location = new System.Drawing.Point(79, 0); + this.receive_CheckBox.Name = "receive_CheckBox"; + this.receive_CheckBox.Size = new System.Drawing.Size(126, 16); + this.receive_CheckBox.TabIndex = 217; + this.receive_CheckBox.Text = "十六进制显示(Hex)"; + this.receive_CheckBox.UseVisualStyleBackColor = false; + // + // lbl_receiveNum + // + this.lbl_receiveNum.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.lbl_receiveNum.AutoSize = true; + this.lbl_receiveNum.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lbl_receiveNum.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48))))); + this.lbl_receiveNum.Location = new System.Drawing.Point(402, 0); + this.lbl_receiveNum.Name = "lbl_receiveNum"; + this.lbl_receiveNum.Size = new System.Drawing.Size(15, 17); + this.lbl_receiveNum.TabIndex = 220; + this.lbl_receiveNum.Text = "0"; + // + // btnClear + // + this.btnClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btnClear.AutoSize = true; + this.btnClear.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.btnClear.Location = new System.Drawing.Point(436, -3); + this.btnClear.Name = "btnClear"; + this.btnClear.Size = new System.Drawing.Size(37, 20); + this.btnClear.TabIndex = 218; + this.btnClear.TabStop = true; + this.btnClear.Text = "清空"; + this.btnClear.Click += new System.EventHandler(this.btnClear_Click); + // + // com_GroupBox + // + this.com_GroupBox.Controls.Add(this.label2); + this.com_GroupBox.Controls.Add(this.label8); + this.com_GroupBox.Controls.Add(this.stopBits_Box); + this.com_GroupBox.Controls.Add(this.baudRate_Box); + this.com_GroupBox.Controls.Add(this.label11); + this.com_GroupBox.Controls.Add(this.parity_Box); + this.com_GroupBox.Controls.Add(this.label12); + this.com_GroupBox.Controls.Add(this.label13); + this.com_GroupBox.Controls.Add(this.comPort_Box); + this.com_GroupBox.Controls.Add(this.dataBits_Box); + this.com_GroupBox.Location = new System.Drawing.Point(475, 74); + this.com_GroupBox.Name = "com_GroupBox"; + this.com_GroupBox.Size = new System.Drawing.Size(202, 147); + this.com_GroupBox.TabIndex = 109; + this.com_GroupBox.TabStop = false; + this.com_GroupBox.Text = "串口设置"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label2.Location = new System.Drawing.Point(9, 23); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(63, 14); + this.label2.TabIndex = 3; + this.label2.Text = "端口号:"; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label8.Location = new System.Drawing.Point(9, 68); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(63, 14); + this.label8.TabIndex = 11; + this.label8.Text = "校验位:"; + // + // stopBits_Box + // + this.stopBits_Box.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.stopBits_Box.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.stopBits_Box.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.stopBits_Box.FormattingEnabled = true; + this.stopBits_Box.Items.AddRange(new object[] { + "1", + "2"}); + this.stopBits_Box.Location = new System.Drawing.Point(81, 117); + this.stopBits_Box.Name = "stopBits_Box"; + this.stopBits_Box.Size = new System.Drawing.Size(115, 21); + this.stopBits_Box.TabIndex = 8; + // + // baudRate_Box + // + this.baudRate_Box.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.baudRate_Box.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.baudRate_Box.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.baudRate_Box.FormattingEnabled = true; + this.baudRate_Box.Items.AddRange(new object[] { + "9600", + "14400", + "19200", + "38400", + "56000", + "57600", + "115200"}); + this.baudRate_Box.Location = new System.Drawing.Point(81, 44); + this.baudRate_Box.Name = "baudRate_Box"; + this.baudRate_Box.RightToLeft = System.Windows.Forms.RightToLeft.No; + this.baudRate_Box.Size = new System.Drawing.Size(115, 21); + this.baudRate_Box.TabIndex = 4; + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label11.Location = new System.Drawing.Point(9, 93); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(63, 14); + this.label11.TabIndex = 7; + this.label11.Text = "数据位:"; + // + // parity_Box + // + this.parity_Box.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.parity_Box.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.parity_Box.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.parity_Box.FormattingEnabled = true; + this.parity_Box.Items.AddRange(new object[] { + "None", + "Odd", + "Even", + "Mark", + "Space"}); + this.parity_Box.Location = new System.Drawing.Point(81, 68); + this.parity_Box.Name = "parity_Box"; + this.parity_Box.Size = new System.Drawing.Size(115, 21); + this.parity_Box.TabIndex = 10; + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label12.Location = new System.Drawing.Point(9, 44); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(63, 14); + this.label12.TabIndex = 5; + this.label12.Text = "波特率:"; + // + // label13 + // + this.label13.AutoSize = true; + this.label13.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label13.Location = new System.Drawing.Point(9, 118); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(63, 14); + this.label13.TabIndex = 9; + this.label13.Text = "停止位:"; + // + // comPort_Box + // + this.comPort_Box.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comPort_Box.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.comPort_Box.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.comPort_Box.FormattingEnabled = true; + this.comPort_Box.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.comPort_Box.Location = new System.Drawing.Point(81, 21); + this.comPort_Box.Name = "comPort_Box"; + this.comPort_Box.Size = new System.Drawing.Size(115, 21); + this.comPort_Box.TabIndex = 10; + // + // dataBits_Box + // + this.dataBits_Box.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.dataBits_Box.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.dataBits_Box.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.dataBits_Box.FormattingEnabled = true; + this.dataBits_Box.Items.AddRange(new object[] { + "8", + "7", + "6", + "5"}); + this.dataBits_Box.Location = new System.Drawing.Point(81, 93); + this.dataBits_Box.Name = "dataBits_Box"; + this.dataBits_Box.Size = new System.Drawing.Size(115, 21); + this.dataBits_Box.TabIndex = 6; + // + // tcp_GroupBox + // + this.tcp_GroupBox.BackColor = System.Drawing.Color.Transparent; + this.tcp_GroupBox.Controls.Add(this.tbIP); + this.tcp_GroupBox.Controls.Add(this.tbPort); + this.tcp_GroupBox.Controls.Add(this.label31); + this.tcp_GroupBox.Controls.Add(this.label33); + this.tcp_GroupBox.Location = new System.Drawing.Point(696, 74); + this.tcp_GroupBox.Name = "tcp_GroupBox"; + this.tcp_GroupBox.Size = new System.Drawing.Size(213, 89); + this.tcp_GroupBox.TabIndex = 108; + this.tcp_GroupBox.TabStop = false; + this.tcp_GroupBox.Text = "TCP设置"; + // + // tbIP + // + this.tbIP.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.tbIP.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.tbIP.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.tbIP.FormattingEnabled = true; + this.tbIP.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.tbIP.Location = new System.Drawing.Point(61, 24); + this.tbIP.Name = "tbIP"; + this.tbIP.Size = new System.Drawing.Size(146, 21); + this.tbIP.TabIndex = 39; + // + // tbPort + // + this.tbPort.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.tbPort.Location = new System.Drawing.Point(61, 51); + this.tbPort.Name = "tbPort"; + this.tbPort.Size = new System.Drawing.Size(146, 23); + this.tbPort.TabIndex = 38; + this.tbPort.Text = "7100"; + // + // label31 + // + this.label31.AutoSize = true; + this.label31.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label31.Location = new System.Drawing.Point(8, 58); + this.label31.Name = "label31"; + this.label31.Size = new System.Drawing.Size(63, 14); + this.label31.TabIndex = 11; + this.label31.Text = "端口号:"; + // + // label33 + // + this.label33.AutoSize = true; + this.label33.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label33.Location = new System.Drawing.Point(8, 27); + this.label33.Name = "label33"; + this.label33.Size = new System.Drawing.Size(63, 14); + this.label33.TabIndex = 5; + this.label33.Text = "IP地址:"; + // + // tcpType_Box + // + this.tcpType_Box.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.tcpType_Box.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.tcpType_Box.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.tcpType_Box.FormattingEnabled = true; + this.tcpType_Box.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.tcpType_Box.Items.AddRange(new object[] { + "串口(COM)", + "服务器(Server)", + "客户端(Client)", + "串口(COM)/客户端(Client)"}); + this.tcpType_Box.Location = new System.Drawing.Point(556, 41); + this.tcpType_Box.Name = "tcpType_Box"; + this.tcpType_Box.Size = new System.Drawing.Size(153, 21); + this.tcpType_Box.TabIndex = 111; + this.tcpType_Box.SelectedIndexChanged += new System.EventHandler(this.tcpType_Box_SelectedIndexChanged); + // + // label29 + // + this.label29.AutoSize = true; + this.label29.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label29.Location = new System.Drawing.Point(482, 44); + this.label29.Name = "label29"; + this.label29.Size = new System.Drawing.Size(77, 14); + this.label29.TabIndex = 110; + this.label29.Text = "链接类型:"; + // + // tcpBtn_Panel + // + this.tcpBtn_Panel.Controls.Add(this.reloadtcp_Btn); + this.tcpBtn_Panel.Controls.Add(this.btnStart); + this.tcpBtn_Panel.Controls.Add(this.btnDisconnect); + this.tcpBtn_Panel.Controls.Add(this.btnClose); + this.tcpBtn_Panel.Location = new System.Drawing.Point(696, 191); + this.tcpBtn_Panel.Name = "tcpBtn_Panel"; + this.tcpBtn_Panel.Size = new System.Drawing.Size(217, 62); + this.tcpBtn_Panel.TabIndex = 110; + // + // reloadtcp_Btn + // + this.reloadtcp_Btn.Location = new System.Drawing.Point(116, 9); + this.reloadtcp_Btn.Name = "reloadtcp_Btn"; + this.reloadtcp_Btn.Size = new System.Drawing.Size(75, 23); + this.reloadtcp_Btn.TabIndex = 117; + this.reloadtcp_Btn.Text = "刷新网口"; + this.reloadtcp_Btn.UseVisualStyleBackColor = true; + this.reloadtcp_Btn.Click += new System.EventHandler(this.reloadtcp_Btn_Click); + // + // btnStart + // + this.btnStart.Location = new System.Drawing.Point(9, 9); + this.btnStart.Name = "btnStart"; + this.btnStart.Size = new System.Drawing.Size(75, 23); + this.btnStart.TabIndex = 111; + this.btnStart.Text = "启动服务器"; + this.btnStart.UseVisualStyleBackColor = true; + this.btnStart.Click += new System.EventHandler(this.btnStart_Click); + // + // btnDisconnect + // + this.btnDisconnect.Location = new System.Drawing.Point(115, 38); + this.btnDisconnect.Name = "btnDisconnect"; + this.btnDisconnect.Size = new System.Drawing.Size(76, 23); + this.btnDisconnect.TabIndex = 113; + this.btnDisconnect.Text = "关闭连接"; + this.btnDisconnect.UseVisualStyleBackColor = true; + this.btnDisconnect.Click += new System.EventHandler(this.btnDisconnect_Click); + // + // btnClose + // + this.btnClose.Location = new System.Drawing.Point(9, 35); + this.btnClose.Name = "btnClose"; + this.btnClose.Size = new System.Drawing.Size(75, 23); + this.btnClose.TabIndex = 112; + this.btnClose.Text = "关闭服务器"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // comBtn_Panel + // + this.comBtn_Panel.Controls.Add(this.reloadCOM_Btn); + this.comBtn_Panel.Controls.Add(this.com_Btn); + this.comBtn_Panel.Location = new System.Drawing.Point(477, 224); + this.comBtn_Panel.Name = "comBtn_Panel"; + this.comBtn_Panel.Size = new System.Drawing.Size(200, 29); + this.comBtn_Panel.TabIndex = 114; + // + // reloadCOM_Btn + // + this.reloadCOM_Btn.Location = new System.Drawing.Point(106, 3); + this.reloadCOM_Btn.Name = "reloadCOM_Btn"; + this.reloadCOM_Btn.Size = new System.Drawing.Size(75, 23); + this.reloadCOM_Btn.TabIndex = 116; + this.reloadCOM_Btn.Text = "刷新串口"; + this.reloadCOM_Btn.UseVisualStyleBackColor = true; + this.reloadCOM_Btn.Click += new System.EventHandler(this.reloadCOM_Btn_Click); + // + // com_Btn + // + this.com_Btn.ForeColor = System.Drawing.Color.Black; + this.com_Btn.Location = new System.Drawing.Point(16, 3); + this.com_Btn.Name = "com_Btn"; + this.com_Btn.Size = new System.Drawing.Size(75, 23); + this.com_Btn.TabIndex = 115; + this.com_Btn.Text = "打开串口"; + this.com_Btn.UseVisualStyleBackColor = true; + this.com_Btn.Click += new System.EventHandler(this.com_Btn_Click); + // + // panel3 + // + this.panel3.Controls.Add(this.Server_GroupBox); + this.panel3.Controls.Add(this.info_GroupBox); + this.panel3.Location = new System.Drawing.Point(477, 327); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(436, 185); + this.panel3.TabIndex = 115; + // + // Server_GroupBox + // + this.Server_GroupBox.Controls.Add(this.lbOnline); + this.Server_GroupBox.Location = new System.Drawing.Point(269, 1); + this.Server_GroupBox.Name = "Server_GroupBox"; + this.Server_GroupBox.Size = new System.Drawing.Size(167, 181); + this.Server_GroupBox.TabIndex = 106; + this.Server_GroupBox.TabStop = false; + this.Server_GroupBox.Text = "客户端在线列表"; + // + // lbOnline + // + this.lbOnline.BackColor = System.Drawing.SystemColors.Control; + this.lbOnline.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbOnline.FormattingEnabled = true; + this.lbOnline.ItemHeight = 12; + this.lbOnline.Location = new System.Drawing.Point(3, 17); + this.lbOnline.Name = "lbOnline"; + this.lbOnline.SelectionMode = System.Windows.Forms.SelectionMode.MultiSimple; + this.lbOnline.Size = new System.Drawing.Size(161, 161); + this.lbOnline.TabIndex = 106; + // + // info_GroupBox + // + this.info_GroupBox.Controls.Add(this.txtLog); + this.info_GroupBox.Location = new System.Drawing.Point(3, 2); + this.info_GroupBox.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.info_GroupBox.Name = "info_GroupBox"; + this.info_GroupBox.Padding = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.info_GroupBox.Size = new System.Drawing.Size(263, 181); + this.info_GroupBox.TabIndex = 103; + this.info_GroupBox.TabStop = false; + this.info_GroupBox.Text = "通讯日志信息"; + // + // txtSend + // + this.txtSend.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtSend.Location = new System.Drawing.Point(3, 17); + this.txtSend.Name = "txtSend"; + this.txtSend.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical; + this.txtSend.Size = new System.Drawing.Size(461, 100); + this.txtSend.TabIndex = 116; + this.txtSend.Text = ""; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.sendTest_CheckBox); + this.groupBox1.Controls.Add(this.send_CheckBox); + this.groupBox1.Controls.Add(this.txtSend); + this.groupBox1.Controls.Add(this.sendTest_CheckCRLF); + this.groupBox1.Location = new System.Drawing.Point(3, 366); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(467, 120); + this.groupBox1.TabIndex = 117; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "发送文本"; + // + // sendTest_CheckBox + // + this.sendTest_CheckBox.AutoSize = true; + this.sendTest_CheckBox.BackColor = System.Drawing.SystemColors.Control; + this.sendTest_CheckBox.Location = new System.Drawing.Point(69, 0); + this.sendTest_CheckBox.Name = "sendTest_CheckBox"; + this.sendTest_CheckBox.Size = new System.Drawing.Size(48, 16); + this.sendTest_CheckBox.TabIndex = 118; + this.sendTest_CheckBox.Text = "测试"; + this.sendTest_CheckBox.UseVisualStyleBackColor = false; + // + // send_CheckBox + // + this.send_CheckBox.AutoSize = true; + this.send_CheckBox.BackColor = System.Drawing.SystemColors.Control; + this.send_CheckBox.Location = new System.Drawing.Point(136, 0); + this.send_CheckBox.Name = "send_CheckBox"; + this.send_CheckBox.Size = new System.Drawing.Size(126, 16); + this.send_CheckBox.TabIndex = 117; + this.send_CheckBox.Text = "十六进制发送(Hex)"; + this.send_CheckBox.UseVisualStyleBackColor = false; + // + // sendTest_CheckCRLF + // + this.sendTest_CheckCRLF.AutoSize = true; + this.sendTest_CheckCRLF.BackColor = System.Drawing.SystemColors.Control; + this.sendTest_CheckCRLF.Location = new System.Drawing.Point(396, -1); + this.sendTest_CheckCRLF.Name = "sendTest_CheckCRLF"; + this.sendTest_CheckCRLF.Size = new System.Drawing.Size(72, 16); + this.sendTest_CheckCRLF.TabIndex = 119; + this.sendTest_CheckCRLF.Text = "增加CRLF"; + this.sendTest_CheckCRLF.UseVisualStyleBackColor = false; + // + // btnSend + // + this.btnSend.Location = new System.Drawing.Point(380, 489); + this.btnSend.Name = "btnSend"; + this.btnSend.Size = new System.Drawing.Size(75, 23); + this.btnSend.TabIndex = 118; + this.btnSend.Text = "发送"; + this.btnSend.UseVisualStyleBackColor = true; + this.btnSend.Click += new System.EventHandler(this.btnSend_Click); + // + // panel4 + // + this.panel4.Controls.Add(this.groupBox3); + this.panel4.Location = new System.Drawing.Point(480, 258); + this.panel4.Name = "panel4"; + this.panel4.Size = new System.Drawing.Size(433, 65); + this.panel4.TabIndex = 119; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.txtIntervalTime); + this.groupBox3.Controls.Add(this.cmbEndSymbol); + this.groupBox3.Controls.Add(this.label1); + this.groupBox3.Controls.Add(this.label4); + this.groupBox3.Controls.Add(this.label6); + this.groupBox3.Controls.Add(this.pgeAuto_CheckBox); + this.groupBox3.Controls.Add(this.txtHeartData); + this.groupBox3.Controls.Add(this.label3); + this.groupBox3.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBox3.Location = new System.Drawing.Point(0, 0); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(433, 65); + this.groupBox3.TabIndex = 108; + this.groupBox3.TabStop = false; + // + // txtIntervalTime + // + this.txtIntervalTime.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtIntervalTime.Location = new System.Drawing.Point(144, 32); + this.txtIntervalTime.Name = "txtIntervalTime"; + this.txtIntervalTime.Size = new System.Drawing.Size(47, 23); + this.txtIntervalTime.TabIndex = 122; + this.txtIntervalTime.Text = "1000"; + // + // cmbEndSymbol + // + this.cmbEndSymbol.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbEndSymbol.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmbEndSymbol.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.cmbEndSymbol.FormattingEnabled = true; + this.cmbEndSymbol.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.cmbEndSymbol.Items.AddRange(new object[] { + "无", + "CRLF(\\r\\n)", + "LF(\\n)", + "CR(\\r)"}); + this.cmbEndSymbol.Location = new System.Drawing.Point(311, 31); + this.cmbEndSymbol.Name = "cmbEndSymbol"; + this.cmbEndSymbol.Size = new System.Drawing.Size(112, 21); + this.cmbEndSymbol.TabIndex = 12; + this.cmbEndSymbol.SelectedIndexChanged += new System.EventHandler(this.cmbEndSymbol_SelectedIndexChanged); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label1.Location = new System.Drawing.Point(258, 34); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(63, 14); + this.label1.TabIndex = 12; + this.label1.Text = "结束符:"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label4.Location = new System.Drawing.Point(197, 38); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(21, 14); + this.label4.TabIndex = 123; + this.label4.Text = "ms"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label6.Location = new System.Drawing.Point(142, 18); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(65, 12); + this.label6.TabIndex = 121; + this.label6.Text = "间隔时间:"; + // + // pgeAuto_CheckBox + // + this.pgeAuto_CheckBox.AutoSize = true; + this.pgeAuto_CheckBox.BackColor = System.Drawing.SystemColors.Control; + this.pgeAuto_CheckBox.Location = new System.Drawing.Point(8, 0); + this.pgeAuto_CheckBox.Name = "pgeAuto_CheckBox"; + this.pgeAuto_CheckBox.Size = new System.Drawing.Size(96, 16); + this.pgeAuto_CheckBox.TabIndex = 120; + this.pgeAuto_CheckBox.Text = "启用连续发送"; + this.pgeAuto_CheckBox.UseVisualStyleBackColor = false; + // + // txtHeartData + // + this.txtHeartData.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtHeartData.Location = new System.Drawing.Point(18, 34); + this.txtHeartData.Name = "txtHeartData"; + this.txtHeartData.Size = new System.Drawing.Size(99, 23); + this.txtHeartData.TabIndex = 41; + this.txtHeartData.Text = "1"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label3.Location = new System.Drawing.Point(17, 17); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(65, 12); + this.label3.TabIndex = 40; + this.label3.Text = "发送内容:"; + // + // saveSetting_Btn + // + this.saveSetting_Btn.Enabled = false; + this.saveSetting_Btn.Location = new System.Drawing.Point(817, 41); + this.saveSetting_Btn.Name = "saveSetting_Btn"; + this.saveSetting_Btn.Size = new System.Drawing.Size(70, 22); + this.saveSetting_Btn.TabIndex = 106; + this.saveSetting_Btn.Text = "参数保存"; + this.saveSetting_Btn.UseVisualStyleBackColor = true; + this.saveSetting_Btn.Click += new System.EventHandler(this.saveSetting_Btn_Click); + // + // Auto_CheckBox + // + this.Auto_CheckBox.AutoSize = true; + this.Auto_CheckBox.Enabled = false; + this.Auto_CheckBox.Location = new System.Drawing.Point(732, 44); + this.Auto_CheckBox.Name = "Auto_CheckBox"; + this.Auto_CheckBox.Size = new System.Drawing.Size(72, 16); + this.Auto_CheckBox.TabIndex = 107; + this.Auto_CheckBox.Text = "自动联机"; + this.Auto_CheckBox.UseVisualStyleBackColor = true; + // + // tmHeart + // + this.tmHeart.Enabled = true; + this.tmHeart.Tick += new System.EventHandler(this.tmHeart_Tick); + // + // checkBox1 + // + this.checkBox1.AutoSize = true; + this.checkBox1.Enabled = false; + this.checkBox1.Location = new System.Drawing.Point(696, 169); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.Size = new System.Drawing.Size(108, 16); + this.checkBox1.TabIndex = 109; + this.checkBox1.Text = "客户端断线重连"; + this.checkBox1.UseVisualStyleBackColor = true; + // + // CommunUI + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.checkBox1); + this.Controls.Add(this.saveSetting_Btn); + this.Controls.Add(this.Auto_CheckBox); + this.Controls.Add(this.tcpType_Box); + this.Controls.Add(this.panel4); + this.Controls.Add(this.label29); + this.Controls.Add(this.btnSend); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.panel3); + this.Controls.Add(this.comBtn_Panel); + this.Controls.Add(this.tcpBtn_Panel); + this.Controls.Add(this.com_GroupBox); + this.Controls.Add(this.tcp_GroupBox); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.info_Lab); + this.Name = "CommunUI"; + this.Size = new System.Drawing.Size(916, 518); + this.Load += new System.EventHandler(this.CommunUI_Load); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.com_GroupBox.ResumeLayout(false); + this.com_GroupBox.PerformLayout(); + this.tcp_GroupBox.ResumeLayout(false); + this.tcp_GroupBox.PerformLayout(); + this.tcpBtn_Panel.ResumeLayout(false); + this.comBtn_Panel.ResumeLayout(false); + this.panel3.ResumeLayout(false); + this.Server_GroupBox.ResumeLayout(false); + this.info_GroupBox.ResumeLayout(false); + this.info_GroupBox.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.panel4.ResumeLayout(false); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + public System.Windows.Forms.Label info_Lab; + private System.Windows.Forms.RichTextBox txtRecv; + private System.Windows.Forms.TextBox txtLog; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.GroupBox com_GroupBox; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label8; + internal System.Windows.Forms.ComboBox stopBits_Box; + internal System.Windows.Forms.ComboBox baudRate_Box; + private System.Windows.Forms.Label label11; + internal System.Windows.Forms.ComboBox parity_Box; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.Label label13; + internal System.Windows.Forms.ComboBox comPort_Box; + internal System.Windows.Forms.ComboBox dataBits_Box; + private System.Windows.Forms.GroupBox tcp_GroupBox; + internal System.Windows.Forms.ComboBox tbIP; + internal System.Windows.Forms.TextBox tbPort; + private System.Windows.Forms.Label label31; + private System.Windows.Forms.Label label33; + internal System.Windows.Forms.Label lbl_sendNum; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.CheckBox receive_CheckBox; + internal System.Windows.Forms.Label lbl_receiveNum; + private System.Windows.Forms.LinkLabel btnClear; + internal System.Windows.Forms.ComboBox tcpType_Box; + private System.Windows.Forms.Label label29; + private System.Windows.Forms.Panel tcpBtn_Panel; + private System.Windows.Forms.Panel comBtn_Panel; + public System.Windows.Forms.Panel panel3; + public System.Windows.Forms.GroupBox Server_GroupBox; + private System.Windows.Forms.ListBox lbOnline; + public System.Windows.Forms.GroupBox info_GroupBox; + private System.Windows.Forms.RichTextBox txtSend; + private System.Windows.Forms.GroupBox groupBox1; + internal System.Windows.Forms.CheckBox sendTest_CheckCRLF; + internal System.Windows.Forms.CheckBox sendTest_CheckBox; + internal System.Windows.Forms.CheckBox send_CheckBox; + private System.Windows.Forms.Button btnSend; + private System.Windows.Forms.Panel panel4; + internal System.Windows.Forms.ComboBox cmbEndSymbol; + private System.Windows.Forms.Label label1; + internal System.Windows.Forms.Button saveSetting_Btn; + internal System.Windows.Forms.CheckBox Auto_CheckBox; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.Label label4; + internal System.Windows.Forms.TextBox txtIntervalTime; + private System.Windows.Forms.Label label6; + internal System.Windows.Forms.CheckBox pgeAuto_CheckBox; + internal System.Windows.Forms.TextBox txtHeartData; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Timer tmHeart; + public System.Windows.Forms.Button btnStart; + public System.Windows.Forms.Button reloadCOM_Btn; + public System.Windows.Forms.Button com_Btn; + internal System.Windows.Forms.CheckBox checkBox1; + internal System.Windows.Forms.Button btnClose; + internal System.Windows.Forms.Button btnDisconnect; + internal System.Windows.Forms.Button reloadtcp_Btn; + } +} diff --git a/SimpleServer/CommunUI.cs b/SimpleServer/CommunUI.cs new file mode 100644 index 0000000..9e52dfc --- /dev/null +++ b/SimpleServer/CommunUI.cs @@ -0,0 +1,1384 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Text; +using System.Windows.Forms; +using System.Threading; +using System.Net; +using System.Net.Sockets; +using System.IO.Ports; + +namespace SimpleCommunication +{ + public partial class CommunUI : UserControl + { + /// + /// 保存委托 + /// + /// + /// + public delegate void SaveParamsHandler(int plcIndex, int trgIndex); + public event SaveParamsHandler SaveParamsEvent; + /// + /// 通讯接收数据委托 + /// + /// + public delegate void TCPCOMRecvMsgHandle(StringBox msgBox); + public TCPCOMRecvMsgHandle TcoComRecvMsgEvent; + /// + /// 常规数据信息委托 + /// + /// + public delegate void TCPCOMInfoMsgHandle(StringBox msgBox); + public TCPCOMInfoMsgHandle TcoComInfoMsgEvent; + + /// + /// 串口 + /// + public Serial comSerial; + /// + /// TCP服务端 + /// + public Server tcpServer; + /// + /// TCP客户端 + /// + public Client tcpClient; + /// + /// Com通讯类型 + /// + public bool com; + /// + /// TCP服务端类型 + /// + public bool server; + /// + /// TCP客户端类型 + /// + public bool client; + /// + /// 服务端创建事件成功 + /// + public bool ServerCreatedSuccessfully = false; + /// + ///客户端创建事件成功 + /// + public bool ClientCreatedSuccessfully = false; + /// + /// 串口端创建事件成功 + /// + public bool comSerialCreatedSuccessfully = false; + /// + /// 结束符号 + /// + public string Endsymbol; + /// + /// 是否链接成功 + /// + public bool IsConnected => (com || server || client) ? true : false; + /// + /// 通讯类型 + /// + public int type { get; private set; } + /// + /// 选择服务端,选择Combox类型0 + /// + private bool isServer => tcpType_Box.SelectedIndex == 1; + + public int JobCount { get; set; } + /// + /// 发送次数 + /// + public int SendCount = 0; + /// + /// 接收次数 + /// + public int RecvCount = 0; + /// + /// 参数 + /// + public ComConfig ComConfig = new ComConfig(); + /// + /// 页面 + /// + public TabPage[] tgrPage = new TabPage[10]; + + public int Index; + public bool receiveHexShow; + public bool SendHexShow; + + /// + /// 构造函数 + /// + public CommunUI() + { + InitializeComponent(); + comSerial = new Serial(); + tcpServer = new Server(); + tcpClient = new Client(); + LocalIP(tbIP); + comSerial.LoadComSerial(comPort_Box); + SetStyle(ControlStyles.UserPaint, true); + SetStyle(ControlStyles.AllPaintingInWmPaint, true); + SetStyle(ControlStyles.DoubleBuffer, true); + + } + + public CommunUI(ComConfig comConfig) + : this() + { + ComConfig = comConfig; + Index = ComConfig.Index; + JobCount = ComConfig.JobCount; + txtHeartData.Text = ComConfig.HeartText; + txtIntervalTime.Text = ComConfig.HeartTime.ToString(); + tcpType_Box.SelectedIndex = ComConfig.Connect_Typt; + tbPort.Text = ComConfig.TCP_Port.ToString(); + baudRate_Box.Text = ComConfig.COM_BaudRate.ToString(); + parity_Box.Text = ComConfig.COM_Parity.ToString(); + dataBits_Box.Text = ComConfig.COM_DataBit.ToString(); + stopBits_Box.Text = ComConfig.COM_StopBit.ToString(); + cmbEndSymbol.SelectedIndex = ComConfig.Endsymbol; + + if (ComConfig.Connect_Typt == 0)//串口 + { + //type = 0; + server = false; + client = false; + com = true; + ServerDlgSubscribe(0, true); + comSerialCreatedSuccessfully = true; + + + } + else if (ComConfig.Connect_Typt == 1) //服务器 + { + //type = 1; + server = true; + client = false; + com = false; + btnStart.Text = "启动服务器"; + btnDisconnect.Text = "关闭链接"; + btnClose.Enabled = true; + ServerDlgSubscribe(1, true); + ServerCreatedSuccessfully = true; + } + else if (ComConfig.Connect_Typt == 2) //客户端 + { + //type = 2; + server = false; + client = true; + com = false; + btnStart.Text = "链接服务"; + btnDisconnect.Text = "断开链接"; + btnClose.Enabled = false; + ServerDlgSubscribe(2, true); + ClientCreatedSuccessfully = true; + } + else + { + server = true; + com = true; + ServerDlgSubscribe(0, true); + comSerialCreatedSuccessfully = true; + btnStart.Text = "链接服务"; + btnDisconnect.Text = "断开链接"; + btnClose.Enabled = false; + ServerDlgSubscribe(2, true); + ClientCreatedSuccessfully = true; + } + } + + #region 界面事件处理 + /// + /// 界面Loadsh + /// + /// + /// + private void CommunUI_Load(object sender, EventArgs e) + { + + } + + private void com_Btn_Click(object sender, EventArgs e) + { + COMOpen(); + } + + public void COMOpen() + { + + if (!comSerial.IsOpen) + { + StopBits stopBits = StopBits.None; + string text = stopBits_Box.Text; + if (!(text == "1")) + { + if (text == "2") + { + stopBits = StopBits.Two; + } + } + else + { + stopBits = StopBits.One; + } + if (comPort_Box.Text != "") + { + comSerial.OpenSerialPort(comPort_Box.Text, int.Parse(baudRate_Box.SelectedItem.ToString()), (Parity)parity_Box.SelectedIndex, int.Parse(dataBits_Box.SelectedItem.ToString()), stopBits); + Thread.Sleep(50); + if (comSerial.IsOpen) + { + if (!comSerialCreatedSuccessfully) + { + ServerDlgSubscribe(2, true); + comSerialCreatedSuccessfully = true; + } + + //LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", comSerial.getUserPortName(), " <--> 串口已打开!\r\n")); + info_Lab.Text = "串口:" + comSerial.getUserPortName(); + info_Lab.BackColor = Color.Green; + tcpBtn_Panel.Enabled = false; + com_Btn.Text = "关闭串口"; + com_Btn.BackColor = Color.Green; + com_GroupBox.Enabled = false; + tcp_GroupBox.Enabled = false; + tcpType_Box.Enabled = false; + saveSetting_Btn.Enabled = true; + Auto_CheckBox.Enabled = true; + pgeAuto_CheckBox.Enabled = true; + } + } + else + { + MessageBox.Show("打开串口失败,无法获取串口!"); + } + } + else + { + comSerial.CloseSeriaPort(); + Thread.Sleep(50); + if (!comSerial.IsOpen) + { + if (comSerialCreatedSuccessfully) + { + ServerDlgSubscribe(2, false); + comSerialCreatedSuccessfully = false; + } + + + info_Lab.Text = "未连接"; + info_Lab.Text = "未连接"; + info_Lab.BackColor = Color.Red; + tcpBtn_Panel.Enabled = true; + saveSetting_Btn.Enabled = false; + Auto_CheckBox.Enabled = false; + pgeAuto_CheckBox.Enabled = false; + com_Btn.Text = "打开串口"; + com_Btn.BackColor = Color.Transparent; + com_GroupBox.Enabled = true; + tcp_GroupBox.Enabled = true; + tcpType_Box.Enabled = true; + //com = false; + + + } + } + + } + + /// + /// 开启服务器链接 + /// + /// + /// + public void btnStart_Click(object sender, EventArgs e) + { + TCPOpen(); + } + + public void TCPOpen() + { + if (isServer) + { + //if (tcpServer.IsConnected) + //{ + // try + // { + // tcpServer.DisconnectClient(); + // } + // catch + // { + // } + // LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", tcpServer.listener.Server.LocalEndPoint, " <--> 服务器已关闭!\r\n")); + // tcpServer.Dispose(); + // Thread.Sleep(200); + // if (!tcpServer.IsConnected) + // { + // if (ServerCreatedSuccessfully) + // { + // ServerDlgSubscribe(0, false); + // ServerCreatedSuccessfully = false; + // } + + // info_Lab.Text = "未连接"; + // info_Lab.BackColor = Color.Red; + // btnStart.Text = "连接网口"; + // btnStart.ForeColor = Color.Black; + // btnStart.BackColor = Color.Transparent; + // com_GroupBox.Enabled = true; + // tcp_GroupBox.Enabled = true; + // comBtn_Panel.Enabled = true; + // saveSetting_Btn.Enabled = false; + // Auto_CheckBox.Enabled = false; + // pgeAuto_CheckBox.Enabled = false; + // tcpType_Box.Enabled = false; + // //server = false; + // type = tcpType_Box.SelectedIndex; + // } + //} + //else + //{ + + tcpServer.Start(tbIP, tbPort); + Thread.Sleep(50); + if (tcpServer.IsConnected) + { + if (!ServerCreatedSuccessfully) + { + ServerDlgSubscribe(0, true); + ServerCreatedSuccessfully = true; + } + ModifyShowsByServerState(true); + Thread acceptClientThread = new Thread(BeginAcceptClient); + acceptClientThread.IsBackground = true; + acceptClientThread.Start(); + LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", tcpServer.listener.Server.LocalEndPoint, " <--> 服务器已打开!\r\n")); + info_Lab.Text = "服务器:" + tcpServer.listener.Server.LocalEndPoint.ToString(); + info_Lab.BackColor = Color.Green; + btnStart.Text = "断开网口"; + btnStart.ForeColor = Color.White; + btnStart.BackColor = Color.Green; + com_GroupBox.Enabled = false; + tcp_GroupBox.Enabled = false; + comBtn_Panel.Enabled = false; + saveSetting_Btn.Enabled = true; + Auto_CheckBox.Enabled = true; + pgeAuto_CheckBox.Enabled = true; + tcpType_Box.Enabled = false; + type = tcpType_Box.SelectedIndex; + } + } + else if (!tcpClient.IsConnected) + { + info_Lab.Text = "未连接"; + info_Lab.BackColor = Color.Red; + btnStart.Text = "连接网口"; + com_GroupBox.Enabled = true; + tcp_GroupBox.Enabled = true; + comBtn_Panel.Enabled = true; + saveSetting_Btn.Enabled = false; + Auto_CheckBox.Enabled = false; + pgeAuto_CheckBox.Enabled = false; + tcpType_Box.Enabled = true; + tcpClient.Connect(tbIP, tbPort); + Thread.Sleep(20); + if (tcpClient.IsConnected) + { + if (!ClientCreatedSuccessfully) + { + ServerDlgSubscribe(2, true); + ClientCreatedSuccessfully = true; + } + LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", tcpClient.tcpclient.Client.LocalEndPoint, " <--> 已连接服务器!\r\n")); + btnStart.Text = "断开网口"; + btnStart.ForeColor = Color.White; + btnStart.BackColor = Color.Green; + info_Lab.Text = "客户端:" + tcpClient.tcpclient.Client.LocalEndPoint.ToString(); + info_Lab.BackColor = Color.Green; + com_GroupBox.Enabled = false; + tcp_GroupBox.Enabled = false; + comBtn_Panel.Enabled = false; + saveSetting_Btn.Enabled = true; + Auto_CheckBox.Enabled = true; + pgeAuto_CheckBox.Enabled = true; + tcpType_Box.Enabled = false; + type = tcpType_Box.SelectedIndex; + } + } + else + { + try + { + LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", tcpClient.tcpclient.Client.LocalEndPoint, " <--> 与服务器断开!\r\n")); + tcpClient.Dispose(); + } + catch + { + } + Thread.Sleep(50); + if (ClientCreatedSuccessfully) + { + ServerDlgSubscribe(1, false); + ClientCreatedSuccessfully = false; + } + + info_Lab.Text = "未连接"; + info_Lab.BackColor = Color.Red; + btnStart.Text = "连接网口"; + btnStart.ForeColor = Color.Black; + btnStart.BackColor = Color.Transparent; + com_GroupBox.Enabled = true; + tcp_GroupBox.Enabled = true; + comBtn_Panel.Enabled = true; + saveSetting_Btn.Enabled = false; + Auto_CheckBox.Enabled = false; + pgeAuto_CheckBox.Enabled = false; + tcpType_Box.Enabled = false; + type = tcpType_Box.SelectedIndex; + } + + } + + + private void tcpType_Box_SelectedIndexChanged(object sender, EventArgs e) + { + if (tcpType_Box.SelectedIndex > 0) + { + tbIP.DropDownStyle = ComboBoxStyle.DropDown; + } + else + { + tbIP.DropDownStyle = ComboBoxStyle.DropDownList; + } + } + + private void cmbEndSymbol_SelectedIndexChanged(object sender, EventArgs e) + { + switch (cmbEndSymbol.SelectedIndex) + { + case 0://无 + Endsymbol = string.Empty; + break; + case 1://CRLF(\r\n) + Endsymbol = "\r\n"; + break; + case 2://LF(\n) + Endsymbol = "\n"; + break; + default://CR(\r) + Endsymbol = "\r"; + break; + } + + } + + + /// + /// 调用发送数据 + /// + /// + /// + public void SendResult(string str) + { + try + { + if (!sendTest_CheckBox.Checked && str != null) + { + if (com && !server && !client) + { + comSerial.SendString(str); + } + if (server && !com && !client && tcpServer != null) + { + tcpServer.SendMsg(str); + } + if (client && !com && !server) + { + tcpClient.SendMsg(str); + } + } + } + catch (Exception ex) + { + throw ex; + } + } + + public string SendReturnResult(string str) + { + string text = ""; + try + { + if (!sendTest_CheckBox.Checked && str != null) + { + if (com && !server && !client) + { + text = comSerial.SendReturnData(str); + } + if (server && !com && !client && tcpServer != null) + { + tcpServer.SendMsg(str); + } + if (client && !com && !server) + { + tcpClient.SendMsg(str); + } + } + } + catch (Exception ex) + { + throw ex; + } + return text; + } + + + private void tmHeart_Tick(object sender, EventArgs e) + { + int num = Convert.ToInt32(txtIntervalTime.Text); + if (num > 0) + { + tmHeart.Interval = Convert.ToInt32(txtIntervalTime.Text); + } + KeepAlive(); + } + + public void KeepAlive() + { + if (this.InvokeRequired) + { + BeginInvoke(new Action(KeepAlive)); + } + else if (IsConnected && pgeAuto_CheckBox.Checked && txtHeartData.Text != "") + { + if (com && !server && !client) + { + comSerial.SendString(txtHeartData.Text); + } + if (server && !com && !client) + { + tcpServer.SendMsg(txtHeartData.Text); + } + if (client && !com && !server) + { + tcpClient.SendMsg(txtHeartData.Text); + } + } + } + + /// + /// 刷新网口 + /// + /// + /// + private void reloadtcp_Btn_Click(object sender, EventArgs e) + { + LocalIP(tbIP); + } + + /// + /// 刷新串口 + /// + /// + /// + private void reloadCOM_Btn_Click(object sender, EventArgs e) + { + comSerial.LoadComSerial(comPort_Box); + } + + private void saveSetting_Btn_Click(object sender, EventArgs e) + { + try + { + ComConfig.Index = Index; + ComConfig.JobCount = JobCount; + ComConfig.TCP_IP = tbIP.Text.Trim(); + ComConfig.TCP_Port = Convert.ToInt32(tbPort.Text.Trim()); + ComConfig.HeartBeat = pgeAuto_CheckBox.Checked; + ComConfig.HeartText = txtHeartData.Text.Trim(); + ComConfig.HeartTime = Convert.ToInt32(txtIntervalTime.Text.Trim()); + ComConfig.COM_Port = comPort_Box.Text.Trim(); + ComConfig.COM_BaudRate = Convert.ToInt32(baudRate_Box.Text.Trim()); + ComConfig.COM_DataBit = Convert.ToInt32(dataBits_Box.Text.Trim()); + ComConfig.COM_Parity = parity_Box.Text.Trim(); + ComConfig.COM_StopBit = Convert.ToInt32(stopBits_Box.Text.Trim()); + ComConfig.Endsymbol = cmbEndSymbol.SelectedIndex; + OnSaveParams(Index, 0); + LogRecord("保存参数成功"); + } + catch (Exception ex) + { + //AddLog(lstRecv, 2, "保存参数失败" + ex.Message); + } + } + + /// + /// 保存信息委托事件 + /// + /// + /// + public void OnSaveParams(int plcIndex, int trgIndex) + { + if (this.SaveParamsEvent != null) + { + this.SaveParamsEvent(plcIndex, trgIndex); + } + } + + + public void btnClose_Click(object sender, EventArgs e) + { + if (isServer) + { + if (tcpServer.ServerClose()) + { + ModifyShowsByServerState(false); + } + if (ServerCreatedSuccessfully) + { + ServerDlgSubscribe(0, false); + ServerCreatedSuccessfully = false; + } + info_Lab.Text = "未连接"; + info_Lab.BackColor = Color.Red; + btnStart.Text = "连接网口"; + btnStart.ForeColor = Color.Black; + btnStart.BackColor = Color.Transparent; + com_GroupBox.Enabled = true; + tcp_GroupBox.Enabled = true; + comBtn_Panel.Enabled = true; + saveSetting_Btn.Enabled = false; + Auto_CheckBox.Enabled = false; + pgeAuto_CheckBox.Enabled = false; + tcpType_Box.Enabled = false; + tcpServer.DisconnectClient(); + } + else + { + tcpClient.LocalClientClose(); + ModifyShowsByServerState(false); + if (ClientCreatedSuccessfully) + { + ServerDlgSubscribe(1, false); + ClientCreatedSuccessfully = false; + } + info_Lab.Text = "未连接"; + info_Lab.BackColor = Color.Red; + btnStart.Text = "连接网口"; + btnStart.ForeColor = Color.Black; + btnStart.BackColor = Color.Transparent; + com_GroupBox.Enabled = true; + tcp_GroupBox.Enabled = true; + comBtn_Panel.Enabled = true; + saveSetting_Btn.Enabled = false; + Auto_CheckBox.Enabled = false; + pgeAuto_CheckBox.Enabled = false; + tcpType_Box.Enabled = false; + + } + + } + + private void btnClear_Click(object sender, EventArgs e) + { + this.txtRecv.Clear(); + } + + private void btnSend_Click(object sender, EventArgs e) + { + SendCount++; + ShowCount(SendCount, true); + string msg = this.txtSend.Text.Trim(); + if (!string.IsNullOrEmpty(msg)) + { + if (com && !server && !client) + { + comSerial.SendString($"{msg}{Endsymbol}"); + msg = DateTime.Now.ToString("HH:mm:ss") + " [本机] :\r\n" + msg + "\r\n"; + this.txtSend.Clear(); + AppendText($"串口{comSerial.getUserPortName()} --> {msg}"); + + } + if (server && !com && !client) + { + if (tcpServer.listener != null && tcpServer.currentClient.tcpclient.Connected) + { + tcpServer.SendMsg(msg + Endsymbol); + msg = DateTime.Now.ToString("HH:mm:ss") + " [本机] :\r\n" + msg + "\r\n"; + this.txtSend.Clear(); + AppendText($"服务端 --> {msg}"); + } + else + { + msg = DateTime.Now.ToString("HH:mm:ss") + " [本机] :\r\n未链接客户端,无法发送消息!\r\n"; + AppendText($"服务端 --> {msg}"); + } + + } + if (client && !com && !server) + { + + tcpClient.SendMsg($"{msg}{Endsymbol}"); + msg = DateTime.Now.ToString("HH:mm:ss ") + "本机 :\r\n" + msg + "\r\n"; + this.txtSend.Text = string.Empty; + AppendText($"客户端 --> {msg}"); + } + } + else + { + MessageBox.Show("数据为空!"); + } + } + + private void btnDisconnect_Click(object sender, EventArgs e) + { + if (isServer) + { + tcpServer.DisconnectClient(); + info_Lab.Text = "未连接"; + info_Lab.BackColor = Color.Red; + btnStart.Text = "连接网口"; + btnStart.ForeColor = Color.Black; + btnStart.BackColor = Color.Transparent; + com_GroupBox.Enabled = true; + tcp_GroupBox.Enabled = true; + comBtn_Panel.Enabled = true; + saveSetting_Btn.Enabled = false; + Auto_CheckBox.Enabled = false; + pgeAuto_CheckBox.Enabled = false; + tcpType_Box.Enabled = true; + ServerDlgSubscribe(0, false); + } + else if (client) + { + tcpClient.Dispose(); + info_Lab.Text = "未连接"; + info_Lab.BackColor = Color.Red; + btnStart.Text = "连接网口"; + btnStart.ForeColor = Color.Black; + btnStart.BackColor = Color.Transparent; + com_GroupBox.Enabled = true; + tcp_GroupBox.Enabled = true; + comBtn_Panel.Enabled = true; + saveSetting_Btn.Enabled = false; + Auto_CheckBox.Enabled = false; + pgeAuto_CheckBox.Enabled = false; + tcpType_Box.Enabled = true; + ServerDlgSubscribe(1, false); + } + //else + //{ + // comSerial.CloseSeriaPort(); + // ServerDlgSubscribe(2, false); + //} + + } + + private void ServerForm_FormClosing(object sender, FormClosingEventArgs e) + { + if (isServer) + { + ServerDlgSubscribe(0, false); + } + else if (client) + { + ServerDlgSubscribe(1, false); + } + else + { + ServerDlgSubscribe(2, false); + } + + } + + private void ServerForm_Load(object sender, EventArgs e) + { + //ModifyShowsByServerState(false); + //ModifyShowsByClientState(false); + } + #endregion + + #region 界面逻辑函数 + + + /// + /// 获取本地电脑IP地址 + /// + /// + public void LocalIP(ComboBox ipStr) + { + ipStr.Items.Clear(); + string hostName = Dns.GetHostName(); + IPHostEntry hostEntry = Dns.GetHostEntry(hostName); + IPAddress[] addressList = hostEntry.AddressList; + foreach (IPAddress iPAddress in addressList) + { + if (iPAddress.AddressFamily == AddressFamily.InterNetwork) + { + ipStr.Items.Add(iPAddress.ToString()); + } + } + if (ipStr.Items.Count != 0) + { + ipStr.Text = ipStr.Items[0].ToString(); + } + } + /// + /// 根据监听状态修改界面显示 + /// ServerForm_Load,点击启用服务器,关闭服务器按钮后调用 + /// + /// + private void ModifyShowsByServerState(bool serverStart) + { + //this.btnStart.Enabled = !serverStart; + //this.btnClose.Enabled = serverStart; + } + + /// + /// 根据连接状态修改界面显示 + /// ServerForm_Load,Server_NewClientEvent,Server_RemoteDisconnectEvent,Server_LocalDisconnectEvent调用到 + /// + /// + private void ModifyShowsByClientState(bool clientConnect) + { + this.btnSend.Enabled = clientConnect; + this.btnDisconnect.Enabled = clientConnect; + } + + private string splitSymbols = "\r\n\r\n"; + /// + /// 日志记录 + /// + /// + private void LogRecord(string content) + { + this.txtLog.AppendText(content + splitSymbols); + } + + private void ControlsChange(bool connect) + { + this.btnStart.Enabled = !connect; + this.btnDisconnect.Enabled = connect; + this.btnClear.Enabled = true; + this.btnSend.Enabled = connect; + if (connect) + { + this.Text = "客户端(已连接)"; + } + else + { + this.Text = "客户端(未连接)"; + } + } + + /// + /// 将收文或发文字符串处理后加入文本接收区 + /// + /// + private void AppendText(string param) + { + int index1 = this.txtRecv.Text.Length; + int length1 = param.IndexOf("\r\n"); + int index2 = index1 + length1 + 2; + int length2 = param.Length - length1 - 2; + this.txtRecv.AppendText(param); + this.txtRecv.Select(index1, length1); + this.txtRecv.SelectionColor = Color.Green; + this.txtRecv.Select(index2, length2); + this.txtRecv.SelectionColor = Color.Black; + this.txtRecv.Select(this.txtRecv.Text.Length, 0); + if (index1 > 1000) + { + txtRecv.Clear(); + } + this.txtRecv.Focus(); + } + + /// + /// 发送接收次数 + /// + /// + /// + public void ShowCount(int SendCount, bool sor) + { + this.Invoke((EventHandler)(delegate + { + + if (sor) + { + lbl_sendNum.Text = SendCount.ToString(); + } + else + { + lbl_receiveNum.Text = SendCount.ToString(); + } + })); + } + + /// + /// 日志消息显示 + /// + /// + private void OnInfoMsg(StringBox msgBox) + { + if (TcoComInfoMsgEvent != null) + { + TcoComInfoMsgEvent(msgBox); + } + } + + /// + /// 接收消息 + /// + /// + private void OnRcvMsg(StringBox msgBox) + { + if (msgBox.str != "" && TcoComRecvMsgEvent != null) + { + TcoComRecvMsgEvent(msgBox); + } + } + + #endregion + + #region 业务逻辑处理 + /// + /// 监听启动之后,线程中启动连接接收 + /// + private void BeginAcceptClient() + { + tcpServer.BeginAcceptClient(); + } + + /// + /// 在构造函数和ServerForm_FormClosing里调用 + /// + /// + private void ServerDlgSubscribe(int tyepe, bool add) + { + switch (tyepe) + { + case 0://串口 + if (add) + { + comSerial.ComOpenEvent += new DlgNoParam(Com_OpenSerialEvent); + comSerial.SendMsgEvent += new DlgOneParam(Com_SendMsgEvent); + comSerial.RecvMsgEvent += new DlgOneParam(Com_RecvMsgEvent); + comSerial.ComDisconnectEvent += new DlgNoParam(Com_ComDisconnectEvent); + + } + else + { + comSerial.ComOpenEvent -= new DlgNoParam(Com_OpenSerialEvent); + comSerial.SendMsgEvent -= new DlgOneParam(Com_SendMsgEvent); + comSerial.RecvMsgEvent -= new DlgOneParam(Com_RecvMsgEvent); + comSerial.ComDisconnectEvent -= new DlgNoParam(Com_ComDisconnectEvent); + } + break; + case 1://服务端 + if (add) + { + tcpServer.ServerStartEvent += new DlgNoParam(Server_ServerStartEvent); + tcpServer.ServerCloseEvent += new DlgNoParam(Server_ServerCloseEvent); + tcpServer.NewClientEvent += new DlgOneParam(Server_NewClientEvent); + tcpServer.RecvMsgEvent += new DlgOneParam(Server_RecvMsgEvent); + tcpServer.RemoteDisconnectEvent += new DlgOneParam(Server_RemoteDisconnectEvent); + tcpServer.LocalDisconnectEvent += new DlgNoParam(Server_LocalDisconnectEvent); + } + else + { + tcpServer.ServerStartEvent -= new DlgNoParam(Server_ServerStartEvent); + tcpServer.ServerCloseEvent -= new DlgNoParam(Server_ServerCloseEvent); + tcpServer.NewClientEvent -= new DlgOneParam(Server_NewClientEvent); + tcpServer.RecvMsgEvent -= new DlgOneParam(Server_RecvMsgEvent); + tcpServer.RemoteDisconnectEvent -= new DlgOneParam(Server_RemoteDisconnectEvent); + tcpServer.LocalDisconnectEvent -= new DlgNoParam(Server_LocalDisconnectEvent); + } + + break; + case 2://客户端 + if (add) + { + tcpClient.ConnectFailEvent += new DlgNoParam(Client_ConnectFailEvent); + tcpClient.NewClientEvent += new DlgOneParam(Client_NewClientEvent); + tcpClient.RecvMsgEvent += new DlgOneParam(Client_RecvMsgEvent); + tcpClient.RemoteDisconnectEvent += new DlgOneParam(Client_RemoteDisconnectEvent); + tcpClient.LocalDisconnectEvent += new DlgNoParam(Client_LocalDisconnectEvent); + } + else + { + tcpClient.ConnectFailEvent -= new DlgNoParam(Client_ConnectFailEvent); + tcpClient.NewClientEvent -= new DlgOneParam(Client_NewClientEvent); + tcpClient.RecvMsgEvent -= new DlgOneParam(Client_RecvMsgEvent); + tcpClient.RemoteDisconnectEvent -= new DlgOneParam(Client_RemoteDisconnectEvent); + tcpClient.LocalDisconnectEvent -= new DlgNoParam(Client_LocalDisconnectEvent); + } + break; + + default: + + break; + } + } + #endregion + + #region 服务端下层事件处理 + public void Server_ServerStartEvent() + { + StringBox stringBox = new StringBox(); + + if (this.InvokeRequired) + { + this.BeginInvoke(new ThreadStart(delegate () + { + LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", "服务器已启动...")); + + })); + } + else + { + LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", "服务器已启动...")); + } + stringBox.ID = "1"; + stringBox.str = string.Concat(tcpServer.listener.Server.LocalEndPoint.ToString(),"<-->TCP服务器已启动..."); + OnInfoMsg(stringBox); + } + + public void Server_ServerCloseEvent() + { + StringBox stringBox = new StringBox(); + + if (this.InvokeRequired) + { + this.BeginInvoke(new ThreadStart(delegate () + { + LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", "服务器已关闭...")); + + })); + } + else + { + LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", "服务器已关闭...")); + + } + stringBox.ID = "2"; + stringBox.str = string.Concat(tcpServer.listener.Server.LocalEndPoint.ToString(), "<-->TCP服务器已关闭..."); + OnInfoMsg(stringBox); + } + + public void Server_NewClientEvent(string param) + { + StringBox stringBox = new StringBox(); + + if (this.InvokeRequired) + { + this.BeginInvoke(new ThreadStart(delegate () + { + LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", "接收到客户端连接: ",param)); + + ModifyShowsByClientState(true); + })); + } + else + { + LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", "接收到客户端连接: ", param)); + ModifyShowsByClientState(true); + } + stringBox.ID = "1"; + stringBox.str = string.Concat("接收到客户端连接: ", param); + OnInfoMsg(stringBox); + } + + public void Server_RecvMsgEvent(string param) + { + StringBox stringBox = new StringBox(); + if (this.InvokeRequired) + { + this.BeginInvoke(new ThreadStart(delegate () + { + AppendText(param); + })); + } + else + { + AppendText(param); + } + stringBox.str = param; + OnRcvMsg(stringBox); + } + + public void Server_RemoteDisconnectEvent(string param) + { + StringBox stringBox = new StringBox(); + if (this.InvokeRequired) + { + this.BeginInvoke(new ThreadStart(delegate () + { + LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", "远程客户端断开连接: ", param)); + ModifyShowsByClientState(false); + })); + } + else + { + LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", "远程客户端断开连接: ", param)); + ModifyShowsByClientState(false); + } + stringBox.ID = "2"; + stringBox.str = string.Concat("远程客户端断开连接: ", param); + OnInfoMsg(stringBox); + } + + public void Server_LocalDisconnectEvent() + { + StringBox stringBox = new StringBox(); + if (this.InvokeRequired) + { + this.BeginInvoke(new ThreadStart(delegate () + { + LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", "本地主动关闭远程客户端连接")); + + ModifyShowsByClientState(false); + })); + } + else + { + LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", "本地主动关闭远程客户端连接")); + ModifyShowsByClientState(false); + } + stringBox.ID = "2"; + stringBox.str = string.Concat("本地主动关闭远程客户端连接"); + OnInfoMsg(stringBox); + } + + #endregion + + #region 客户端下层事件处理 + public void Client_ConnectFailEvent() + { + StringBox stringBox = new StringBox(); + if (this.InvokeRequired) + { + this.BeginInvoke(new ThreadStart(delegate () + { + LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", "无法连接上指定服务器")); + })); + } + else + { + LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", "无法连接上指定服务器")); + + } + stringBox.ID = "2"; + stringBox.str = string.Concat("本地客户端无法连接上指定服务器"); + OnInfoMsg(stringBox); + } + + public void Client_NewClientEvent(string param) + { + StringBox stringBox = new StringBox(); + if (this.InvokeRequired) + { + this.BeginInvoke(new ThreadStart(delegate () + { + LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", "链接:", param, " 服务端成功")); + ControlsChange(true); + })); + } + else + { + LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", "链接:", param, " 服务端成功")); + ControlsChange(true); + } + stringBox.ID = "1"; + stringBox.str = string.Concat("链接:", param, " 服务端成功"); + OnInfoMsg(stringBox); + } + + public void Client_RecvMsgEvent(string param) + { + if (!string.IsNullOrEmpty(param)) + { + StringBox stringBox = new StringBox(); + if (this.InvokeRequired) + { + this.BeginInvoke(new System.Threading.ThreadStart(delegate () + { + AppendText(param); + })); + } + else + { + AppendText(param); + } + stringBox.str = param; + OnRcvMsg(stringBox); + } + } + + public void Client_RemoteDisconnectEvent(string param) + { + StringBox stringBox = new StringBox(); + if (this.InvokeRequired) + { + this.BeginInvoke(new System.Threading.ThreadStart(delegate () + { + info_Lab.Text = "未连接"; + info_Lab.BackColor = Color.Red; + btnStart.Text = "连接网口"; + btnStart.ForeColor = Color.Black; + btnStart.BackColor = Color.Transparent; + com_GroupBox.Enabled = true; + tcp_GroupBox.Enabled = true; + comBtn_Panel.Enabled = true; + saveSetting_Btn.Enabled = false; + Auto_CheckBox.Enabled = false; + pgeAuto_CheckBox.Enabled = false; + tcpType_Box.Enabled = true; + LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n","服务端:" ,param," 关闭服务")); + ControlsChange(false); + })); + } + else + { + info_Lab.Text = "未连接"; + info_Lab.BackColor = Color.Red; + btnStart.Text = "连接网口"; + btnStart.ForeColor = Color.Black; + btnStart.BackColor = Color.Transparent; + com_GroupBox.Enabled = true; + tcp_GroupBox.Enabled = true; + comBtn_Panel.Enabled = true; + saveSetting_Btn.Enabled = false; + Auto_CheckBox.Enabled = false; + pgeAuto_CheckBox.Enabled = false; + tcpType_Box.Enabled = true; + LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", "服务端:", param, " 关闭服务")); + ControlsChange(false); + } + + stringBox.ID = "2"; + stringBox.str = string.Concat("服务端:", param, " 关闭服务"); + OnInfoMsg(stringBox); + } + + public void Client_LocalDisconnectEvent() + { + StringBox stringBox = new StringBox(); + if (this.InvokeRequired) + { + this.BeginInvoke(new System.Threading.ThreadStart(delegate () + { + LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", "本地客户端关闭服务")); + ControlsChange(false); + })); + } + else + { + LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", "本地客户端关闭服务")); + ControlsChange(false); + } + stringBox.ID = "2"; + stringBox.str = string.Concat("本地客户端关闭服务"); + OnInfoMsg(stringBox); + } + + #endregion + + #region 串口下层事件处理 + /// + /// 串口打开事件 + /// + public void Com_OpenSerialEvent() + { + StringBox stringBox = new StringBox(); + if (this.InvokeRequired) + { + this.BeginInvoke(new ThreadStart(delegate () + { + LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", comSerial.getUserPortName(), " <--> 串口已打开!\r\n")); + + })); + } + else + { + LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", comSerial.getUserPortName(), " <--> 串口已打开!\r\n")); + + } + stringBox.ID = "1"; + stringBox.str = string.Concat(comSerial.getUserPortName(), " <--> 串口已打开!"); + OnInfoMsg(stringBox); + } + + /// + /// 串口关闭事件 + /// + public void Com_ComDisconnectEvent() + { + StringBox stringBox = new StringBox(); + if (this.InvokeRequired) + { + this.BeginInvoke(new ThreadStart(delegate () + { + LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", comSerial.getUserPortName(), " <--> 串口已关闭!\r\n")); + + })); + } + else + { + LogRecord(string.Concat("【", DateTime.Now.ToString("HH:mm:ss.fff"), "】\r\n", comSerial.getUserPortName(), " <--> 串口已关闭!\r\n")); + + } + + stringBox.ID = "2"; + stringBox.str = string.Concat(comSerial.getUserPortName(), " <--> 串口已打开!"); + OnInfoMsg(stringBox); + } + + /// + /// 串口发送事件 + /// + /// + public void Com_SendMsgEvent(string param) + { + if (this.InvokeRequired) + { + this.BeginInvoke(new ThreadStart(delegate () + { + AppendText(param); + })); + } + else + { + AppendText(param); + } + } + + /// + /// 串口接收事件 + /// + /// + public void Com_RecvMsgEvent(string param) + { + StringBox stringBox = new StringBox(); + if (this.InvokeRequired) + { + this.BeginInvoke(new ThreadStart(delegate () + { + AppendText(param); + })); + } + else + { + AppendText(param); + } + stringBox.str = param; + OnRcvMsg(stringBox); + } + #endregion + + + } +} diff --git a/SimpleServer/CommunUI.resx b/SimpleServer/CommunUI.resx new file mode 100644 index 0000000..1cdb731 --- /dev/null +++ b/SimpleServer/CommunUI.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/SimpleServer/FrmCommunication.Designer.cs b/SimpleServer/FrmCommunication.Designer.cs new file mode 100644 index 0000000..920d3f9 --- /dev/null +++ b/SimpleServer/FrmCommunication.Designer.cs @@ -0,0 +1,93 @@ +namespace SimpleCommunication +{ + partial class FrmCommunication + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.tabCt_ComUI = new System.Windows.Forms.TabControl(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.tabCt_ComUI.SuspendLayout(); + this.SuspendLayout(); + // + // tabCt_ComUI + // + this.tabCt_ComUI.Controls.Add(this.tabPage1); + this.tabCt_ComUI.Controls.Add(this.tabPage2); + this.tabCt_ComUI.Dock = System.Windows.Forms.DockStyle.Fill; + this.tabCt_ComUI.Location = new System.Drawing.Point(0, 0); + this.tabCt_ComUI.Name = "tabCt_ComUI"; + this.tabCt_ComUI.SelectedIndex = 0; + this.tabCt_ComUI.Size = new System.Drawing.Size(921, 548); + this.tabCt_ComUI.TabIndex = 0; + // + // tabPage1 + // + this.tabPage1.Location = new System.Drawing.Point(4, 22); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.Padding = new System.Windows.Forms.Padding(3, 3, 3, 3); + this.tabPage1.Size = new System.Drawing.Size(913, 522); + this.tabPage1.TabIndex = 0; + this.tabPage1.Text = "tabPage1"; + this.tabPage1.UseVisualStyleBackColor = true; + // + // tabPage2 + // + this.tabPage2.Location = new System.Drawing.Point(4, 22); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.Padding = new System.Windows.Forms.Padding(3, 3, 3, 3); + this.tabPage2.Size = new System.Drawing.Size(913, 522); + this.tabPage2.TabIndex = 1; + this.tabPage2.Text = "tabPage2"; + this.tabPage2.UseVisualStyleBackColor = true; + // + // FrmCommunication + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(921, 548); + this.Controls.Add(this.tabCt_ComUI); + this.DoubleBuffered = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmCommunication"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "TCP/IP_Com通讯"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmCommunication_FormClosing); + this.Load += new System.EventHandler(this.Form1_Load); + this.tabCt_ComUI.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TabControl tabCt_ComUI; + private System.Windows.Forms.TabPage tabPage1; + private System.Windows.Forms.TabPage tabPage2; + } +} \ No newline at end of file diff --git a/SimpleServer/FrmCommunication.cs b/SimpleServer/FrmCommunication.cs new file mode 100644 index 0000000..706060b --- /dev/null +++ b/SimpleServer/FrmCommunication.cs @@ -0,0 +1,238 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace SimpleCommunication +{ + public partial class FrmCommunication : Form + { + public List lstComPage = new List(); + private int ComCount; + /// + /// 定义MelsecPLCUI自定义控件List集合 + /// + public List lstUI = new List(); + + /// + /// 配置文件实体类 + /// + private List lstComConfig = new List(); + /// + /// PLC读取寄存器配置文件 + /// + private string ConfigPath = Path.Combine(System.Windows.Forms.Application.StartupPath, "Config\\ComConfig.ini"); + + + public FrmCommunication() + { + InitializeComponent(); + //ConfigPath = path; + //ComCount = int.Parse(new IniHelper(ConfigPath).IniReadValue("SystemConfig", "ComCount")); + ComCount = 1; + ReadPlcConfig(ComCount); + LoadUI(ComCount); + } + + + + + public void ReadPlcConfig(int Count) + { + try + { + for (int j = 0; j < Count; j++) + { + ComConfig comConfig = new ComConfig(); + comConfig.Index = j + 1; + comConfig.Auto_Connect = bool.Parse(new IniHelper(ConfigPath).IniReadValue(comConfig.Index + "#COMMUNICATION_SETTING", "Auto_Connect")); + comConfig.Connect_Typt = int.Parse(new IniHelper(ConfigPath).IniReadValue(comConfig.Index + "#COMMUNICATION_SETTING", "Connect_Typt")); + + comConfig.TCP_IP = new IniHelper(ConfigPath).IniReadValue(comConfig.Index + "#COMMUNICATION_SETTING", "TCP_IP"); + comConfig.TCP_Port = int.Parse(new IniHelper(ConfigPath).IniReadValue(comConfig.Index + "#COMMUNICATION_SETTING", "TCP_Port")); + comConfig.HeartBeat = bool.Parse(new IniHelper(ConfigPath).IniReadValue(comConfig.Index + "#COMMUNICATION_SETTING", "HeartBeat")); + comConfig.HeartText = new IniHelper(ConfigPath).IniReadValue(comConfig.Index + "#COMMUNICATION_SETTING", "HeartText"); + comConfig.HeartTime = int.Parse(new IniHelper(ConfigPath).IniReadValue(comConfig.Index + "#COMMUNICATION_SETTING", "HeartTime")); + + comConfig.COM_Port = new IniHelper(ConfigPath).IniReadValue(comConfig.Index + "#COMMUNICATION_SETTING", "COM_Port"); + comConfig.COM_BaudRate = int.Parse(new IniHelper(ConfigPath).IniReadValue(comConfig.Index + "#COMMUNICATION_SETTING", "COM_BaudRate")); + comConfig.COM_Parity = new IniHelper(ConfigPath).IniReadValue(comConfig.Index + "#COMMUNICATION_SETTING", "COM_Parity"); + comConfig.COM_DataBit = int.Parse(new IniHelper(ConfigPath).IniReadValue(comConfig.Index + "#COMMUNICATION_SETTING", "COM_DataBit")); + comConfig.COM_StopBit = int.Parse(new IniHelper(ConfigPath).IniReadValue(comConfig.Index + "#COMMUNICATION_SETTING", "COM_StopBit")); + + comConfig.Endsymbol = int.Parse(new IniHelper(ConfigPath).IniReadValue(comConfig.Index + "#COMMUNICATION_SETTING", "Endsymbol")); + lstComConfig.Add(comConfig); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + } + } + + + /// + /// 加载MelsecPLCUI窗口 + /// + /// + public void LoadUI(int Count) + { + tabCt_ComUI.TabPages.Clear(); + for (int i = 0; i < Count; i++) + { + tabCt_ComUI.TabPages.Add(i + 1 + "#通讯模块"); + Panel panelUI = new Panel(); + panelUI.Dock = DockStyle.Fill; + tabCt_ComUI.TabPages[i].Controls.Add(panelUI); + CommunUI plcUI = new CommunUI(lstComConfig[i]); + plcUI.Dock = DockStyle.Fill; + plcUI.SaveParamsEvent += plcUI_SaveParamsEvent; + lstUI.Add(plcUI); + panelUI.Controls.Add(plcUI); + LoadIni(i); + } + } + + + /// + /// 循环保存参数 + /// + /// + /// + private void plcUI_SaveParamsEvent(int comIndex, int trgIndex) + { + if (trgIndex == 0) + { + for (int i = 0; i < comIndex; i++) + { + SaveComParam(comIndex); + + } + + } + } + + + + /// + /// + /// + /// TCP_Typt + public void SaveComParam(int comIndex) + { + new IniHelper(ConfigPath).IniWriteValue(comIndex + "#COMMUNICATION_SETTING", "Tgr_Count", lstUI[comIndex - 1].ComConfig.Index.ToString()); + new IniHelper(ConfigPath).IniWriteValue(comIndex + "#COMMUNICATION_SETTING", "Auto_Connect", lstUI[comIndex - 1].ComConfig.Auto_Connect.ToString()); + new IniHelper(ConfigPath).IniWriteValue(comIndex + "#COMMUNICATION_SETTING", "Connect_Typt", lstUI[comIndex - 1].ComConfig.Connect_Typt.ToString()); + new IniHelper(ConfigPath).IniWriteValue(comIndex + "#COMMUNICATION_SETTING", "TCP_IP", lstUI[comIndex - 1].ComConfig.TCP_IP.ToString()); + new IniHelper(ConfigPath).IniWriteValue(comIndex + "#COMMUNICATION_SETTING", "TCP_Port", lstUI[comIndex - 1].ComConfig.TCP_Port.ToString()); + new IniHelper(ConfigPath).IniWriteValue(comIndex + "#COMMUNICATION_SETTING", "HeartBeat", lstUI[comIndex - 1].ComConfig.HeartBeat.ToString()); + new IniHelper(ConfigPath).IniWriteValue(comIndex + "#COMMUNICATION_SETTING", "HeartText", lstUI[comIndex - 1].ComConfig.HeartText.ToString()); + new IniHelper(ConfigPath).IniWriteValue(comIndex + "#COMMUNICATION_SETTING", "HeartTime", lstUI[comIndex - 1].ComConfig.HeartTime.ToString()); + new IniHelper(ConfigPath).IniWriteValue(comIndex + "#COMMUNICATION_SETTING", "COM_Port", lstUI[comIndex - 1].ComConfig.COM_Port.ToString()); + new IniHelper(ConfigPath).IniWriteValue(comIndex + "#COMMUNICATION_SETTING", "COM_StopBit", lstUI[comIndex - 1].ComConfig.COM_StopBit.ToString()); + new IniHelper(ConfigPath).IniWriteValue(comIndex + "#COMMUNICATION_SETTING", "COM_BaudRate", lstUI[comIndex - 1].ComConfig.COM_BaudRate.ToString()); + new IniHelper(ConfigPath).IniWriteValue(comIndex + "#COMMUNICATION_SETTING", "COM_Parity", lstUI[comIndex - 1].ComConfig.COM_Parity.ToString()); + new IniHelper(ConfigPath).IniWriteValue(comIndex + "#COMMUNICATION_SETTING", "COM_DataBit", lstUI[comIndex - 1].ComConfig.COM_DataBit.ToString()); + new IniHelper(ConfigPath).IniWriteValue(comIndex + "#COMMUNICATION_SETTING", "Endsymbol", lstUI[comIndex - 1].ComConfig.Endsymbol.ToString()); + } + + private void Form1_Load(object sender, EventArgs e) + { + + } + + private void LoadIni(int comIndex) + { + + lstUI[comIndex].txtHeartData.Text = new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "HeartText"); + lstUI[comIndex].txtIntervalTime.Text = new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "HeartTime"); + lstUI[comIndex].pgeAuto_CheckBox.Checked = ((new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "HeartBeat") == "True") ? true : false); + lstUI[comIndex].cmbEndSymbol.SelectedIndex = Convert.ToInt32(new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "Endsymbol")); + if (new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "Auto_Connect") == "True") + { + lstUI[comIndex].Auto_CheckBox.Checked = true; + //串口 + if (Convert.ToInt32(new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "Connect_Typt")) == 0) + { + lstUI[comIndex].Server_GroupBox.Visible = false; + lstUI[comIndex].info_GroupBox.Dock = DockStyle.Fill; + lstUI[comIndex].tcpType_Box.SelectedIndex = Convert.ToInt32(new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "Connect_Typt")); + lstUI[comIndex].comPort_Box.Items.Clear(); + lstUI[comIndex].comPort_Box.Items.Add(new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "COM_Port")); + lstUI[comIndex].comPort_Box.Text = lstUI[comIndex].comPort_Box.Items[0].ToString(); + lstUI[comIndex].baudRate_Box.Text = new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "COM_BaudRate"); + lstUI[comIndex].parity_Box.Text = new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "COM_Parity"); + lstUI[comIndex].dataBits_Box.Text = new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "COM_DataBit"); + lstUI[comIndex].stopBits_Box.Text = new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "COM_StopBit"); + lstUI[comIndex].COMOpen(); + } + //服务端 + else if (Convert.ToInt32(new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "Connect_Typt")) == 1) + { + lstUI[comIndex].tcpType_Box.SelectedIndex = Convert.ToInt32(new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "Connect_Typt")); + lstUI[comIndex].tbIP.Items.Clear(); + lstUI[comIndex].tbIP.Items.Add(new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "TCP_IP")); + lstUI[comIndex].tbIP.Text = lstUI[comIndex].tbIP.Items[0].ToString(); + lstUI[comIndex].tbPort.Text = new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "TCP_Port"); + //lstUI[comIndex].TCPOpen(); + } + //客户端 + else if (Convert.ToInt32(new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "Connect_Typt")) == 2) + { + lstUI[comIndex].Server_GroupBox.Visible = false; + lstUI[comIndex].info_GroupBox.Dock = DockStyle.Fill; + lstUI[comIndex].tcpType_Box.SelectedIndex = Convert.ToInt32(new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "Connect_Typt")); + lstUI[comIndex].tbIP.Items.Clear(); + lstUI[comIndex].tbIP.Items.Add(new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "TCP_IP")); + lstUI[comIndex].tbIP.Text = lstUI[comIndex].tbIP.Items[0].ToString(); + lstUI[comIndex].tbPort.Text = new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "TCP_Port"); + //lstUI[comIndex].TCPOpen(); + } + else + { + //串口 + lstUI[comIndex].Server_GroupBox.Visible = false; + lstUI[comIndex].info_GroupBox.Dock = DockStyle.Fill; + lstUI[comIndex].tcpType_Box.SelectedIndex = Convert.ToInt32(new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "Connect_Typt")); + lstUI[comIndex].comPort_Box.Items.Clear(); + lstUI[comIndex].comPort_Box.Items.Add(new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "COM_Port")); + lstUI[comIndex].comPort_Box.Text = lstUI[comIndex].comPort_Box.Items[0].ToString(); + lstUI[comIndex].baudRate_Box.Text = new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "COM_BaudRate"); + lstUI[comIndex].parity_Box.Text = new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "COM_Parity"); + lstUI[comIndex].dataBits_Box.Text = new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "COM_DataBit"); + lstUI[comIndex].stopBits_Box.Text = new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "COM_StopBit"); + lstUI[comIndex].COMOpen(); + + //客户端 + lstUI[comIndex].Server_GroupBox.Visible = false; + lstUI[comIndex].info_GroupBox.Dock = DockStyle.Fill; + lstUI[comIndex].tcpType_Box.SelectedIndex = Convert.ToInt32(new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "Connect_Typt")); + lstUI[comIndex].tbIP.Items.Clear(); + lstUI[comIndex].tbIP.Items.Add(new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "TCP_IP")); + lstUI[comIndex].tbIP.Text = lstUI[comIndex].tbIP.Items[0].ToString(); + lstUI[comIndex].tbPort.Text = new IniHelper(ConfigPath).IniReadValue((comIndex + 1) + "#COMMUNICATION_SETTING", "TCP_Port"); + //lstUI[comIndex].TCPOpen(); + } + } + else + { + lstUI[comIndex].Auto_CheckBox.Checked = false; + lstUI[comIndex].comSerial.LoadComSerial(lstUI[comIndex].comPort_Box); + lstUI[comIndex].LocalIP(lstUI[comIndex].tbIP); + } + } + + + private void FrmCommunication_FormClosing(object sender, FormClosingEventArgs e) + { + this.Visible = false; + e.Cancel = true; + } + } +} diff --git a/SimpleServer/FrmCommunication.resx b/SimpleServer/FrmCommunication.resx new file mode 100644 index 0000000..61bc649 --- /dev/null +++ b/SimpleServer/FrmCommunication.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + \ No newline at end of file diff --git a/SimpleServer/IniHelper.cs b/SimpleServer/IniHelper.cs new file mode 100644 index 0000000..b31fd05 --- /dev/null +++ b/SimpleServer/IniHelper.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace SimpleCommunication +{ + public class IniHelper + { + public string path; + public IniHelper(string INIPath) + { + path = INIPath; + } + [DllImport("kernel32", CharSet = CharSet.Unicode)] + private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); + + [DllImport("kernel32", CharSet = CharSet.Unicode)] + private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath); + + [DllImport("kernel32", CharSet = CharSet.Unicode)] + private static extern int GetPrivateProfileString(string section, string key, string defVal, byte[] retVal, int size, string filePath); + public void IniWriteValue(string Section, string Key, string Value) + { + WritePrivateProfileString(Section, Key, Value, path); + } + public string IniReadValue(string Section, string Key) + { + try + { + StringBuilder temp = new StringBuilder(255); + int i = GetPrivateProfileString(Section, Key, "", temp, 255, path); + return temp.ToString(); + } + catch (Exception) + { + return null; + } + } + public byte[] IniReadValues(string section, string key) + { + byte[] temp = new byte[255]; + int i = GetPrivateProfileString(section, key, "", temp, 255, path); + return temp; + } + + public void ClearAllSection() + { + IniWriteValue(null, null, null); + } + + public void ClearSection(string Section) + { + IniWriteValue(Section, null, null); + } + } +} diff --git a/SimpleServer/LogHelper.cs b/SimpleServer/LogHelper.cs new file mode 100644 index 0000000..a0e85b7 --- /dev/null +++ b/SimpleServer/LogHelper.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +namespace SimpleCommunication +{ + public class LogHelper : IDisposable + { + private static LogHelper logHelper; + private static object singleLock = new object(); + private string logPath = Path.Combine(System.Environment.CurrentDirectory, "Log.txt"); + private string spaceSymbols = "\r\n\r\n--------------------------------------------\r\n\r\n"; + private byte[] spaceSymbolsBytes; + private FileStream fileStream; + + private LogHelper() + { + } + + public static LogHelper GetInstance() + { + if (logHelper == null) + { + lock (singleLock) + { + if (logHelper == null) + { + logHelper = new LogHelper(); + } + } + } + return logHelper; + } + + public void SetLogPath(string logPath) + { + this.logPath = Path.Combine(logPath, "Log.txt"); + } + + public void Init() + { + fileStream = new FileStream(logPath, FileMode.OpenOrCreate, FileAccess.ReadWrite); + spaceSymbolsBytes = Encoding.Default.GetBytes(spaceSymbols); + } + + public void SetSpaceSymbols(string spaceSymbols) + { + this.spaceSymbols = spaceSymbols; + this.spaceSymbolsBytes = Encoding.Default.GetBytes(spaceSymbols); + } + + public void Log(string content) + { + if (!string.IsNullOrEmpty(content)) + { + fileStream.Seek(0, SeekOrigin.End); + byte[] bytes = Encoding.Default.GetBytes(content); + fileStream.Write(bytes, 0, bytes.Length); + fileStream.Write(spaceSymbolsBytes, 0, spaceSymbolsBytes.Length); + fileStream.Flush(); + } + } + + public void Dispose() + { + if (fileStream != null) + { + fileStream.Dispose(); + } + } + } +} diff --git a/SimpleServer/Program.cs b/SimpleServer/Program.cs new file mode 100644 index 0000000..db4455e --- /dev/null +++ b/SimpleServer/Program.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using System.Threading; + +namespace SimpleCommunication +{ + static class Program + { + /// + /// 应用程序的主入口点。 + /// + [STAThread] + static void Main() + { + LogHelper.GetInstance().Init(); + + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); + Application.Run(new FrmCommunication()); + + LogHelper.GetInstance().Dispose(); + } + + static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) + { + LogHelper.GetInstance().Log(e.Exception.Message); + } + } +} diff --git a/SimpleServer/Properties/AssemblyInfo.cs b/SimpleServer/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..b749d0a --- /dev/null +++ b/SimpleServer/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的常规信息通过以下 +// 特性集控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("SimpleCommunication")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SimpleCommunication")] +[assembly: AssemblyCopyright("Copyright © 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 使此程序集中的类型 +// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型, +// 则将该类型上的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("4a5ff5e4-13bc-4f97-b59f-a6fb5123c026")] + +// 程序集的版本信息由下面四个值组成: +// +// 主版本 +// 次版本 +// 内部版本号 +// 修订号 +// +// 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/SimpleServer/Properties/Resources.Designer.cs b/SimpleServer/Properties/Resources.Designer.cs new file mode 100644 index 0000000..33c0265 --- /dev/null +++ b/SimpleServer/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace SimpleCommunication.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.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() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [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("SimpleCommunication.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/SimpleServer/Properties/Resources.resx b/SimpleServer/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/SimpleServer/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SimpleServer/Properties/Settings.Designer.cs b/SimpleServer/Properties/Settings.Designer.cs new file mode 100644 index 0000000..6cdd99b --- /dev/null +++ b/SimpleServer/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace SimpleCommunication.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.11.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; + } + } + } +} diff --git a/SimpleServer/Properties/Settings.settings b/SimpleServer/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/SimpleServer/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/SimpleServer/Serial.cs b/SimpleServer/Serial.cs new file mode 100644 index 0000000..048bc1c --- /dev/null +++ b/SimpleServer/Serial.cs @@ -0,0 +1,239 @@ +using System; +using System.Collections.Generic; +using System.IO.Ports; +using System.Linq; +using System.Runtime.Remoting.Messaging; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace SimpleCommunication +{ + + public class Serial : IDisposable + { + #region DataMember & Ctor + public SerialPort serialPort; + private string[] port; + public SerialPort Comm { get; private set; } + private List list = new List(4096); + + //在事务处理结束后才触发下列事件 + public event DlgNoParam ComOpenEvent; + public event DlgOneParam RecvMsgEvent; + public event DlgOneParam SendMsgEvent; + public event DlgNoParam ComDisconnectEvent; + + public bool IsOpen => (serialPort != null && serialPort.IsOpen) ? true : false; + + + + public Serial() + { + serialPort = new SerialPort(); + } + #endregion + + /// + /// 获取窗口名 + /// + /// + public string getUserPortName() + { + return serialPort.PortName; + } + + /// + /// 加载串口 + /// + /// + public void LoadComSerial(ComboBox ComPort) + { + ComPort.Items.Clear(); + list.Clear(); + if (!IsOpen) + { + port = SerialPort.GetPortNames(); + for (int i = 0; i < port.Count(); i++) + { + try + { + SerialPort serialPort = new SerialPort(port[i]); + serialPort.Open(); + serialPort.Close(); + list.Add(port[i]); + } + catch + { + } + } + port = list.ToArray(); + Array.Sort(port); + ComboBox.ObjectCollection items = ComPort.Items; + object[] items2 = port; + items.AddRange(items2); + if (port.Length != 0) + { + ComPort.Text = port[0]; + } + } + else + { + ComPort.Text = getUserPortName(); + } + } + /// + /// 打开串口 + /// + /// + /// + /// + /// + /// + public void OpenSerialPort(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits) + { + serialPort.PortName = portName; + serialPort.BaudRate = baudRate; + serialPort.Parity = parity; + serialPort.DataBits = dataBits; + serialPort.StopBits = stopBits; + try + { + serialPort.ReadBufferSize = 4096; + serialPort.DataReceived += ComReceived; + serialPort.Open(); + if (ComOpenEvent != null) + { + ComOpenEvent(); + } + } + catch (Exception) + { + MessageBox.Show("串口被占用,请重新选择!"); + } + } + + /// + /// 关闭串口 + /// + public void CloseSeriaPort() + { + serialPort.DataReceived -= ComReceived; + serialPort.Close(); + } + + /// + /// + /// + /// + /// + private void ComReceived(object sender, SerialDataReceivedEventArgs e) + { + try + { + if (serialPort.IsOpen) + { + string text = ""; + Thread.Sleep(50); + int length = serialPort.BytesToRead; + byte[] data = new byte[length]; + serialPort.Read(data, 0, length); + //对串口接收数据的处理,可对data进行解析 + string data1 = string.Empty; + for (int i = 0; i < length; i++) + { + data1 += Convert.ToString(data[i], 16).ToUpper(); + //data.AppendText(str.Length == 1 ? "0" + str + " " : str + " ");//将接收到的数据以十六进制显示到文本框内 + } + + //int bytesToRead = serialPort.BytesToRead; + //string data = string.Empty; + //while (serialPort.BytesToRead > 0) + //{ + // data += serialPort.ReadExisting(); //数据读取,直到读完缓冲区数据 + //} + + //for (int i = 0; i < bytesToRead; i++) + //{ + // int utf = serialPort.ReadByte(); + // //text = serialPort.ReadTo("\r"); + // string text2 = char.ConvertFromUtf32(utf); + // text += text2; + //} + + if (this.RecvMsgEvent != null) + { + this.RecvMsgEvent(data1); + } + } + } + catch (Exception ex) + { + MessageBox.Show(ex.ToString()); + } + } + + + /// + /// 同步发送返回数据 + /// + /// + /// + public string SendReturnData(string str) + { + string text = ""; + try + { + if (serialPort.IsOpen) + { + serialPort.Write(str); + Thread.Sleep(100); + text = serialPort.ReadTo("\r"); + } + } + catch (Exception ex) + { + + } + return text; + } + + /// + /// 发送字符串 + /// + /// + public void SendString(string str) + { + try + { + serialPort.Write(str); + if (this.SendMsgEvent != null) + { + this.SendMsgEvent(str); + } + } + catch (Exception ex) + { + //MessageBox.Show(ex.ToString()); + } + } + + + /// + /// + /// 在已连接条件下关闭本地连接和资源释放时调用 + /// + public void Dispose() + { + if (serialPort != null&& serialPort.IsOpen) + { + CloseSeriaPort(); + if (this.ComDisconnectEvent != null) + { + this.ComDisconnectEvent(); + } + } + } + } +} diff --git a/SimpleServer/Server.cs b/SimpleServer/Server.cs new file mode 100644 index 0000000..e734c1d --- /dev/null +++ b/SimpleServer/Server.cs @@ -0,0 +1,272 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Net.Sockets; +using System.Threading; +using System.Net; +using SimpleCommunication; +using System.Windows.Forms; + +namespace SimpleCommunication +{ + public class Server : IDisposable + { + #region DataMember + public TcpListener listener; + public Client currentClient; + + private object listenerLock = new object();//锁TcpListener;在BeginAcceptClient,EndAcceptClient,ServerClose这3函数使用;ServerClose之后不能再调用BeginAcceptClient,EndAcceptClient + /// + /// 服务器是否启用监听 + /// + public bool serverStart = false; + + private EventWaitHandle eventWaitHdl = new EventWaitHandle(false, EventResetMode.ManualReset); + + //在事务处理结束后才触发下列事件 + public event DlgNoParam ServerStartEvent; + public event DlgNoParam ServerCloseEvent; + public event DlgOneParam NewClientEvent; + public event DlgOneParam RecvMsgEvent; + public event DlgNoParam LocalDisconnectEvent; + public event DlgOneParam RemoteDisconnectEvent; + + public bool IsConnected => (listener != null && serverStart) ? true : false; + #endregion + + #region 服务器监听启动关闭和连接接收 + public bool Start(ComboBox Server_IP, TextBox txtPort, int maxClient = 10) + { + bool result = false; + try + { + if (!string.IsNullOrEmpty(Server_IP.Text) && !string.IsNullOrEmpty(txtPort.Text)) + { + if (Convert.ToInt32(txtPort.Text) > 1024) + { + IPAddress ipAddr = IPAddress.Parse(Server_IP.Text); + IPEndPoint point = new IPEndPoint(ipAddr, Convert.ToInt32(txtPort.Text)); + listener = new TcpListener(point); + listener.Start(); + result = true; + serverStart = true; + if (ServerStartEvent != null) + { + ServerStartEvent(); + } + } + } + } + catch(Exception ex) + { + throw ex; + } + return result; + } + + /// + /// 有互斥资源 + /// 接收连接主入口,监听启动后调用和每次接收到连接后调用 + /// + public void BeginAcceptClient() + { + try + { + while (true) + { + eventWaitHdl.Reset(); + lock (listenerLock) + { + if (serverStart) + { + listener.BeginAcceptTcpClient(EndAcceptClient, null); + } + else + { + return; + } + } + eventWaitHdl.WaitOne(); + } + } + catch + { + + } + } + + /// + /// 有互斥资源 + /// 接收到客户端连接时调用到,关闭listener时也调用到 + /// + /// + private void EndAcceptClient(IAsyncResult ar) + { + try + { + TcpClient tcpclient = null; + lock (listenerLock) + { + if (serverStart) + { + tcpclient = listener.EndAcceptTcpClient(ar);//在这句话之前或者client.BeginRead之前断掉远程客户端都没事,tcpclient都不为null + } + } + eventWaitHdl.Set(); + if (tcpclient != null)//listener.stop后tcpclient == null,不会进入下面代码 + { + InitClient(tcpclient); + } + } + catch + { + + } + } + + /// + /// 有互斥资源 + /// 在listener监听状态下关闭listener时调用,资源释放时调用 + /// + /// + public bool ServerClose() + { + bool result = false; + try + { + lock (listenerLock) + { + if (serverStart) + { + serverStart = false; + listener.Stop(); + result = true; + if (ServerCloseEvent != null) + { + ServerCloseEvent(); + } + } + } + } + catch + { + + } + return result; + } + #endregion + + #region Client相关操作 + private void InitClient(TcpClient tcpclient) + { + currentClient = new Client(tcpclient); + ClientDlgSubscribe(true); + currentClient.BeginRead();//即使在这之前服务器断开,该函数返回值也等于1 + } + + /// + /// InitClient,CurrentClient_LocalDisconnectEvent,Client_DisconnectEvent调用到 + /// 在事务处理结束后调用到 + /// + /// + public void ClientDlgSubscribe(bool add) + { + if (add) + { + currentClient.NewClientEvent += new DlgOneParam(Client_NewClientEvent); + currentClient.RecvMsgEvent += new DlgOneParam(Client_RecvMsgEvent); + currentClient.RemoteDisconnectEvent += new DlgOneParam(Client_DisconnectEvent); + currentClient.LocalDisconnectEvent += new DlgNoParam(CurrentClient_LocalDisconnectEvent); + } + else + { + currentClient.NewClientEvent -= new DlgOneParam(Client_NewClientEvent); + currentClient.RecvMsgEvent -= new DlgOneParam(Client_RecvMsgEvent); + currentClient.RemoteDisconnectEvent -= new DlgOneParam(Client_DisconnectEvent); + currentClient.LocalDisconnectEvent -= new DlgNoParam(CurrentClient_LocalDisconnectEvent); + } + } + + public bool SendMsg(string msg) + { + bool result = false; + try + { + if (currentClient.SendMsg(msg)) + { + result = true; + } + } + catch + { + + } + return result; + } + + /// + /// 客户端连接情况下断开连接时调用,释放资源时调用 + /// + /// + public bool DisconnectClient() + { + bool result = false; + try + { + if (currentClient != null) + { + currentClient.Dispose(); + result = true; + } + } + catch + { + + } + return result; + } + + public void Client_NewClientEvent(string param) + { + if (NewClientEvent != null) + { + NewClientEvent(param); + } + } + + public void Client_RecvMsgEvent(string param) + { + if (RecvMsgEvent != null) + { + RecvMsgEvent(param); + } + } + + public void Client_DisconnectEvent(string param) + { + ClientDlgSubscribe(false); + if (RemoteDisconnectEvent != null) + { + RemoteDisconnectEvent(param); + } + } + + public void CurrentClient_LocalDisconnectEvent() + { + ClientDlgSubscribe(false); + if (LocalDisconnectEvent != null) + { + LocalDisconnectEvent(); + } + } + #endregion + + #region 资源释放 + public void Dispose() + { + ServerClose(); + DisconnectClient(); + } + #endregion + } +} diff --git a/SimpleServer/SimpleCommunication.csproj b/SimpleServer/SimpleCommunication.csproj new file mode 100644 index 0000000..e57d91c --- /dev/null +++ b/SimpleServer/SimpleCommunication.csproj @@ -0,0 +1,147 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {D73FAE32-AAA3-4A51-BB0A-F1A5DC5A7260} + WinExe + Properties + SimpleCommunication + SimpleCommunication + v4.8 + 512 + + + + x86 + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + x86 + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + true + bin\x64\Debug\ + DEBUG;TRACE + full + x64 + 7.3 + prompt + MinimumRecommendedRules.ruleset + false + + + bin\x64\Release\ + TRACE + true + pdbonly + x64 + 7.3 + prompt + MinimumRecommendedRules.ruleset + false + + + true + ..\..\..\..\JY.Inspection\ + DEBUG;TRACE + full + AnyCPU + 7.3 + prompt + MinimumRecommendedRules.ruleset + + + bin\Release\ + TRACE + true + pdbonly + AnyCPU + 7.3 + prompt + MinimumRecommendedRules.ruleset + + + + + + + + + + + + + + + Form + + + FrmCommunication.cs + + + + + + + + + UserControl + + + CommunUI.cs + + + + FrmCommunication.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + CommunUI.cs + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + \ No newline at end of file diff --git a/SimpleServer/SimpleCommunication.csproj.user b/SimpleServer/SimpleCommunication.csproj.user new file mode 100644 index 0000000..c10e84b --- /dev/null +++ b/SimpleServer/SimpleCommunication.csproj.user @@ -0,0 +1,6 @@ + + + + ProjectFiles + + \ No newline at end of file diff --git a/SimpleServer/StringBox.cs b/SimpleServer/StringBox.cs new file mode 100644 index 0000000..6af643a --- /dev/null +++ b/SimpleServer/StringBox.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace SimpleCommunication +{ + public class StringBox + { + public string str = null; + + public string ID = null; + + public int isConnetMsg = 0; + } +} diff --git a/SimpleServer/app.config b/SimpleServer/app.config new file mode 100644 index 0000000..3e0e37c --- /dev/null +++ b/SimpleServer/app.config @@ -0,0 +1,3 @@ + + + diff --git a/SocketHelper/DelegateHelper.cs b/SocketHelper/DelegateHelper.cs new file mode 100644 index 0000000..94cb0ce --- /dev/null +++ b/SocketHelper/DelegateHelper.cs @@ -0,0 +1,37 @@ +/******************************************************************** + * * + * * Copyright (C) 2013-? Corporation All rights reserved. + * * 作者: BinGoo QQ:315567586 + * * 请尊重作者劳动成果,请保留以上作者信息,禁止用于商业活动。 + * * + * * 创建时间:2014-08-05 + * * 说明: + * * +********************************************************************/ +namespace SocketHelper +{ + public class DelegateHelper + { + #region 委托方法 + /// + /// 接收数据委托方法 + /// + public static SocketReadCallBack SocketReceive; + /// + /// 接收数据的委托 + /// + /// + public delegate void SocketReadCallBack(string msg); + + /// + /// 接收信息委托方法 + /// + public static SocketReadInfoCallBack SocketInfo; + /// + /// 接收数据的委托 + /// + /// + public delegate void SocketReadInfoCallBack(string msg); + #endregion + } +} diff --git a/SocketHelper/Properties/AssemblyInfo.cs b/SocketHelper/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..55c5ac1 --- /dev/null +++ b/SocketHelper/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的常规信息通过以下 +// 特性集控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("SocketHelper")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SocketHelper")] +[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 使此程序集中的类型 +// 对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +// 则将该类型上的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("0bbfb4a9-e262-4bbc-a53c-bd61b56c7cf9")] + +// 程序集的版本信息由下面四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/SocketHelper/SocketHelper.csproj b/SocketHelper/SocketHelper.csproj new file mode 100644 index 0000000..5b2c5f4 --- /dev/null +++ b/SocketHelper/SocketHelper.csproj @@ -0,0 +1,53 @@ + + + + + Debug + AnyCPU + {2E9AC112-75CC-4FB6-B058-F9C7424514EF} + Library + Properties + SocketHelper + SocketHelper + v4.8 + 512 + + + + true + full + false + ..\..\..\..\JY.Inspection\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SocketHelper/TCPClient.cs b/SocketHelper/TCPClient.cs new file mode 100644 index 0000000..b19ae6f --- /dev/null +++ b/SocketHelper/TCPClient.cs @@ -0,0 +1,256 @@ + +using System; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading; + +namespace SocketHelper +{ + public class TCPClient + { + #region 属性 + private string _serverip; + /// + /// 服务端IP + /// + public string ServerIp + { + set { _serverip = value; } + get { return _serverip; } + } + private int _serverport; + /// + /// 服务端监听端口 + /// + public int ServerPort + { + set { _serverport = value; } + get { return _serverport; } + } + private TcpClient _tcpclient = null; + /// + /// TcpClient客户端 + /// + public TcpClient Tcpclient + { + set { _tcpclient = value; } + get { return _tcpclient; } + } + private Thread _tcpthread = null; + /// + /// Tcp客户端连接线程 + /// + public Thread Tcpthread + { + set { _tcpthread = value; } + get { return _tcpthread; } + } + private bool _isStarttcpthreading = false; + /// + /// 是否启动Tcp连接线程 + /// + public bool IsStartTcpthreading + { + set { _isStarttcpthreading = value; } + get { return _isStarttcpthreading; } + } + private bool _isclosed; + /// + /// 连接是否关闭 + /// + public bool Isclosed + { + set { _isclosed = value; } + get { return _isclosed; } + } + private string _receivestr; + /// + /// 接收Socket数据包 缓存字符串 + /// + public string Receivestr + { + set { _receivestr = value; } + get { return _receivestr; } + } + /// + /// 重连次数 + /// + private int _reConectedCount = 0; + public int ReConectedCount { + get { return _reConectedCount; } + set { _reConectedCount = value; } + } + + #endregion + #region 方法 + /// + /// 十六进制字字符串转为节数组 + /// + /// + /// + public static byte[] StringToHexByteArray(string s) + { + s = s.Replace(" ", ""); + if ((s.Length % 2) != 0) + s += " "; + byte[] returnBytes = new byte[s.Length / 2]; + for (int i = 0; i < returnBytes.Length; i++) + returnBytes[i] = Convert.ToByte(s.Substring(i * 2, 2), 16); + return returnBytes; + } + /// + /// 启动连接Socket服务器 + /// + public void StartConnection() + { + try + { + Isclosed = false; + CreateTcpClient(); + } + catch (Exception ex) + { + //LogHelper.WriteLog(ex.Message); + DelegateHelper.SocketInfo("错误信息:" + ex.Message); + } + } + /// + /// 创建线程连接 + /// + private void CreateTcpClient() + { + if (Isclosed) + return; + + Tcpclient = new TcpClient(); + Tcpthread = new Thread(StartTcpThread); + IsStartTcpthreading = true; + Tcpthread.Start(); + } + /// + /// 线程接收Socket上传的数据 + /// + private void StartTcpThread() + { + byte[] receivebyte = new byte[128]; + int bytelen; + try + { + while (IsStartTcpthreading) + { + if (!Tcpclient.Connected) + { + try + { + if (ReConectedCount != 0) + { + DelegateHelper.SocketInfo(string.Format("正在第{0}次重新连接FMS服务器... ...", ReConectedCount)); + } + else + { + DelegateHelper.SocketInfo("正在连接FMS服务器... ..."); + } + Tcpclient.Connect(IPAddress.Parse(ServerIp), ServerPort); + DelegateHelper.SocketInfo("已连接FMS服务器"); + + } + catch + { + //连接失败 + ReConectedCount++; + IsStartTcpthreading = false; + Thread.Sleep(3000); + continue; + } + } + bytelen = Tcpclient.Client.Receive(receivebyte); + // 连接断开 + if (bytelen == 0) + { + DelegateHelper.SocketInfo("与服务器断开连接... ..."); + ReConectedCount = 1; + IsStartTcpthreading = false; + continue; + } + Receivestr = ASCIIEncoding.Default.GetString(receivebyte, 0, bytelen); + if (Receivestr.Trim() != "") + { + //接收数据 + DelegateHelper.SocketReceive(Receivestr); + } + } + CreateTcpClient(); + } + catch (Exception ex) + { + // 异常退出时、需要重新连接 + CreateTcpClient(); + DelegateHelper.SocketInfo("错误信息:" + ex.Message); + } + } + /// + /// 发送Socket消息 + /// + /// + public void SendCommand(string cmdstr) + { + try + { + //byte[] _out=Encoding.GetEncoding("GBK").GetBytes(cmdstr); + byte[] _out = Encoding.Default.GetBytes(cmdstr); + Tcpclient.Client.Send(_out); + } + catch (Exception ex) + { + throw ex; + } + } + /// + /// 发送Socket消息 + /// + /// + public void SendCommand(byte[] byteMsg) + { + try + { + Tcpclient.Client.Send(byteMsg); + } + catch (Exception ex) + { + DelegateHelper.SocketInfo("错误信息:" + ex.Message); + } + } + #endregion + + public void Close() + { + try + { + if (Tcpclient.Client.Connected) + { + Tcpclient.Client.Close(); + Tcpclient.Client.Disconnect(true); + } + + } + catch (Exception ex) + { + DelegateHelper.SocketInfo("错误信息:" + ex.Message); + } + } + + #region 构造函数 + /// + /// 初始化TCPClient类 + /// + /// 服务端IP + /// 监听端口 + public TCPClient(string ip, int port) + { + ServerIp = ip; + ServerPort = port; + } + #endregion + } +} diff --git a/数据库/S1319.sql b/数据库/S1319.sql new file mode 100644 index 0000000000000000000000000000000000000000..e5b7cac627ab962196a72691f8bf000f6d2440ef GIT binary patch literal 23022 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�?tY@{9$95m-ufl#c_G_@O;$PZnMAx|2ua@!{bsCFMr?CjH1GUqLZ0$56 z)M+e2_r%qj;~3o^eZr%-k`_5f+8cA6)zTuT=roqV=RfKiwPfSXzK=#^+uCVF=#|pd z(jwd1X(aIJkor|xq!ek9ZS6E7^eXylX_0O1G$PbaBf>H%+G#{~imjbSWM7M|oknD@ zz}8M9vbEEQ@H%YmG$LC&jR>{Vh)_F?2({CQP&NFOiPGbq)juyQgE%Hg4`;=lWdOHg9 zcC_g2XwlozBA;NmFIa;XtwD>{aHUVp)2_s5kx$K=lWi^Xsd+~8<5TmD)}l29w+)|~ z=U=TwJ~hv1PJC*fZFAyN^K4s-d}^L;*V^4WPtYmv{+Gg^y$cAn8%^!5j$Yxe43tZYmraWvu!Q%X?nJ; zMLtc>wzbHo>Djgx`7}M-)*_##XS5diG(DrW$fxNUtwlaf&-e$fHCp7;^lV#;e43tZ zYmraWvu!Q%X?jk%0h@k@7Wp(ir(27Bnx1WIkx$dJZ7o`Z7Wp(i+twnVre_-t(V{hq zi_E08$fxNUtwlaf&uA_3X?pX*YeCPRen;wI^jyZL=@~tj@o9QS&t-g?p3!p|pQdN@ z?7*k#89gKLX?jM-_C8I|=y=|z=@}iX|Bl+H(eb%Y(-RUQ`!qe-;?U@*(x>Se9Z&i+ zJ)>htpQdMY-00KvjE)t3n%;cCxmQBhj&rYsuHAp4cAR@9+qL7|E1_%0xmQBhj&rYs zt{vxI30*tRy%M^1oO>m7?Kt;J=-P4amC&{0+^c|duL91!61sMrdnI)3IQL5E+Hvlc z(6!^-E1_%0xmQBhZY{oBOYPQ5`JLk0t)+Hr@!eW#w-(>6rFLua-CAn57T>Ls!~Yw_J$YPS~Ot)+Hr@!eW#w-(>6#dmA*-CAn57T>Ls!~ zYw_J$YPS~Ot)+JB^bYV~u&$t;TZE3c*QusPojfA+NViV)HEQP;p>}Q&YUdWAc5V@R zBwEKvw2r8F9V5{?Mxu3$MC%xd*6D3bUvHgXhr+Kz+t;D$>rm-+=<_<1c^#U(4%Jha2(69l^sc7UwR4M5JGTVuLhalljQy|hS3vjZ zb*RcZ^kf}MvJMSdhlZ>}J=UQc>%^z8w^pn}CDx%2>rjSu(H7r78U(d-i|nr|7tT!+ zCTcnFRPM%K5&mc1;k=&slJUz1=ox1qe8zqe7)E<{toGW1NQpDe*!;G$``=< z!5!cO;Dg{UuKauK8dx`qJ>6gI8U4of^`;3O4D=n}W^Ypg6xN*ed>S3bv7QugZ2)u-z$m|0cYDQ+T6NZiW9_;s4g) zCS8AP;8t;Kuo3jk_txM}>_5gHRPMLx{!ae{>Gxu92Ol!R#;ve%t8$qSd@9fmq35}` zDHr4I;6~8pzfHL~-L<$)B|j?sr2iXyN~6zh!KYP=+k!tK{XXzB;Ai>u&#=9Qc3W^i z_54>b?}?uav--Y^E-osmo^SvYEPUrY@VQ%Vz4bnYwJIE}N;#X6mw;x@@K{ zTf9SNu*ExM23wTNPT}p~M$n9HQ7%rm@@&z4gx>2?SQHM@wg+k3gS2gFq1v!|73j7- zC?1Xq-L?nChHba)LE82pZF`WmJxJRg4BWN{Y1@N=+xB4KwmnGO9;9s#N^^V%x9vgN z_F&+)Js7xc4+d`AgMr)jAZ>e)wmlfQZ4U-++k=7I_F&+)Js7xc4+d`AgMr)jVBoer z7`SZ@(zXX_+k>?2LE82pZF`WmJxJT$3L9JDVXJu95o{F?Myu{t+QU}yVB4y@mG-k0 z)!mBfZbfysqPknf!%>wpDklYHhUYZdI*qTXnZm$F0d;(@Z0W+VVXMKX6buZlB z3%B=%H6mTv>M#2+?`@gxR>(ZOZh*klFS94q<4Ih9`Q-q|90-VoqKM_U)%B5 zcKo%S@@&Un+bPv{O0^w-ZO32R@z-|zwH<$L$6wp=*LM819e-`dU)%B5cKo#+e{IKK z+ws?S{Iwl_ZO32R@z-|zwH<$L$6wp=*LM819e-`7zT2tqcKr3J;32JV|A`c7Ug&7> zPoy(OM}zk%eV;Hf!t;Ibe4nmSimurge3mO!{C>}uY!+&{}X%^eB2m@zJvOgahcF(y3Gq+=KCr0{gio!N-`JhP)UR; zgRv;|nOXaUuFC_|Fc0YtPIv7d(tT_{0=jk&>26MW+^90>J}SeG;7c(1C7ApYOnwO_ zzXX#HQ|pJR^}{IM!{qfa3_J`2U*VdsaLre^<||zD6|VUT*F2(J=7UF+i%|DB7KM-U z-$(iHqx|<#{`)BZeU$(Do@K4Hs-vGY_?gqc>JBNF@!}qxU``BKkd?GxE{kPbMu*bN59Qz3AKg6b-p=V4_gvUrf zj{OU;3AVsCxCCZkhwF3Ok>jo>qE|R2dZl=NBC=LL5%pqU<=mrR)0I9EV29A(arj&S z*}*QS2gAC4DDd|SL%}|5*J~(nU50|gU{!iD6pZ`7!4$uGrF1Bm=01M^b|{$P%ICpZ ze*H(#wHpeKbLIcW_6q7yaDsoG#6AW39o->$&AFTf&yjMTd%nOmKL&pS{uI2xl|RG2 z2wvj)%h>-U9)^M!xz9W)|BU@FlxG24B>f8bGI#q0cFU+%t@0293=sqPGz77yR&Bh? zcMJcBEAMu`p~v^3aFCR({OTF{P;>#a?3b{u2}5C%x_CWjDD-;HP?-A;Q33R5H5B#u%E)8TQ1pNM zzmeCqh9a-?3`Irom0aoZaVT=sG!*r@UeT+u{r198^zXUy*PKiA>)0iJeXXwCMc>>- zAKXPB+@;<(r*!MsuFx%Q7cFNO?PM1%WEX8?SLjx;D|CC<721!xLVIwR{9?4`>7(OSJr3S;ybu`6;dzD>%vN%8*k`vUJjFGQt>QR(5p zDm{!!52MnVYOJ_?FZOaw&Bn!Jseu4heNCMaA<~yL#y;KTn&em6UK&7 z>0z}-Ut^UXR%Q>0wlQ7?mE5tkT1%wD;=Y z7kICJAsmjt;Rqa#z~KlSj=U;Rqa#z@hj2*WKW71P({wa0CuV;BW*E zN8oS-4oBc{1P({wa0CuV;BbVIZUhcT;BW*EN8oS-4oBc{1P({wa0CuV;BW*EN8oS- z4oBc{1P({wa0CuV;BW*EN8oS-4oBc{1P({wa0Cv0uED;*=Nbs%a1;(l;cyfVN8xZ3 z4oBf|6b?t>a1;(l;cyfVN8!-tBj}!RI0}cOa5xHwqi{G1hof*f3WuX`I0}cOa5xHw zqi{G1hof*f3WuX`I0}cOa5xHwqi{G1hof*f3WuX`I0}cOa5xHwqi{G1hof*f3WuX` zI0}cOa5xHwqi{G1hr7|A-RRG5^k+Bvvs;YK1-s#AH!8GSJSYV%+Km?NMvHc%MZ3|W z-DuHnv}iY4v|F|FzpO~RRXd|~X}5G~r_f`>Zq?K&?s2g9B6)NV9t zHyX7YMcR!b?M9<^NBxR{_YnW=A@bRy+9`#|XAhCj9wMJTfwf|fYVBYBuH7Eh`l#?n z*wgaM$Y>(m%>bz-U_XfMIrSdJ1HQwTusuWBqe#Fh-z2X+;M1i4HR*qY zeE{2D*aQE27#H?vq*krv1*bQ#Jv#3RpQBXv$R5VxJ&eVB7>oC4EOz?;;m-ex{cqR{ z*o)XNVcTna7(MrB^tA2KbB{((+a59ZXv7o)@}TOXvC`?k4tkW_6TMcy`b3gJp~v67 z>ghX$j%xO*k2}SBzL!3}SAE>+XGpP+_R_n3{)nzrzc$|Ebo%vP`t@G=^?EWrbc@p;uPWq6%762|ORE$iMr9o{v-l z$B-4~BNg?~LD`;2)tC85CEQ24=OY!y zj!NkHNQDuk5_&#TVLnn(@AJPrAE{_0HF`c$(MW3B^O1^roY6W^q2E=ca=wGdnu=7; zw&x?2kha8pq$0&LSDueln2%J{Lv7P$(7*~BSV03T%ttDr=OdNS^N~vE`ACKNNQL=G zg|Vy>dOlKNM5~0Jk5m}fDxv2imC(^|h51NDW4deM`A9`Npxl{{R3gtuD$GYJ%ttCH zYK8eo1x2keAE`(ye5L0j71XuDe5AsBq{1j!VLnokdMFp>BbCTXTanW42=)cvDf~Ft z7rv-|w-4pnhvw|3&+eyh?x%0=M|Jn3Hv5Sa_R|jcqci)76ZX@V_S1^?(|-2Ta`w|^ z_T%gQczHj%v>)Z%k2>u~Irrni{rGM_8nqwg+z+?=VRb)z?k7&zkAChaPS{VJu%BA& z|79&;U_Wuf(`ee$Xxh_g+S6#-(`ee$Xxh_g+SAhc`QT|Z?P)aa0Bjt9jRUZ805%T5 z#sSzk02>Ej;{a?NfQ zY#e}%1F&%bHV(kX0oXVI8wX(H0Bjt9jRUZ85H=3N#zBp+^T9#s^PF%L+cUd^(rV*A za6jls3&b|Ao2FWz){~p*f^*W+1E^feh=rMG}*Xdg!zLoe^9EWe@V5R{%O!L z=RrJj5RV)Tcaid!{Q6z+d(Ib69mG=yL$75WRE+KWP!c#i7*3Kt4L--Ojyw;lcN-nu z9aQf&{tUdtHCI5-1P>B>A0+BN2*U>>kG}^akG2PCAqQz82i5zW(&ztbyf&6dd9Cb2 zJe51dQ@KOpc}H+a-0l?a!#1~v#H!O>{zDq?{Hqn|ka!dFgzgYe=njcDr)&fLeE$$E z9fF5L)cTNAPIr^a`AUy{hg4tVS_`D|5aUdy=r0mwXzS> z3l7r@4$}(`(+dvM{twgs57Y7w)AA3~@(tJ1snRB^L?BfnkSY;Kl?bFt1X3jesS<%yi9o7EAXOreDvDht0;!_gRU(io5lEE? zq^iDYP8@+$i9o7EAXT+_r#k|v5`k3JXXQ;IkSY;Kl?bFt1X3jesS<%yi9o9KmnsoR zm0nXN0;$q>sze}FB9JN(NRUL?Bfnkg9r|N*O!I;MU)AB@pY$LObH^wTl= z>6rSdfA#!*Og;3d(DU~(_04@k&)>(?`)qsuKBit~JO_H_HKyKS^!$BHy~DQW?_=s6 z{+H+PW3>4(+WZ*v_c670T|)~WQw!IXYROLdQ{O?Y*Y*x<&)>(?dY$h1`YJs*re;-2|$I!+xv~f)BO0`BI$C$s5(U!)TzmK7r zW3-$xTFw|PXN>v#nA(Q#{IA^E^Y<~e4d>$d`?c9j3$C$s5;p;Kx?_>CPO#T%E z@~r;F{C$l1`xrhQWBxu)bTLkJF|O!hE*O_jjicZm)nZ)!b&8{l@xUYCce6C$1PLt{5k-7$>e6C$1P*T%msvQH&E&j5Ah_hkr@> zcR@!K(9(_&H65Y79YM#ApkPOcJde=2j-W6{ z(3T^p$`RtCBea|&jLSzDmya+mA7NZRf({%Z^86t)jvq4P_#xN)kZX>Tew6g1q#q^S zrxWfAd^({}ZE1(l&xmV*W7Ha}zBRQI+g{bLsh#*&uL#vNwi?~{YZ^U`o`2O?^{uh$ zTVvI?Cie7SwG-u{c4G81;u@>IHCBCVtoqhi9jb+n9BLXJe77H9`{_eX?Z@eU`cPB* zQAspX*!I(h8a&s;vu&@7*2JxCue{Y*^{uh$TO;zUvFckR{;aX;TNB&9-u<-3s&7qg zNhxCNsL;=dYvRqepFY%BHS!6A`vRXZD1^g09M<8m4u^F(tixd)4(o7Ohr>D?*5R-Y zhjlpg`F*-49M<8m4u^F(tixd)4(o7Ohr>D?*5R-YhjlotYn+|a-OOPf4(o7Ohr>D? z*5R-Yhjlot!(kl`>u^|y!#W(+;jj*ebvUfUVI2$`CtM~n-G(>-5Mv*v)V7Fw(Ys?1T%#RackQ% zjtTny1X?$N)=i*w6ZHKF6mJ5>n?Ugu-$;|25dKA zy8+t`*lxgf1GXEm-GJ=|Y&T%L0ox7OZoqZ}wi~eBfb9lsH(OM`~r>Xlib$^cZ=SY8!^yf&Q zA|FlUG@XNVqWh!SUr4`+xBXNU=Bhy!Pc`eumtW>B^nG;JoV zi|v`P0eWYk5T4hl=&ECK1P|3 zQRZWm`50wBMwyRM<`Xb~0_IOJ*FK?&7QEjyUCq;NOE@89t%XI^CAq;N_v_-n#b zl=&28K1G>NQRY*W`4nY7MVU`g=2IF&^)JeNiZY*~%%>>xDaw2*beT_4=2MjUlz8^P zT;@}h`4nY7MVU`g=2MjU6lFd|nNLyXQWj>`5Z9X_dzdl31K107gL%%*lzdl31 zK107gqc)@K)n<(D*JspPjPBQG=+|fH*JtS0XXw{w=+|fH*JtS0XXw{w)UNbjwJW3h z^%=D*qxDOoI*Jq?@M}xDBAZHmt z&Z=H>!CBSF=vmKMbp9+le^zC4isz4KbvNT{h3D|;IedB!pPs{~=kVz{e0mO_p2Mf- z@aZ{xdJdnS!>8x)={bCQ4xgUGr|0nLIedB!pPs{~=kVz{e0mO_p2Mf-@aZ{xdJdnS z!>8x)={bCQo}PZ5o_?O5eqLUi3(nKi&(qV-)6>t>)6dh>&(qV-)6>t>)6dh>&(qV- z)6>t>)6dh>&(qV-)6>t>)6dh>&(qV-)6>t>)6dh>&(qV-)6>t>)6dh>Ux48kVE6@i zdjZ~lO8QSp|0(G|CH;cZcLW!dF2o}j2HUZkcM z)%K1C7pdt*YI>2HUZkcMsp&;(dXbu5q^1|C=|yUKQSr9#;F?~frWdK{MQVDHnqH)) z7pdt*YI>2HUZkcMsp&m*{1eX`h#ApO-1~Wy*Y+GGC_5mnrjQ%6yqJU#2Br zrX^pd%$F(iWy*Y+GGC_5mnrjQ%6yqJU#85LDf4B@e3>#|rp%Wq^JU6>nKECd%$F(i zWy<^_Wqy$|zeq`5q$EEl{pY0rob;dnGF^9=3x2LU%mwp|6!VM}^NbYpj1=>X6!VM} z8V|+uJR`+?;E`gUkz$^aVxEy=o{?gnkz$^aVxEy=o{?gnkz$^aVxEy=o{?gnkz$^a zVxEy=o{?gnkz$^aVxEy=o{?gnkz$^aVxEy=o{?gnkz$^aVxEy=o{?gKzP3PLTfmzO z^5)K9fxfnYHy7w@3-q-G`q~10ZGpbFKwn#+uPxBm7U*jWczJ=owm@H7psy{^*B0>j z0)1_PzP3PLTcEEk(AO65{sMh%0q-x+*B0n&3-q-G`q~10ZGkqhKpR+~uPxBm7U*k> z)O3-WE>hD)YPv{G7pdtYHC?2pi_~hD)YPv{G7pdtYHGPRz z{SvMEC0g}MwCa~=)i2SiuP|0#QM;WBt}s?!QM_rd6{_TW#XBaiDzCWo_U#grl~vZ2%0<>YwA9- zSzTbDHvw z(a*)2f#1w&s;&A;znRnIxmYvsN^FzoV$HyB<}~F^-^b6zn)0b_znRk%dq%&R)8x5W zQ*GXN^K-E#&&8TN7i;odtjTk+rr6fM#J2G+-;L*DO;%!?^pPgd#hN@dXv!nL@?PJQ z=VDEsi#2&J)@04Lsn+HDI5KI{vzp=k*#1(W$y#nxt z>3%b($#bzL&&8Vb&?e8tnxWs!Y4TjGsXnXv@?5ML;{DKX<}_I)ZmL!LZhp_askUv~ zUkWtU$NewAnbTAsH#%}?s*l_Dn>kIjf1}^bX|kT&RA2BN{ANy5J;Ju=VDEsi#1ubZmP%m z%75cZznRly1-q%BRrQX8Y+%xUsmtjTk+Cd$)9d73;cX{yia4m>Mq zs^{8vMAt--nmjjYswb*mJQr)S9^O>%_LY7!r>Q<}+i&JH)mwK2EymmyV{VHvx5b#- zV$5wZ=C;&>=7SbvZc9DIwr6K8wQ!?nXD!Cu7GrLUF}KB-+hWXZG3K@yb6bqLEymmy zV{VHvx1|=PyD{dr7;{^Uxh=-r7GrLUF}KB-+hWXZG3K@yb6bqLEymmyV{V(;wW(K| zowC~6xnf_?X1|nn;acU`F1!hR3;0fXhcmK;*JHm6d^f-T7x07NACi6p_Knyd!oCSy z4|;{a%}$~1!u{AgK!1JQE<6Z&X4)=127V3vI`|Fno8V5+&zjrp6xuEfV~>EN;BL_C z!<^qO^ph{n?-o9VT><^nkMp~QezL&%-9oR5bAGqbPe0p*D(Lmwc3~X!e574C%9S{D?qQSaKgCIt1Fx{F6_g8 zmGfdZ8_pb;?Kf@OK|lEafWHa80sL+7I`EC)o58n&-YK-rPND7K_qp@+q|>ef+7&&e zO;2gFQ)pW|ljvXU6xwDl9Zoz~%0~Z}okH8}6xxowQ)pW|VyVpR6xxnnhwYt0+w2tD zj>@E5LrRM6okH8}6xxp7fW3lr?-bf*r_i=`#In7L^fzL^3EMk`wxhRT4}hz|HQ?`p zzX!epq))LI5a+P#zweS8GmI zFeh2ToMZ)ak`>HJRxl@7!J3m5tT|c1nv)z&B@T5tYFQ_(44Gb&B@T5tYFQ_3f7#gV9m+UoUCBY$qLq- ztYFQ_3f7zq&B+SZoUCBY$=IDZLvu3i%ja}!PF9!$tvOl2&)hRKCqr{GG$$)qb22n1 zLvu1TCqr{GG$%uIGBhV+cj64q$pULm7Wm!u49&@cU&XfOWPvp&Lvym=HQ3gi49&>` zYfi@Q#2LF2XY5X#1=gG_u;ygim(OU;$pULmhUR2wP8L{mvVeAl=45D2hUR2wPKM@W zXikRaWZH#Kr9yKuG$%uIGBhVcb22n1LvymonvjPxlqCyU-q ziZv&TtT|a^&B-EbPR5R8Sw#Orb22n1Lvu1TCqr{GG$&(s;w-Y}WRW!|W52R2vgTxw zH7AR#Iay@Q$=IDZV|U_AyYM;1nv-c4KBF}!(=L3*dxRY{r-SBnq$K;4;_o9mC`kv+ z>7Y3sG^ZmE?hA4>Cr5K~uFTP#9L>qmoE*)`(VQI3$qmoE*)`(VQI3 z$qmoE*)`(VQI3$qmoE*)`(VQI3$qm zoE*)`(VQI3$qmoE*)`(VUz(Cr5K~;+!1K$qmoE*)` z(VQI3$qmoE*)`(VQI3$qmoE*)`iF0x^Cr5K~G$%)M zax^DLb8<8%M{{yCCr5K~G$%)Max^DLb8<8%M{{yCCr5Mgz?zezIXRk>qd7ToPLAf} zXikpiqd7U6lcPB~nvqd7U6lcPB~nvqd7U6lcPB~nvqd7U6(?xT- zXigW+>7qGZl%$L1bkUqHn$xxBgauu>L#P!Vp>{+UUX872Q}(r>)LXVv1IH(=k0{UPj|$ag*VNBEa^A=baN3$gHiP`ePz)-J?C?LsX4 zB3C{JehvIO_zm!z;7;(b$m=_x)-Lql5l~+R%H9p`0rdr+QuG{0s9lJKPk|Ni0I1b1 zrRyn=Q15OD4}yol!_=Y*>it9gs&`F=+J#tnlxy^knQVR2D%38-Lak{C80A)EoOky|FLU%A`=wzJ)Jp4AfJYups3zYPS}lb|DsORbQw#I)qx=7wU};VITIZuwRY+8f@)CtY5VY zu~54Z3$+WeP`eNdwF|NEI`EC)o58n&8vXU_{|71tkgZ*ag|s(mk@MADUPybB7U|Av z&$>n}*?6<>BQ3K1VP7vT()H3J+uDUVEJ%y=t9Kz5Y8PVRZ(wT|V%e|5)-J@dwF|MZ zOp10PmYrh%7PfXFR*H5Z7Oue7F2u4|Vqb^73j2-NZ^C{v_FJ$Az}4Uy@OQ!A1K$Bs zckdUfJHMNh_h7#l`+eB&$Nm8J2SNIsw8;OW-${#X-^7(SW3R{lF!n9jw_@LhO|O&| zxsGt?U5I7>l0)tEC3_S2aZtMuD@D5y3$+Vz7+8yhnsW&i{|FWT2(2)IwMeL4q=cGt z39Ut8;cdo1YdgX+I0!xgj)GNCGYDOCMr97QqAS$zs38M2?ZxHf57z zM2-vUkwCr8v`&ZoIJLEnLj)3O8M=EXH18N@+*?Yk! z!Kc6qcmUM*P`c*(puWGBeGohZTBUmw9~!OFJ*ae#RNCb^N-j0*XRx*Mtn>-&A906& z0G|c5=B!_z2mcY&(+Z``fhWP!;92lIIsO>@Dflzcs@sF=_Mo~wsBVw+R(F%q8eavz z2DG~NpsqbqSKHcGQ>fFBg*rJ@Xr=8zX?sxG9>sW0vC{T(@Ue-4RPq z=vbvkE8)g3gMSUuO7+ab>3aSp)GkKCQ?84jPzbGNJ$_Ch^a$RgHFIC@QM)I!%Jpdd z+$nkvC49-~X9_~S?7shWB)p+Z}gP@TGDkIwe0`bHPvWn`!}$4 z8nx`#Ve2$%*{=u7q+ElYV*eKQwb*aKUV;7F*ekKG!(N50lUsGSH(|dS`z_c5lxj7o zUA1+McKjCp9{3LMo#4B{_k!;S(It&^zFxa-3LOLVD8@G427VO8n~Y*Tkw>u}MzJ36 zr7zo~SP!FE52IL5w8gC=8U(k2I(=26mlZWeQDYP}E?80Hf)zDJQDYP}Mp5H}dsD1g z`B9-GO@&bw)qo^^88l$K&iW;M+F^U?asBvILjkU|D(TW;tPtiG{ z6*WdtWA7s>+lm?oR@4|pjRPxctbIg{R@6AKqQ-$0HAYe6z=|3NR@6AKqQ-u9FSMe@ zC~AzN#wcoxqQ)p{jH1SRV(2Tas4WH4d$)acD)2QPeoJqQ)p{jH1RUYOH6APN$Wks4?;cD{73Q##-yJZAFc>*5OiFQDd!j7_F!=iW+OJ!?qPQ*380aMUAzxVMLcu)EGsL zQPdbkjZxHCvjbmgMU7F^7)6ay)EGsLQPdbkjZxGXMU7F^II^O~KKnIXUhq6?dBL-) zof$_BCwB^`z#5eS5%e6;f_BB*Y#Gu}4Dekq~<%#2yK;M?&n85PKxV9tp8WLhO+cduV2^dnU~0 z5@L^p*drnKNQgZWVvmH_BO&%kh&>WwkA&DGA@)d!JrZJ%gxDh?_DG055@L^p*drnK zNQgZWt+}}jjy)1$kA&DGA@)d!JrZJ%gxDh?_DG055@L^p*drnKNQgZWVvmH_BO&%k zh&>WwkA&DGA@)d!JrZJ%gxDh?_DG055@L^p*drnKNQgZWVvmH_BO&%kh&>WwkA&DG zA@)d!JrZJ%gxDh?_DG055@L^p*drnKNQgZWVvmH_BO&%kh&>WwkA&DGA@)d!JrZJ% zgxDh?_Rv{6ZYRVZ39&~)?2!`~NH0AJ(Sqo|dCqhpUEu}4v> z_qH8-6bl}si^Lv9Vvi!RM=@~hQPhf}PNX3AC=z=Vi9L$M9>u`1N0Hd0NbFH0_9zm2 z6p1~G#2!Urk0P;0k=Ub1>`@FHdlUo59>u`1M=@~hQPjGn^L6Y|)as>e#~wvuk0P;0 zk=Ub1>`^54C=z=Vi9L$JFYD#lqp0(|wEL&qM)(6L7`bnH5e^$#2!Urk0P;0k=UcC zl~rHk*rTYoRh^4tk0P;0F?8%v3>|wEL&qM)(6L96*rQ17QPjJmzJp_rVo2?XJ&MF0 zMPiR4u}6{Eqe$#gB=#s0dldB)Qg?_PdlVzb9>vJ9M=^5jQPc{*(XmG{a_mtg_9zm2 z6t#x$6vrM#Vvi!RM=^5jQH&gW6eGtT#mKQoF>>rtj2wFuBgY;^tt9KD6Sapq;a1Jj zep78g=yNo}8wxr#K&bNq!W%+AKe|Ed`A5SWmA*shm8csv?igw?1s?(bf?prS{u;KCdKvZJV7Oji4GaqPHm}f6OV>+7 zj5^Ow=s179l*H&+%zA0aKH(bB^OyBJ(_AkN@il&?x!&j53H?lSy)?w=XPWELiuF7( zTraI~ik}j$=lS4zp7*WiN#A;&@vWCu=vQfl(NFHyODl|iTDKmpSdUh$mky{@=)ih( zU_DRS)(3j4S?PMKS(qE?kL$zObqT%FxSr>0>v=x4UhPwNR{J#iY1DePPotkht>+2U zdbLm6e(JPd?bGNdP3zS@jc#@8X?5#qb?a$$ANJQ7;fKYuP`MlRy?J z)-@;eeQr@yW7JzZLbvT(fu&P0(QW&V!XN1Q z)E$MJ!4DTU$-V`=6}$~RVhmpIYl3UQw~?|0c8uX$oF2Xv{0R6_WAw-VHTp94Bf^c! zag*?7&^c}-$BhN&xUt|IHx``ZM&)R{26T=a^=_llIc`*r#NTl6YSQrMoxXtys>eJqm=!u=Nh1?9<>`(9g>64li-d74R3Nw7?~>WAwfX z!Weu7s5b_cqIU&_dT&RlHv@$wQeG>YGrxpx&zltw&k2u%3r0BM^e)-kNO{hvyBS|A zyhncACrpg;mr~>@qn}{jqw&{RBjpTemAFS9SGqiIybt`G*t|6YmnNV-23hSi%-Ha{%-bARcbcGkOUj&=n!K=+%!VI)RZi#yQYqT8ns=}84 zpR;$5uj;DP|Ic2#6h;U&gjyV1LyT#RX-Ly(MZ^vwj+PKJF~$pn4A>h*N;uhxjsgnx_Sy95P4wey{QOi{qtTJkYFwjnk@2`uqZ(rycpumSc7k2t zCh$pcANWo1+u(P=XF)4xjYc5GVQ>WegHf{#<7Ci%#2Q_v@p56aGLja$Uu%|%dW1Vc zuOl^c&CSx1%bx+QrDpD;SvgXy?C3~k$GDo3yL_a^X?;TX*UiCwTyy9JcY)rG)2y+X z%RL@zMrqBA$C??BHA`te#=JF4X^zc6v)Zy_^U$pEm}Bp;X_f+wW~14^r!5==e^0sD zXpUnr&o%mqKjCG>=A>EeRA)e|3CtuglW4AbG$fj(8V5k@HbJ+EW~?svHxvoFO*DIT z$!|exIDw@EmJ-cI^;eXfFb_>M4|R!EouKMOb5h3}z>T1Fo@i!jw9XUFPaXdg=#{iY zns>=lpw*s;G1vZW&}vWoyrJ-?l>CbL3~1*`G&40?^GUGg6EvS_9IIG!RsB`7RO3{& z$3$8(zK#;Fo+X;A9t|z9*8+Pj=&A)>wJ=9$L02v4ss&xOu=Ak>UA3UA78q-Ru@-dI zBERYhE$FHRUA3UA7If93Uy)M1axfobUA3UA7If8uu3FGl3%Y7SS1stO1zokEs}^+C zg05Q7RSUXmL02v4ss&xO$m?8}b=88dTI73a#nx2|x@w`VwVUdmpR%r6(N!xh+KR4P(N(KfKYV8Es#Pl< zM(e5-UA3aCR&>>hu3FJmE4pe$SFPx(67DeRcQT^5Q))RK?vz@L9wFSx2;okB_Gq|MpFJAx(r44ce51xZhlG3NT6byX%CScm zchN`RMIU{aR-*JN)uQ87i?P|q(^KE2(S?rJ=)%VwqkI7TrBQBdbpLyoMhH5RKK(9@ z4IH~?zgr49E%X@pZhFbPr3%Nt1l>#CEmgSW1bE&kB^W(gzB@eZW0XzD`$6}BcPn=; z`6l>n(7oQ>%9_jF>)ov!Io5Mn!dJjQ80qisroX#eIdX}f!xGLAw!wcJ{I{vStAx>G zn_9i&M|I{lMvrY`)$tRcM~`h{*d-o4wlR8a^RIF#{ub!bW1D}KOX$&Ko3dc^=&_Al zw~^~MMvrZb9@`i_w#hMc9yHK~2HJxA<+k9_W1GCf==`>!jW)E=#^|w4F5$m&C5#^1 z7(KQzdTe9#*v9CwO?wJ2mQ*o zvKED`MImcZ$l73qtVJPfQOH`gZhy)OS&Kr}qL8&HWGxC=i$d0_73)Y8vKED`MImcZ z$XXQQH%qP$ezT-dqodQp?Q)WJQbk(WN8As7jlb%7MwNSq?YiiniS=u)iruo-Ndu1E zBd^0b*Ws4ybk{C%|GUn=<|=eAyiRM#KAV2cRj6Nc4Suhsu0+Z)x<_88QJIdBigZ0v zk&e^|%_VF3>wU!Tm)B{<$>r{y*J<6!vAuL%=px<(x~E>}Uvm}e*Ib2G`#RipomQe8 zyYF5{@3W46XPx>Tm+04Ah0hXykJ#&k>!dngl}9-1ScP6E)%j|F3EFknX&mS?+k4k( zH0aoVwN9&2j_t$i=(E0vi zMHTm=ihEJTy{O_|RB zU7^dp9@0UN)dbAFDv<`Z-4tlf>dbAFDv<{7j^(lI^4tlf>dbAFDv<`Z- z4l%4+=+Qdp(K^Joe#eI%Z38{p270s&^k^IC(KgVdZJG4fJRm z=+QRNqivu^+dz-DfgWuGJ=z9(v<+%6s+S&Z13lUXdbADnXdCF!HqfJOphw$4kG6px zZ38`8Ckp9AA)P3s6NPl5kWLiRi9$M2NGA&EL?N9hq!Wd7qL5A$(uqPkQAj5W=|mx& zD5MjGbfS<>6w--8I#Ea`3h6{4ohYOeg><5jP88CKLOM}MCkp9AA)P3s6NPl5kWLiR zi9$M2NGA&EL?NAwc{))@Ckp9AA)P3s6NPl5kWLiRi9$M2NGA&EL?N9hq!Wd7qL5A$ z(uqPkQAj5W*@!|mqL7U!WFrdMh(b1^kc}v0BMRAwLN=n1jVNRz3fYK4HlmP?C}blF z*@!|mqL7U!WFrdMh(b1^kc}v0BMRAwLN=n1jVNRz3fYK4Hlh&T0UdY;bm&4MT_~gr zg><2iE)>#*Lb^~$7YgY@Azdh>3x#x{kS-L`g+jVeNEZs}LLpr!gf~qG-ZU+2R;%nn zAzdh>3x#x{kS-L`g+jVeNEZs}LLpr!qzi>~p^z>V(uG30P)HXF=|Ul0D5ML8bfJ(g z6w-x4x==_L3h6>2T_~grg><2iE)>#*Lb^~$7YgY@Azdh>3x#x{kS-L`g+lJ9J>E}y zydTfMUz{8b_v88Z(`xRg)!dKg-;d|tkLTZy=Wk-wZWF6^o1z2y>?T$!HZgwK#H!sU zR_!*a-`8K&;~Twdw@JOc(W`cw)TbN0YPX4gd=vfnCi?MB^x&JMF8_51^s3z^^~FZ7 zCv0NXZWF6^o1`n3ycWD%_yzwWdia8W5j}i?zkY$gevvlvMcT+0QT`WEzTd>%7yKq} zp>%juxD)hR@dHwn@fk{f0eWTc0i8kRI)l+`#Scg`hlE}$en2|$FT|t@r_{#U)RJUMqe;nlXB<_yOfwsQmT_y;l5ya;oFic8+R<x@IBmeY4to zk7BPCZ>GI(R$lrPd#!jg>mi$U%{pG!Y`nwg30_s(%<9Kx);c!h1Dkc_`joEO=(Xa_ zTHi2w9<*84>~gOaZ&vP%UOn5aahK6^qRq;n%ROt}96aOLESK;Zyl%ExE@AXq@n&3N zGcK`N`O=w{FQZq?9`rkag!xAK!+N2w?Lm2hW6zWylp8qqZ1h2C+kgEjc-H85012mn z&6Fgdzg>Nh*8L#u_d#0ggKDihoAmF`9s~VE;e%?YM$cX!qzyhu8+?#eiw9Y?cu;Ln zpH-{Tk!pR8uT5BciBpL_7<9`eeURz zpZXWh{3Gzk{Pic`zk<$bZ}cpV@#Zz=H}?_Rm3&oe@Nj$=lNFMwml5PY`awe;R_2{_50 zlDisL`fTA-9O-X5dV{}>?Nv`C4&}W*rj?S<@Yl~0`@8;L+_hJ8E1$t0+pD>iV>@lH z=2njFx4oKMIkxNe;<~+>Te-yF?Dxt!lm-3Dnd2{kUK8sLUk1I(*Q;MSGd{|ZyTPwg z;&s2?@C0Zl@73(gXSSdBYIf#WzjY?GSM-Lj6MvKY`Zo9spY>e6SH9u1c`n~8_i$|Y z=+!TqIri+emzLP8Up8|IdXTow5*knoHE-UT->VjC{1u@|p7;;0MZaLCPw5xTjF-Bc_R_0X@4vd&=vCWy?C;8Z>2Z4L zaeCzjF0mW*>KDv>2KP|Cnj5u3X}^nk~%7w=fgm!W?`H^X@IovbQk5-XhL@ zyw^;&FfZQ1jCc!k;VsO6w=nbFqPx?P%yzdh+ub6^I~2Cc@rl*q^{tM* zp1GC2b*uVT$L?FVGM3mX4^%AoQ@PyF=pJ?}J?vI`*sbbeUA~7SJ*V4B54%-8tUsFt zzfQS(*sU6s`3&DAc0aq7QO8z#+pSWRk8z*7l`+OvMpj#uO`VzX)mG)y@fDzZ;V*HI zU*aCW#MOR@tNjuh_!1i6&Gq3S#w5JIUa`kcet-QTq3_ynvF{W5u6dWe@N=nm3-6YP z^Im(Q+dJ>I7rKq}UVEX(R1d)eZ?{+MmiQ2CJfz;iv3qL2>E8Gq*Gqr>klLMN_u3DM z0sqylgSXxb-6H(fdzEuXyy;%CHT)3ckcXwr)8S!h(l`J<4|)auVJXx2Tcdo>xE9ne znJeA^>i6Ole;(Wm{uAhR_=oAy9@e!v{uOuz^lHGvQlru9s}D<)#wno3gb&02!&0Wp z|5W%0W8g;^13$uu_Yp?Ck1*PQgwg&ZjOrg@RR0JXc!cbK*>400+vxkYkmY;Gf)+sNiNM#bC6<~Fjq4G-T&Hn-v1+sNiNym}ki+(tIHF;3n_Hn)+@ZDeyB z+1y4pw~@_lWOEzY+(tIHk3dHu%{_Hn)+@?PPO1+1ySxx65Hp zhwY3^wv)~6WOF;&+)g&P%TII++1xHaaqMhvm!BA&&Fzd&wv)~6WOF;&+%9kNU!BeE zWOF;&+)g&Plg;g1?RKtqJK5Y$Hg}MV9b{n#S=hmRWCwG=9XQDj_}{^tZU@ZofcYIT zzXRrX!2AxF-vQ@4;Cu)3xE(mg4rX&Zbp1!e4sqTi^tb9en9c3b9l6|XX9sNWfbAXf z6PNtK$ed*dbCw<4(GKot2mJ5wJD$Q$e10bmzY~YwiNo*YUUrKAqdLYb_B&a9-HD&? z#Lsu)=R5K9o#Nle>;=7wzLUGy$@T9KED&6--*xf#OHT%;C~m_ybJz!!T&D!-v$4>;C~nV?}Gnb@V^WGcftQI_}|5q z?}GnbT>mck-v$4>;C~l)u?zlp!T&D!-v$4>xQkuzzYG3%!T&D!-v$4>;GcKd2i{^Y zbPxL|{6EUQ@D_WOn19|-FLZzUDEvPP|GalzCFcK8_MKJ^&$Dc8!m{0j_@9PzNKION) z8^7jHk!9ZYuGr&;$Cyv~o$ro4X7)SZeP++6c;~y&^Qp%o&!_y(ccbT1e&@T7^nA+i zd^dVN<#)b2_I%3ke0PcGQ@rP0==l`yc^7&<<@dZBJ)iO$-i@A5Jr;RB<#)ULvz|}+ z4eu`Te9CWlckKC;-|+6(^C`dQ-LdCWk42tO`3>(n8}li@;oY(4Q+~s{(eo+4;oV1i zKIM12JNA6a?{@bwo=^GR?*6OiQ+~I*v5gYXr+A;c(DNzY=PvYoiubt-J)h!z?m~~a z{3dsocs}(Q^C`d2-LdCWyw6?e`IO)1?h=oCA7eiCSnzzxZ*_M`AL#iMZ*>=XKE+$z zg`Q9GR(GN2Q;#v9;vMdaJ)iPB-2GY4r~D3g$DU959qx`jpYl809eY0Icewjgo=^E5 z?nacreCjdgQ+|iL+4FqL?{N30JfGqn?n3g&e2TZXtHkpu-rg?se2TZX3q7CW?d?L( zr~IyV)yRB`ceN{?UU7z_1@ zH^q#C`WOZEG0*DLox0qk**@l3kIQYAgvaGJ!f30m=W*s)k4N6A__*d-9}s>^d3;>+ zESLO3%sh^xJ|3NLERWJ>)_Lr ze}gl4p7pqT4WG@UrpKkvLqdD+O?`fg;XFj3(>JfT}!xOqM#kwz*>%NS4xIB2Z^9fcvpJ27~3Eh{E z^g8Dg!5;er`?#J6Ug3O#zV8XH{|T=A39k7GuJ#G8^9fy{&aZ1Tdd2cdW#OoBC+KeZW*JYiKK!Kk)L)r#JjsmXN!Em)WZv;4^NuH3_1#OKvX?$(FRNsGb-#L_ z2kVD>Bd>Jr)xEpK>xX+;Kio_2vzOjyFYAYUb-((n?$>BP*{eHs?Ag{{-Ko)zu~+x# z*sXpq>xX+;Kitdu;a=Ul{>pmDUfS?0%laJ+qZ-99q1j}gc|Mj-nbf$Sqk z`xtxdW9+dHKiP+$>|^ZFFMn9C6)UT&U;dz&EALm2+@sh#aQf93JMIUqlYZ`~pS8_? z-IqSAUf9QcAM_e>zZ}M&^{Qq+y>P#JVIT7o&^vPb*~fT=vtK>3QSWyUx^?%fUv_*7bidrMe%U2@zk~2MoaZzp zza{=1*K-yep?nlP&)F^zj~V5MI=}qTcnRoTL;dnY<4T`R{j!gAzuZq7>{svX67M7G zms|SCR!TkteipnNbno0RFZGdbx&5@)0cXfFO6eo`_L^ru-qW#`mhP9g_za#=_RC=$yAAgH{SHEp==#-Dn5!QVqaSJB zCN}ko9|ak zIUV-XoA0ML-%oG8pWb{wz4?AdmHX+<_tTs2r#IhEZ@!=2d_TSUetPr$^yd5N&G*xr z@25B4Pj9}T-h4m3`F?uy{q*Mh>CN}koA0ML-%oG8pWb{wy?F*N%HTp7Tqwi5Aj6Cx z!;By!7wQWcd^Lj$WtaWpJC*mVdS4-WpHW8EhYWs_QATt;mVVs{~oS$KwpJAMz zVVs}QIA2#nFOyLoeFm?iW|U3Gc8`p5>e%j)QDz<6Ju>t@8D-fe9_MEm=Vut_XBg*a z7~5wU+h-WtXBgFI-xYH{pU*^J!4=rMdoKH&I!phxT(M(i0z z>={Pv8Aj|GwS6DySzCq?dqz*(yTs%6Oz;>l!{|K|Ja@}TldjPtgp8iMcZuFEA#@*+ zVLYEi1?0gY6Th6AYjfJUK;QP%;!2RXp^AP3OT0hDt9%^W~22hhm@baFsrFn`t~ zt^;KGfW}vjp9bxp2gvmSW|s$)YyZ`=%LB~R4v^CW@P7d255V~W*ggQ02Vn95ydBV} z<7ha@SmGd~h=YtG4l;^3s5?5Xzj|fhpxT{~al%1H2nVHqmw3K^P?|S-zJE|EHF~~( zQ2I1_o^?>yX7t?uAfttYj1~?uS~#dHR5@dYgNzvtayTgP zn6Gop)65y4X3qFDGr^~s34Vj)zrpd};P`KF{5LuNn;id5j{hddA5!_Da7g7s=C+5T zonq;b))v+a{axxIX1IEvFy(#{=MY@!t*w-tcZtraGw7T~f1j&e{KV~`cT623;~J&< z%;Z}An|cJfFX$aphsgdRtxo$4=JSx&862C{Lt0O8Y;F%RZ#~4k^$_#cLt0_*U(M|y z&9W84z#+}G9eb7O5Hs#WDB&61drx>q_b%k_p3(g4sAAvOGn!=!bzl0c?#pP!KEsti z6Fg6RMza8;75j{?$M`b%icz)q2|f3Gh8n*kR*#17uvYLL)(XBOHeBN8v%Vu9gt~I$ zWy0^0weOO(?~=9elC@_!&$FE8S%+9`!?f$ewClsP=)<(=!+gtd zSb6k$z6E-{=rA**!_0{e^DV<+<<#Y#vmB-^AEqrIR!&{=2O~56!_4##li9=M^f0aa zFn;))TKCcLoLaZh-|{@C)@}5?Jg3%e^tU|EsdXFuEzfgm-Np@|pJ#bat=s5t*`8DD zHu^4}lMapcqUUg-=eY9c)Y4sY2K2W) #wedW)or5mS!{+8!CweF+g2(9l3t?!6h z?ycbnnLR=lj?ns!NSTLJ?(07yWh$nv9igoq(Y*V#O5Ea(NDn$D+(St_@x8?NgM0X_ z^>#!W_IbRU;)s;&Gk8zM5$V~nzkN7D8$7~YAE6B%;ogtn#z$b_2yT1?9*)p9kHE$e zTH+Dz{Rrz_N0cv}lU1)H%9`UD!tZlm-=~)EbN=shhVS#)AK+#`z|DR@#(zM@e~6xc zh@O9lo_~m*f6Vbe=J+3T{Es>QCmjD1j{gbA|Agaz#_>Pn_@8n7&p7@l#~;HXW(68CUywxtuFc)u0gqTY{ec^?i^dU$7pxQ zXm`hyFPFRB9pl;FV?5h?Ou2Kpb$g6wdygrDsu6yUDT9vfrN`u@Iud95IgI@r#(oZC zKZmga7#o1G0T>&Au>lwxfUyA>8-TF^7#o1G0T>&Au>lwxfUyA>8-TF^7#rYe=mDOF z9tdV^fR*h57#o1G0T>&Au>lwxfUyA>8-TF^7#o1G0T>&Au>lwxfUyA>8-TF^7#o1G z0T>&Au>lwxfUyA>8-TF^7#o1GU%=QeVC)w#_6rz$p7Q4@f1dK^Dd)ZLf%n1(-U~1E z6R*b^?;U5ncU%msL^GhHLO*|cJbIMaJ=bx~hKx^uep=^vWH&gjTpSX*|2@t=+vE8E zab?8EJPUeuc06*=dz_KvaYmBI8A%@3oI;;vJb9d*_Q&Zjj?+UOr-wSuUfkp15uZWX zF?xmkIDOV}`mE!@yQhvTFaGN{h}~-(4~M}YfSv;$r`I^Hk-YzEpFghAyU{y%kF(SM zI6Li+v(x@KJME9N)Bd>frDNFTdz@Xq$MLA+xYKcsy8TzrF^?->#y3#n`Q{5`=LNF! z0&Bl7NU$6l*{L8AyEd3=FCmyqJTFLl zMz0gTAiX(0Mf?)+%it@ZM>{XDR{sL4b1z7BF7aCZ3sTzYFo;41QOF<)8AKt2C}a?Y z3~Ii7Gz_AUK@>6=Ss{ZcWDtc6qL4upGKfM3QOF<)8Dy?8h(ZQY$RG+CL?MGHWDtc6 zqL4upGKfM3QOF<)8AKt2C}a?Y45E-h6f%fH22sc$3K?WvF^ED2HT%ppX+N;(>@=4tIB;&x7 zWbGv5z?0!Vv3-(p;7P`TCm9ExWE^;sao|bDfhWn-N!;}$`8tWap2S^G;;tvj*Gb)r z&*^dCNydRE83&#uBPa3LlZ*pTG7db6$DYJpPcjZX$vE&7dE2p<@N`5~Ae!Uu-%fgyZg2p<^22hNa@Gi2lpK5zyfID-$I z!3WOZ184AoGx)$6a(9N@oxumr-~(syfiw8P8GPUjK5zyfID-$I!3WOZ184AoGx)$6 zeBcZ|a0VYZgAbg+2hQLFXYhex6f%rLhEd2c3K>Qr!zg4Jg$$#RVH7fqLWWVuFbWw) zA;TzS7=;X@kYN-uj6#M{$S?{SMj^u}WEh1EqmW?~GK@loQOGa~8Ac()C}bFg45N@? z6f%rLhEd2c3K>Qr!zg4Jg$$#RVH7fqLWWVuFbWw)A;TzS7=;X@kYN-uj6#M{$S?{S zMj^u}WEh1EqmW?~GK@loQOGa~8Ac&zQOH>oau$W0MImQV$XOI}7KNNeA!kv@Srl>> zg`7npXHm#m6mk}YoJApLQOH>oau$W0MImQV$XOI}7KNNeA!kv@Srl>>g`7npXHm#m z6f%NBMo`EI3K>BmBPe79g^Zw(5fn0lLPk)?2nrcNAtNYc1ci*CkP#FzfBmBPe79g^Zw( z5fn0lLPk)?2nrcNAtNYc1ci*CkP#FzfD&Y_TVDC8Up zIfp{dp^$SZDMp4Kp3K>NqqbOt)g^Z$* zQ4}(YLPk-@C<+-xA)_c{6orhUkWmyeib6(F$S4XKMIoaoWE6#rqL5J(GKxY*QOGC? z8ATzZC}b3cjG~ZH6f%lJMp4Kp3K>NqqbOt)g^Z$*Q4}(YLPk-@C<+-xA)_c{6orhU zkWmyeib6(F$S4XKMIoaoWE6#rqL5J(GKxY*QOGC?8ATzZC}b3coJS$&QOJ1|avp`8 zMO$mSKDnR~ z=^^1i6ML`Y1;%(6qyfiX@w*UtCU_z8NbiE~+V~sLzlU>y@!kb~`Q(B$<4^hba4twW zx)LeJxYEaKtg9NOB3+MEq$4%rb%|FCFNFJuy=HhpqhFVMWz>Ym`yr7Y=WB>BW z1;&sU^j($tg2vU3 zy;gZa+EZQ9p6b%*TAyOndVx{v1?kX#y;6UDiB|s-t^Oso&7A#R56As#!$tW{Glg|X`XUgXjP1%iZN6%rh5BS;xmt- ziZN6%hAPHT#Tcp>LltBE9?lr57(*3fsA3FNjG>A#R56As#!$r=su)8RW2j;bRg9sE zF=h~BsA3FNjG>A#R56As#!$r=su)8RW2j;bRg9sEF;p>zD#lR77^)aU6=SGk3{{Mw ziZN6%hAPHT#Tcp>LltAFVhmM`p^7n7F@`F}P{kOk7(*3fsA3FNjG>A#R56As#!$r= zsu)8RW2j;bRg9sEF;wv~s(2Yyyo@SdMinokikDHv%c$aIRPi#Zco|i^j4H-a#W<=M zM-}6!VjNYBql$4W$f1oK+Q^}e9NNgSvXPTE zj_OE1v7VDc`h-X1CpmU?=5!@Kk9T$E=t*ex;ndfx1KGM57bCGxG z<)kQo%DXyq+6Q8^8|Ty)yB6>2%t>i3@d{xs@{XOHRA=@9NA+r9O{$`sJij$KKVM6MIJQ>da|ph|#+`bJ`!`*tdfhTe`A}kR?7Ez?jgPx z^h!}qt-$3S#NO4JW7R09R^Ygca_{QQsVx}2t1}n8t23uPBu4M*%rRog@%%+Dc;t{{ zS7%OR7~QY-leomAh+Ocl&YW71&*oj7Ikh0i-qo37S7%OR9)HTaI&=E|%joskTtFde zWj=#@P<)5)=Bl~Y^u8N91Ar?%$UtF<|Hb>?VyIqBA1c~@snyHJcj1!b?CsqoG*4(S$2~r1a?{^(3-Tdp3mHvmw-;4WagI2(@QJs687( zJ)m^^8WG5*tQ6cPyOdBXy^a^^At_N|nUiUCiCZ++FM^zv9@AB;20s z6Y7^VgnIHz*hh)>c`DW}0-=0KC|?q4lq=LPX$ZA5O{l$sLXG-_8ubbPh2!N;ina4o zsGXle?feulV3tT`6bluL7^N;sQsTpIg(KOKZS#!_J1nY z{!gL2NT?^jgumgl+W)CoPYen5= z7wJ=EGgdZrHt${&u5!KJy(Vlnhsv^#Y^6j`eks1hB)GR=#S%6Tp z0HNGQh&JRlKAUy|3-#oe5Ixv!6r%yTjd{}!QlXyw66(n>q1;CJA0T=3t~Qlu1zxBp zzl8D`p=L}%?GzR2$uFUNMkrT_)eQV8?`;!a>T#(29p(BZ4VC;UvG$HC){|fHC2Dtvg!xANua0940onq|?5o*>Z)O<~7_qfC(D52(A zLd|!Cnp?$}c#I^}OiF0?xWpqOq4s_V?H&_wi3#3^pxACO0XLX{4@}Vb!6n+2Ej;0v zwlKka?G)cF7n*?DC!q5QD0~9io`9++py~Z$c`XtnPLOc=vCwetWv3+JD z%uj^*i7-DA<|o4ZL^z)a=M%kxq~kTm7jjNrzvJ&n&l5eC5dJGAnma2t+Y@1XB5Y6e zN|8$bU{uR8P6pkYCUQp;;eVpP1&b%a|0MXI1pkxZ-*3b8U(Np{_@4y-li+_6{7-`a zN$@`j{wKlzB>0~M|C8W<68uks|4Hya3H~R+|0MXI1pkxZ-*2Kk8v7lTM)#+a;D55# zvU=jlTFVk@<*-kvcRC9nl@2GX_cYp3Cu@Z;Ez~c-2)_Y-3w(y-|3zn>thVF7x_6sQ z?k1}RsYGjEI=|MwjLnpM+Q%rT{;PH^3bkud_z-B%pR5%^U5VO}%e4bXs6AA|444J= zwrG{u&nIim(8s$spRBwao%hMgyJP2layU$EC!egmyWDx7EU$Jv0R9qmFFYBqo~-pl z$L>QXYyHspd(f(wtW`vn;J}l$mgv|%JlQLXLNhxx42KUph^x=yv$L-7>&p923= z7-LLIq~B%c*i25*{6aB&PJz!U^pAe;nEnbsQ((hy7ITRi@Y}?UzH7fh z%;-L7ipHx(?Vl9B0{V`oa4%E13*IB95{*TLzUDlxIge}3Lo<13CJ)Wzp_x21lZR&V z&`chh$y2-58MLb0C$whrxZgbPG><#Y<4*Iq$2{&a56$ESYbFoPSjs~)d2p47X7XSx56$GkTOOLpgS|X7lLv=+XeJNM zHeDw>&!W~OpSQ@NL^+{IK~zkdG?%}nK*FQd1;%)9>L%ecGCxUbjhUQWla)x8LH zg+}eLiu1Y0eC{zHjpd`Ud^DDi#`4ivJ{rqMWBF(-AC2Xsv3&T+ho5|y$%mPIn8}Be zd^pKRWBF(-AC2Xsv3xX^kH+%hEgy~L!(Kib%ZI~!G?tIX^3hm6tmdP!e7Ma=WBD+g zkH+%hIUkMX!*)Iz%ZKxPG?tIX^3hm68p|ga`DiR3jpd`Ud^DC%M)J{EK6%MUWBFt! zAC2Xcg?u!YPcHJ&SU&lh2LIFGe;OQ4gTrZPY#K~XgUM+yISq|XgU@O3ISsC+!O}GN znFbrv;9(jJOyl0Cao5wh-)Y>}G&D91jZH&i)3~E)+{-lXVj3EohQ_9G%>`U@0oPoB zW(v?u0h%d5GX-d-0L>JjnF2IZfMyENOab>>!2K3*rv=<;0e4!!Jr;0}1!$%K%@m-S z0yI;AW(v?u0X!6-nF81-Kr;n!Qh;U(&`bfEDS)K{G*bXq1!$%K#tP6(0lXEUnF81= zKr;n!Sb$~<&`bfEDL^v?a9e<83eZdenkhgt1u$HIW(wfB0L>J@b^)3xKr;nsrU1