From 5239012bdc440b83a0e28bd82eb25035fe099942 Mon Sep 17 00:00:00 2001 From: TAO Cheng Date: Thu, 8 Jan 2015 16:18:58 +0800 Subject: [PATCH] =?UTF-8?q?MV900=E8=A7=86=E9=A2=91=E5=8D=A1=E8=A3=81?= =?UTF-8?q?=E5=89=AA=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Tools/UsbUtility/Debug/UtilityDebug.Log | 2 + .../UsbUtil/So7_Util_PLC_TCPIP_SERVER.cpp | 278 +++++++++--------- .../UsbUtil/So7_Util_PLC_TCPIP_SERVER.h | 3 +- .../UsbUtility/UsbUtil/Videocard_MV900.cpp | 44 ++- .../Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo | Bin 156160 -> 156160 bytes 5 files changed, 169 insertions(+), 158 deletions(-) diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log index 7e56789..c3fb92f 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log @@ -4782,3 +4782,5 @@ Usb Port Initialized. Usb Port Initialized. Usb Port Initialized. Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.cpp index 5d599e1..1a34d76 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.cpp @@ -30,6 +30,7 @@ IMPLEMENT_DYNAMIC(CSo7_Util_PLC_TCPIP_SERVER, CDialog) { m_CCDData_D10000[i]=0; } + m_iCCDDataIndex=0; } CSo7_Util_PLC_TCPIP_SERVER::~CSo7_Util_PLC_TCPIP_SERVER() @@ -100,83 +101,14 @@ BOOL CSo7_Util_PLC_TCPIP_SERVER::OnInitDialog() GetDlgItem(IDC_EDIT_PLC_TCPIP_SERVER_PLC_STATE)->SetWindowTextW(str); GetDlgItem(IDC_EDIT_PLC_TCPIP_SERVER_PORTNUMBER)->SetWindowTextW(_T("9600")); - int i(0); - m_CCDData_D10000[i++]=65000; - m_CCDData_D10000[i++]=1000; - m_CCDData_D10000[i++]=1000; - m_CCDData_D10000[i++]=2000; - m_CCDData_D10000[i++]=i*1000; - m_CCDData_D10000[i++]=i*1000; - m_CCDData_D10000[i++]=303000; - m_CCDData_D10000[i++]=0; - m_CCDData_D10000[i++]=0; - m_CCDData_D10000[i++]=10000; - m_CCDData_D10000[i++]=303000; - m_CCDData_D10000[i++]=0; - m_CCDData_D10000[i++]=0; - m_CCDData_D10000[i++]=10000; - m_CCDData_D10000[i++]=303000; - m_CCDData_D10000[i++]=0; - m_CCDData_D10000[i++]=0; - m_CCDData_D10000[i++]=10000; - m_CCDData_D10000[i++]=204000; - m_CCDData_D10000[i++]=0; - m_CCDData_D10000[i++]=0; - m_CCDData_D10000[i++]=10000; - m_CCDData_D10000[i++]=10000; - m_CCDData_D10000[i++]=204000; - m_CCDData_D10000[i++]=0; - m_CCDData_D10000[i++]=0; - m_CCDData_D10000[i++]=10000; - m_CCDData_D10000[i++]=10000; - m_CCDData_D10000[i++]=204000; - m_CCDData_D10000[i++]=0; - m_CCDData_D10000[i++]=0; - m_CCDData_D10000[i++]=10000; - m_CCDData_D10000[i++]=10000; - m_CCDData_D10000[i++]=204000; - m_CCDData_D10000[i++]=0; - m_CCDData_D10000[i++]=0; - m_CCDData_D10000[i++]=10000; - m_CCDData_D10000[i++]=10000; - m_CCDData_D10000[i++]=204000; - m_CCDData_D10000[i++]=0; - m_CCDData_D10000[i++]=0; - m_CCDData_D10000[i++]=10000; - m_CCDData_D10000[i++]=10000; - m_CCDData_D10000[i++]=204000; - m_CCDData_D10000[i++]=0; - m_CCDData_D10000[i++]=0; - m_CCDData_D10000[i++]=10000; - m_CCDData_D10000[i++]=10000; - m_CCDData_D10000[i++]=204000; - m_CCDData_D10000[i++]=0; - m_CCDData_D10000[i++]=0; - m_CCDData_D10000[i++]=10000; - m_CCDData_D10000[i++]=10000; - m_CCDData_D10000[i++]=204000; - m_CCDData_D10000[i++]=0; - m_CCDData_D10000[i++]=0; - m_CCDData_D10000[i++]=10000; - m_CCDData_D10000[i++]=10000; - - if (g_pSo7_TCPIP_Server) - { - int iData(0); - BYTE DM_Data[4]={0,0,0,0}; - int StartAddr(60); - for (int i=0;i>24) & 0x0ff; - DM_Data[1]=(iData>>16) & 0x0ff; - DM_Data[2]=(iData>>8) & 0x0ff; - DM_Data[3]=iData & 0x0ff; - g_pSo7_TCPIP_Server->DM10000[StartAddr+2*i]=(DM_Data[2]<<8)+DM_Data[3]; - g_pSo7_TCPIP_Server->DM10000[StartAddr+2*i+1]=(DM_Data[0]<<8)+DM_Data[1]; - } - } - if (g_pSo7_TCPIP_Server) + UpdataCCDData(); + int index(0); + /* + index=100; + g_pSo7_TCPIP_Server->DM5000[index++]=1; + g_pSo7_TCPIP_Server->DM5000[index++]=0; + g_pSo7_TCPIP_Server->DM5000[index++]=10000; + g_pSo7_TCPIP_Server->DM5000[index++]=0;*/ { int iData(0); BYTE DM_Data[4]={0,0,0,0}; @@ -212,64 +144,10 @@ BOOL CSo7_Util_PLC_TCPIP_SERVER::OnInitDialog() g_pSo7_TCPIP_Server->DM5000[StartAddr+2*i]=(DM_Data[2]<<8)+DM_Data[3]; g_pSo7_TCPIP_Server->DM5000[StartAddr+2*i+1]=(DM_Data[0]<<8)+DM_Data[1]; } - - + StartAddr=1100; for (int i=0;i<150;i++) { - iDM5000DWord[i]=0; - } - StartAddr=400; - index=0; - for (int i=0;i<10;i++) - { - iDM5000DWord[index++]=(i+1)*10000; - iDM5000DWord[index++]=(i+1)*10000; - iDM5000DWord[index++]=(i+1)*10000; - index=3*(i+1); - } - for (int i=0;i<6;i++) - { - iDM5000DWord[index++]=(i+1)*10000; - iDM5000DWord[index++]=(i+1)*10000; - iDM5000DWord[index++]=(i+1)*10000; - index=3*(i+11); - } - for (int i=0;i<150;i++) - { - iData=iDM5000DWord[i]; - DM_Data[0]=(iData>>24) & 0x0ff; - DM_Data[1]=(iData>>16) & 0x0ff; - DM_Data[2]=(iData>>8) & 0x0ff; - DM_Data[3]=iData & 0x0ff; - - g_pSo7_TCPIP_Server->DM5000[StartAddr+2*i]=(DM_Data[2]<<8)+DM_Data[3]; - g_pSo7_TCPIP_Server->DM5000[StartAddr+2*i+1]=(DM_Data[0]<<8)+DM_Data[1]; - } - - - for (int i=0;i<150;i++) - { - iDM5000DWord[i]=0; - } - StartAddr=500; - index=0; - for (int i=0;i<10;i++) - { - iDM5000DWord[index++]=(i+1)*10000; - iDM5000DWord[index++]=(i+1)*10000; - iDM5000DWord[index++]=(i+1)*10000; - index=3*(i+1); - } - for (int i=0;i<6;i++) - { - iDM5000DWord[index++]=(i+1)*10000; - iDM5000DWord[index++]=(i+1)*10000; - iDM5000DWord[index++]=(i+1)*10000; - index=3*(i+11); - } - for (int i=0;i<150;i++) - { - iData=iDM5000DWord[i]; + iData=iDM5000DWord[i]+i*10; DM_Data[0]=(iData>>24) & 0x0ff; DM_Data[1]=(iData>>16) & 0x0ff; DM_Data[2]=(iData>>8) & 0x0ff; @@ -279,6 +157,27 @@ BOOL CSo7_Util_PLC_TCPIP_SERVER::OnInitDialog() g_pSo7_TCPIP_Server->DM5000[StartAddr+2*i+1]=(DM_Data[0]<<8)+DM_Data[1]; } } + index=114; + g_pSo7_TCPIP_Server->DM5000[index++]=1; + g_pSo7_TCPIP_Server->DM5000[index++]=0; + g_pSo7_TCPIP_Server->DM5000[index++]=20000; + g_pSo7_TCPIP_Server->DM5000[index++]=0; + + index=400; + g_pSo7_TCPIP_Server->DM5000[index]=0; + index+=2; + g_pSo7_TCPIP_Server->DM5000[index]=0; + index+=2; + g_pSo7_TCPIP_Server->DM5000[index]=10000; + index+=2; + g_pSo7_TCPIP_Server->DM5000[index]=10000; + index+=2; + g_pSo7_TCPIP_Server->DM5000[index]=10000; + index+=2; + g_pSo7_TCPIP_Server->DM5000[index]=0; + index+=2; + + m_DMAddrList=DM_ADDR_CCD; ((CButton *)GetDlgItem(IDC_RADIO_PLC_TCPIP_SERVER_ADDR_CCD_DM))->SetCheck(TRUE); @@ -351,12 +250,11 @@ void CSo7_Util_PLC_TCPIP_SERVER::m_UpdateControls(int _type) BYTE DM_Data[4]={0,0,0,0}; g_pSo7_TCPIP_Server->m_TCPIPServerState._PLCRunningState=static_cast(g_pSo7_TCPIP_Server->DM5000[0]); - for (int i=1;i<=8;i++) + for (int i=1;i<=16;i++) { DM_Data[0]=(g_pSo7_TCPIP_Server->DM5000[i]>>8) & 0x0ff; DM_Data[1]=(g_pSo7_TCPIP_Server->DM5000[i]) & 0x0ff; - g_pSo7_TCPIP_Server->m_TCPIPServerState._PLCSensorState[(i-1)*2+1]=DM_Data[0]; - g_pSo7_TCPIP_Server->m_TCPIPServerState._PLCSensorState[(i-1)*2]=DM_Data[1]; + g_pSo7_TCPIP_Server->m_TCPIPServerState._PLCSensorState[i-1]=DM_Data[1];; } str.Format(_T("%d"),g_pSo7_TCPIP_Server->m_TCPIPServerState._PLCSensorState[OMRON_PLC_CCD1_CAMERA1]); GetDlgItem(IDC_EDIT_PLC_TCPIP_SERVER_STATE_CCD1)->SetWindowTextW(str); @@ -400,15 +298,86 @@ void CSo7_Util_PLC_TCPIP_SERVER::m_UpdateControls(int _type) BYTE DM_Data[4]={0,0,0,0}; g_pSo7_TCPIP_Server->DM5000[0]=static_cast(g_pSo7_TCPIP_Server->m_TCPIPServerState._PLCRunningState); - for (int i=1;i<=8;i++) + for (int i=1;i<=16;i++) { - DM_Data[1]=g_pSo7_TCPIP_Server->m_TCPIPServerState._PLCSensorState[(i-1)*2]; - DM_Data[0]=g_pSo7_TCPIP_Server->m_TCPIPServerState._PLCSensorState[(i-1)*2+1]; + DM_Data[1]=g_pSo7_TCPIP_Server->m_TCPIPServerState._PLCSensorState[i-1]; + DM_Data[0]=0; g_pSo7_TCPIP_Server->DM5000[i]=(DM_Data[0]<<8)+DM_Data[1]; } } } //===================================================================== +void CSo7_Util_PLC_TCPIP_SERVER::UpdataCCDData() +{ + int i(0); + if (m_iCCDDataIndex==0) + { + m_iCCDDataIndex=1; + + m_CCDData_D10000[i++]=12000; + m_CCDData_D10000[i++]=1000; + m_CCDData_D10000[i++]=1000; + m_CCDData_D10000[i++]=204000; + m_CCDData_D10000[i++]=-10000; + m_CCDData_D10000[i++]=-10000; + m_CCDData_D10000[i++]=-10000; + m_CCDData_D10000[i++]=10000; + m_CCDData_D10000[i++]=204000; + m_CCDData_D10000[i++]=10000; + m_CCDData_D10000[i++]=-10000; + m_CCDData_D10000[i++]=10000; + m_CCDData_D10000[i++]=10000; + } + else + { + m_iCCDDataIndex=0; + + + m_CCDData_D10000[i++]=7000; + m_CCDData_D10000[i++]=1000; + m_CCDData_D10000[i++]=1000; + m_CCDData_D10000[i++]=204000; + m_CCDData_D10000[i++]=-10000; + m_CCDData_D10000[i++]=-10000; + m_CCDData_D10000[i++]=-10000; + m_CCDData_D10000[i++]=10000; + m_CCDData_D10000[i++]=204000; + m_CCDData_D10000[i++]=10000; + m_CCDData_D10000[i++]=-10000; + m_CCDData_D10000[i++]=10000; + m_CCDData_D10000[i++]=10000; + } + + if (g_pSo7_TCPIP_Server) + { + int iData(0); + BYTE DM_Data[4]={0,0,0,0}; + int StartAddr(60); + for (int i=0;i>24) & 0x0ff; + DM_Data[1]=(iData>>16) & 0x0ff; + DM_Data[2]=(iData>>8) & 0x0ff; + DM_Data[3]=iData & 0x0ff; + g_pSo7_TCPIP_Server->DM10000[StartAddr+2*i]=(DM_Data[2]<<8)+DM_Data[3]; + g_pSo7_TCPIP_Server->DM10000[StartAddr+2*i+1]=(DM_Data[0]<<8)+DM_Data[1]; + } + StartAddr=2060; + for (int i=0;i>24) & 0x0ff; + DM_Data[1]=(iData>>16) & 0x0ff; + DM_Data[2]=(iData>>8) & 0x0ff; + DM_Data[3]=iData & 0x0ff; + g_pSo7_TCPIP_Server->DM10000[StartAddr+2*i]=(DM_Data[2]<<8)+DM_Data[3]; + g_pSo7_TCPIP_Server->DM10000[StartAddr+2*i+1]=(DM_Data[0]<<8)+DM_Data[1]; + } + } + +} +//===================================================================== void CSo7_Util_PLC_TCPIP_SERVER::OnBnClickedRadioPlcTcpipServerAddrCcdDm() { m_UpdateListControl(E_LISTCTRL_CONTROL2DATA); @@ -416,6 +385,7 @@ void CSo7_Util_PLC_TCPIP_SERVER::OnBnClickedRadioPlcTcpipServerAddrCcdDm() { m_UpdateControls(FALSE); } + UpdataCCDData(); m_DMAddrList=DM_ADDR_CCD; m_UpdateListControl(E_LISTCTRL_TITLE); m_UpdateListControl(E_LISTCTRL_DATA2CONTROL); @@ -525,13 +495,20 @@ void CSo7_Util_PLC_TCPIP_SERVER::m_UpdateListControl(int _type) } int Addr(0); m_DataList.SetItemText(Addr++,2,_T("PLC设备运行状态(0-未知,1-空闲,2-后退(开始测量),3-前进(测量结束),4-故障,5-参数编辑)")); - m_DataList.SetItemText(Addr++,2,_T("CCD1数据刷新")); - m_DataList.SetItemText(Addr++,2,_T("CCD2数据刷新")); - m_DataList.SetItemText(Addr++,2,_T("CCD3数据刷新")); - m_DataList.SetItemText(Addr++,2,_T("CCD4数据刷新")); - m_DataList.SetItemText(Addr++,2,_T("CCD5数据刷新")); - m_DataList.SetItemText(Addr++,2,_T("LS1数据刷新")); - m_DataList.SetItemText(Addr++,2,_T("LS2数据刷新")); + m_DataList.SetItemText(Addr++,2,_T("CCD1-1数据刷新")); + m_DataList.SetItemText(Addr++,2,_T("CCD1-2数据刷新")); + m_DataList.SetItemText(Addr++,2,_T("CCD2-1数据刷新")); + m_DataList.SetItemText(Addr++,2,_T("CCD2-2数据刷新")); + m_DataList.SetItemText(Addr++,2,_T("CCD3-1数据刷新")); + m_DataList.SetItemText(Addr++,2,_T("CCD3-2数据刷新")); + m_DataList.SetItemText(Addr++,2,_T("CCD4-1数据刷新")); + m_DataList.SetItemText(Addr++,2,_T("CCD4-2数据刷新")); + m_DataList.SetItemText(Addr++,2,_T("CCD5-1数据刷新")); + m_DataList.SetItemText(Addr++,2,_T("CCD5-2数据刷新")); + m_DataList.SetItemText(Addr++,2,_T("LS1-1数据刷新")); + m_DataList.SetItemText(Addr++,2,_T("LS1-2数据刷新")); + m_DataList.SetItemText(Addr++,2,_T("LS2-1数据刷新")); + m_DataList.SetItemText(Addr++,2,_T("LS2-2数据刷新")); m_DataList.SetItemText(Addr++,2,_T("光栅尺数据刷新")); Addr=100; for (int i=0;i<10;i++) @@ -674,6 +651,15 @@ void CSo7_Util_PLC_TCPIP_SERVER::m_UpdateListControl(int _type) DM_Data[3]=(g_pSo7_TCPIP_Server->DM10000[StartAddr+2*i]) & 0x0ff; m_CCDData_D10000[i]=(DM_Data[0]<<24)+(DM_Data[1]<<16)+(DM_Data[2]<<8)+(DM_Data[3]); } + StartAddr=2060; + for (int i=0;iDM10000[StartAddr+2*i+1]>>8) & 0x0ff; + DM_Data[1]=(g_pSo7_TCPIP_Server->DM10000[StartAddr+2*i+1]) & 0x0ff; + DM_Data[2]=(g_pSo7_TCPIP_Server->DM10000[StartAddr+2*i]>>8) & 0x0ff; + DM_Data[3]=(g_pSo7_TCPIP_Server->DM10000[StartAddr+2*i]) & 0x0ff; + m_CCDData_D10000[i]=(DM_Data[0]<<24)+(DM_Data[1]<<16)+(DM_Data[2]<<8)+(DM_Data[3]); + } } for (int i=iStartRow; im_hDC,pBitBmp,0,m_DisplayHeight,pData,&bmpInfo,DIB_RGB_COLORS); + if (m_bSaveFile) { SaveBitmapToFile(pBitBmp,m_SaveFile); @@ -476,13 +477,34 @@ void CVideocard_MV900::OnPaint() } pOldBitmap = pMemDC->SelectObject(&pBitBmp); nMode = pMemDC->SetBkMode(TRANSPARENT); + + CPen m_Pen(PS_DASH,0,RGB(255,0,0)); + POINT m_point; + pMemDC->SelectObject(&m_Pen); + m_point.x=0; + m_point.y=static_cast(m_DisplayHeight*0.5); + pMemDC->MoveTo(m_point); + m_point.x=m_DisplayWidth; + m_point.y=static_cast(m_DisplayHeight*0.5); + pMemDC->LineTo(m_point); + m_point.x=static_cast(m_DisplayWidth*0.5); + m_point.y=0; + pMemDC->MoveTo(m_point); + m_point.x=static_cast(m_DisplayWidth*0.5); + m_point.y=m_DisplayHeight; + pMemDC->LineTo(m_point); + dc->BitBlt(0, 0, m_DisplayWidth, m_DisplayHeight, pMemDC,0,0, SRCCOPY); pMemDC->SetBkMode(nMode); pMemDC->SelectObject(pOldBitmap); ReleaseDC(pMemDC); + + m_Pen.DeleteObject(); + delete pMemDC; ReleaseDC(dc); + } //================================================================================================ void CVideocard_MV900::UpdateImage() @@ -512,19 +534,19 @@ void CVideocard_MV900::OnTimer(UINT_PTR nIDEvent) CDialog::OnTimer(nIDEvent); } -static int iStartX(0); -static int iStartY(0); +static int iStartX(64); +static int iStartY(48); //==================================SV4000E===================================== -VOID CALLBACK MV900_PrcVidCapCallBack( PUCHAR pData, ULONG Length,CVideocard_MV900* pIS) +VOID CALLBACK MV900_PrcVidCapCallBack(PUCHAR pData, ULONG Length,CVideocard_MV900* pIS) { UNREFERENCED_PARAMETER(Length); //memcpy(g_DataBuffer,(BYTE*)pData,Length);//640*480*m_VideoBitcount - for(int y=iStartY;yUpdateImage(); diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo index 9f19966904e5d2aaee3925eab943810681abd697..16e77c3bdfe663112e10ffdc82210fff89932ef5 100644 GIT binary patch delta 4710 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 KbEAY|QGWxu4JwlW delta 4216 zcmaJ^3s}`f7N0Zs4TxNnE7Ao46~$B@8X3!LB(5nUrjWXqBGS+h4|WdT2?+lZC710=wWMXDlOsT+q`?`BBtB-?cDF&nK^UL%$YMYzjOZf z119?cQ}cYS-Ye60Wwp0btepWS&@#rnh(voZjK&^ag*HgTn6g}70@|BSr&H-MWO5Uj zNhG*mOet}zFhV3=_dcer?q_1ppmi}oJwKvCmdw)GeJtGdOJgry2**z(6@Dy{R8ht(MJr zBYYa}_l-k)#AFkA63@F|!aa~$1@8367(@whkH*%=_8401uTo9b&f~4&n4+rA}ZpYLl9$#W7*`MUQ9IZbDvMG zC)r~9Uykl^kBP^VzzVH$2o5QU@lJq$Dv7o>e?!w|#tiH@Hsr6VYXA=%H#Y{_@925q z&t;)-fjDmnQwMk(X62-0Kb(?{iz>##H~s8ESX^;0d~t`K(IxOhzrb&L-DP7$VgpRY zth_w2_W-y{Rq{3%*h}`OPZ;khv)yHlww@(zz@YM{@X)d-Wz)R*8fDXhQy_|TV8Zc> zH;AGpYMfhIiE~O0W8vKQ@bwBs8MWvpi1Cwn3>Gb%gr66TRU(!=4RQ!)F8@pfrjd?+ zT_lZKaK-*X`1mtEQcA=p@Tq8fDoccIfiT=$(W2C^G=Xr+HJk+-?^Zl&A5F%O?H`?{ z9JBAxD&JPF0W2v}l-+6z7c&|mMrnUe2WVVSi&e!YeE*Xg3@ZE;-oUV`CCYzZIj9kx ziQI&tXGQ40A-Gra6yMZyS`|+36HLwE9pL_rxotJ`c&N>mNg&k5vd42uodVKlX&OIBq zyJ4u-OQh+!2RgP-g(6JclnHTIxKU!mJnYykdzoSP$ezgD2|jxouW_hVuJ15tV4Wy; zK!UJEK(c=UTgINE2fTou>Re`+7__!9^`u+a8r>`Vw;8Zu*DSOjb)e%f@4=&3+T`SO z-LUMPN{qOE48xsqqFxJH+_F@MQ*Iu>dS^avx$Y+1v@k&)@;bB?n6bKR(fXcbp45Uf z3M1FIWc7hoZp$vfmAw@r+6NB8Dy%7s6~Q{laBbAm{G$dPFZ!TQYY6V_3{%Zs^ppP)V%3x5SXxonJBsH3faROlfZr$Y$r#0F;y)(Zod<~3Ah?s&M+k)`8Wdx4+Y^L}ofCmhSaQToi9Swg-!w>EG+y=t? zIM@(Ao1iFP9O2L_+6?@vF?zRe`F=~49qq>)8bWt@au9=a+Mf~4--DO%JP+e>`mqr; zMMk$J^|MoQOO3N~niN}y7L03YdW(b(31PaS1TB}av^x~He`m$LK~dOq+y$9fa)Quw z012+^7dDqs>qjD4B*yiKL@PXxHlqV0Lu_K}mt?Br%QYg+4tbVdb@>ZJm)4K*d(qZg zX6U_t4keehm#ifmj@UA)ceIYs7QiNqzRGfb}8CCa*_-2-W_x6ob8$l$}psqesI z+;VN;!N2Bh`w4Al90?arjQ(KXwpQJfq$Ev~<+X{_A&>R-oX*K?0)?&!ihe8T#F7bV zWr%u)EoaL__eDrV`#)^r<1}tT%NdK$M|!Q1FO(5b`e&yEpQgXz(K@dEU2{RZwWrWK!JMf97gZF>83b$X&_ zVA^Nz4v1)bjOOmQaQg#{J%SCF2J!FjQEcB%0?;a@--Q{qZ<8I$u8R`^0+g8|3U?L|nadliNt?rBneGN2tW;%b6;ClwZnuonPDyARnB_$nL~)ida>**3U~ z$T#5d)*IS4Z@vM%1?+?nzd^(BJE5VF0AfBnvgQ4n3&oE&H2(3|oE_%aXf90@(HfXS zSI8zD8oE9m1tVQ6;i{exY^wv0{ zeHV11wKq&(3(3*p(XHM<9?br9v}$aEzeB49=DCYbE4QfjAh7$1MQ0&Q^*jq5P?rF~ zV*4tvs`2q4pYL%97})P)#$;MFldj|-)t&?g^jZSM-?9f$G7YkfRm74{)^*1`T&V)} zWKqBV3WB)s$^gC4{}Z-~^sDfi`1S($w_bw#IZysw*u+_TEtdb>NWuaQ~5UjCcns znlRW+K53aACEpc>U29G1yTCL!){%6poh);Ml*SV9#P0XWB(BYr=@U6?ZR1X@yh|vXXdT32=l{V>pq0 zpSM?N(epOiR?^or(@s?KqIl9js5xr=X_|5!oHd|%)=Ck0j3QA`qbHPg9 zxlJH%vlauNUkzVjcTK%(A>q6X14Ys6a7nc_KrwIJLFp_khN+_d7cdIG9e$K|#Ux5o zAxka(1)k+~FTn^5K5bQP&ETPje39M?F9&AOeY~HJL*BY+)RuJ&^Y2{M=FwsLqa)w8!{sWQ7S79*Js7q9+^230WHY^%qk-4`AToZ{J z@Ha2M4M%;~lv0OnK_dJjg`k%6Ur7zQl->iIb8i zB(3m#ytMMZ=3*POvZQw@zlcZW<5CeWbF#ObacJwDC({p{-j&jaNssk}z}fy&^cHFL zaA>`0qB;HQzh}&OF}QT#f$2xvyDu2DqP!9Yi^n=)lnA~E0TKUeUluuGp(|%Ea=E1B z4mZ+yuuo`f5p`Vzhs8!4W`}x<=1d;0e%u9nH5h4$r<@^}6b}$`|{c`yH zch7&YL_#VCo*$vxH|3=~tqWjJ{Xidniz>#c+r9Zr!0?4Sak!W+m!~f;Z2eJc7txwB z_}Z~NayW)tY_x#apaR!X&2ibrn9Kz7Z@V0$PL5UQUxZpvm-_P6&^nrzaLu@!Twy;g z0o8+BWw=(8e})g?O>-32*1ZjDM0*<7tLv}9B^?$Yu&Iulut@_qYn~jXR&f5IX7Jo6 zZj7XL?kZ}oo?q5WG}F(gfnFxc2JmSnSWTT(M18ScCIRmgQ4t;K{7>piPj1)n9QLL; znsZU!1>@9lgZT-KYL4X`+@GsXUo|td$VU6dj)k#!`NIc<^#Y8SIb8wI`ie8>!Ajrk;n8B!Fn;KsEcyb@p%+uko^$=nG@CK`MOi5i3)0nu zK;C9h&G9^&yKgv^7Z&uzDjUTN(G|&uscUU~G3CNN8Q5GnRNUMEVWMt2AL+h-=@SQ= zPnXN>i|)~UlWL6Q8vz3g-9*)Ely7Cf1`mjN!}v&p=$ZXPa_gg_ZWzB0%WEg7>Aqa) NJ8#u9ivN7?e*xG5hPeO$