Commit 5340dbb9 张东亮

1

2 个父辈 40aa4308 927a4371
正在显示 44 个修改的文件 包含 2011 行增加2074 行删除
......@@ -83,6 +83,7 @@
<Compile Include="bean\node\ClientNode.cs" />
<Compile Include="bean\node\DoubleLineNodeFor4D.cs" />
<Compile Include="bean\node\DoubleLineNodeFor4C.cs" />
<Compile Include="bean\UnlockedShelf.cs" />
<Compile Include="BLL\AGVManager.cs" />
<Compile Include="BLL\AgvServer.cs" />
<Compile Include="BLL\Common.cs" />
......@@ -95,6 +96,8 @@
<SubType>Component</SubType>
</Compile>
<Compile Include="BLL\LineWebService.cs" />
<Compile Include="BLL\StationRFIDManager.cs" />
<Compile Include="BLL\UnlockMissionManager.cs" />
<Compile Include="FrmMain.cs">
<SubType>Form</SubType>
</Compile>
......
......@@ -18,13 +18,17 @@
</layout>
</appender>
<appender name="LineWebService" type="log4net.Appender.RollingFileAppender">
<file value="logs/LineWebService.log"/>
<file value="logs/UnlockInfo.log"/>
<param name="Encoding" value="UTF-8"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<datePattern value="yyyy-MM-dd"/>
<param name="MaxSizeRollBackups" value="10" />
<!-- 切割最多文件数 -->
<param name="MaximumFileSize" value="100MB" />
<!-- 每个文件的大小 -->
<param name="RollingStyle" value="Size" />
<param name="StaticLogFileName" value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%date][%t][%c:%L]%-5p %m%n"/>
<conversionPattern value="[%date]%-5p %m%n"/>
</layout>
</appender>
<logger name ="LineWebService">
......@@ -43,7 +47,8 @@
<add key="FLEET" value="10.85.199.3" />
<add key="AutoCharge" value="True" />
<add key="ChargeWait" value="1" />
<add key="ChargeThreshold" value="20,70" />
<add key="ChargeThreshold" value="20,90" />
<add key="IP_4D_Light" value="10.85.196.40:8088" />
<add key="IP_4C_Light" value="10.85.197.40:8088" />
</appSettings>
</configuration>
\ No newline at end of file
......@@ -5,9 +5,10 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AGVControl;
using BLL;
using RestSharp;
namespace BLL
namespace AGVControl
{
public class AGVManager
{
......@@ -42,7 +43,7 @@ namespace BLL
}
else
{
if(workOrder.data.line !=null)
if (workOrder.data.line != null)
{
string tempLocation = workOrder.data.line;
if (workOrder.data.line.Equals("Feeder"))
......@@ -57,9 +58,9 @@ namespace BLL
woData = workOrder.data;
return true;
}
}
}
}
......@@ -90,7 +91,7 @@ namespace BLL
public string ToTxt(string nodeName)
{
return string.Format("[hSerial={0},line={1}[{3}],so={2}]", hSerial,line,so,nodeName);
return string.Format("[hSerial={0},line={1}[{3}],so={2}]", hSerial, line, so, nodeName);
}
}
public static string A6_Target = "";
......@@ -167,7 +168,7 @@ namespace BLL
#endregion
res[0].location = loc;
dest = res[0];
Common.GetLineNameByNodeName(loc,out string line);
Common.GetLineNameByNodeName(loc, out string line);
A6_Target = res[0].ShowInfo(line);
Common.log.Debug("查找满料架任务[RFID=" + rfid + "]:目的地为 " + loc + " [产线名 " + line + "]");
return true;
......@@ -203,7 +204,7 @@ namespace BLL
public string ShowInfo(string loc)
{
return string.Format("RFID={0},SO={1},location={2}[{3}]", id, SO, loc,location);
return string.Format("RFID={0},SO={1},location={2}[{3}]", id, SO, loc, location);
}
}
......@@ -331,7 +332,12 @@ namespace BLL
{
public string msg { get; set; }
}
public class Msg1
{
//{"Code":0,"Msg":"D14,,D7,D33"}
public int Code { get; set; }
public string Msg { get; set; }
}
private static string Addr_updateDeviceAlarmMsg = "/rest/api/qisda/device/updateDeviceAlarmMsg";
/// <summary>
/// 异常看板
......@@ -420,6 +426,178 @@ namespace BLL
return e.ToString();
}
}
/// <summary>
/// 获取接驳台料架情况
/// </summary>
/// <param name="lineName"></param>
/// <returns></returns>
public static string GetRFIDs(string lineName)
{
string addr = "";
if (lineName.StartsWith(SettingString.D4_Name_Prefix))
{
addr = string.Format("http://{0}/LineGetRFID?line={1}", ConfigAppSettings.GetValue(SettingString.IP_4D_Light), lineName);
}
else if (lineName.StartsWith(SettingString.C4_Name_Prefix))
{
addr = string.Format("http://{0}/LineGetRFID?line={1}", ConfigAppSettings.GetValue(SettingString.IP_4C_Light), lineName);
}
try
{
string result = HttpHelper.Get(addr);
if (!result.Equals(""))
{
Msg1 msgs = JsonHelper.DeserializeJsonToObject<Msg1>(result);
if (msgs == null)
return ",,,";
else
{
Common.log.Debug(string.Format("{0}接驳台状态:{1}", lineName, msgs.Msg));
return msgs.Msg;
}
}
}
catch (Exception ex)
{
Common.log.Error(ex.Message);
return ",,,";
}
return ",,,";
}
/// <summary>
/// 获取接驳台最外面料架
/// </summary>
/// <param name="lineName"></param>
/// <returns></returns>
public static string GetFirstRFID(string lineName)
{
string addr = "";
if (lineName.StartsWith(SettingString.D4_Name_Prefix))
{
addr = string.Format("http://{0}/LineGetRFID?line={1}", ConfigAppSettings.GetValue(SettingString.IP_4D_Light), lineName);
}
else if (lineName.StartsWith(SettingString.C4_Name_Prefix))
{
addr = string.Format("http://{0}/LineGetRFID?line={1}", ConfigAppSettings.GetValue(SettingString.IP_4C_Light), lineName);
}
try
{
string result = HttpHelper.Get(addr);
if (!result.Equals(""))
{
Msg1 msgs = JsonHelper.DeserializeJsonToObject<Msg1>(result);
if (msgs == null)
return "";
else
{
Common.log.Debug(string.Format("{0}接驳台状态:{1}", lineName, msgs.Msg));
string rfid = "";
foreach (string item in msgs.Msg.Split(','))
{
if (!item.Equals(""))
{
rfid = item;
}
}
return rfid;
}
}
}
catch (Exception ex)
{
Common.log.Error(ex.Message);
return "";
}
return "";
}
/// <summary>
/// 删除接驳台料架
/// </summary>
/// <param name="lineName"></param>
/// <param name="rfid"></param>
/// <returns></returns>
public static bool ClearRFID(string lineName, string rfid)
{
string addr = "";
if (lineName.StartsWith(SettingString.D4_Name_Prefix))
{
addr = string.Format("http://{0}/LineClearRFID?line={1}&rfid={2}", ConfigAppSettings.GetValue(SettingString.IP_4D_Light), lineName, rfid);
}
else if (lineName.StartsWith(SettingString.C4_Name_Prefix))
{
addr = string.Format("http://{0}/LineClearRFID?line={1}&rfid={2}", ConfigAppSettings.GetValue(SettingString.IP_4C_Light), lineName, rfid);
}
try
{
string result = HttpHelper.Get(addr);
if (!result.Equals(""))
{
Msg1 msgs = JsonHelper.DeserializeJsonToObject<Msg1>(result);
if (msgs == null)
return false;
else
{
Common.log.Info(string.Format("删除{0}接驳台料架{1}:{2}", lineName, rfid, msgs.Msg));
return true;
}
}
}
catch (Exception ex)
{
Common.log.Error(ex.Message);
return false;
}
return false;
}
private static string Addr_agvRemoveRfid = "/rest/api/qisda/device/agvRemoveRfid";
/// <summary>
/// 根据RFID清理料架的缓存信息
/// </summary>
/// <param name="rfid"></param>
/// <returns></returns>
public static bool AgvRemoveRfid(string rfid)
{
try
{
Dictionary<string, string> paramMap = new Dictionary<string, string>();
paramMap.Add("rfid", rfid.ToUpper());
string server = GetAddr(Addr_agvRemoveRfid, paramMap);
DateTime startTime = DateTime.Now;
string resultStr = HttpHelper.Get(server);
Common.log.Info("清理料架的缓存信息【" + server + "】【" + resultStr + "】");
RfidData rfidData = JsonHelper.DeserializeJsonToObject<RfidData>(resultStr);
if (rfidData == null)
{
return false;
}
else
{
if (rfidData.code.Equals(0))
{
return true;
}
}
}
catch (Exception ex)
{
Common.log.Error(ex);
return false;
}
return false;
}
}
public class ShelfLockInfo
{
......@@ -514,7 +692,7 @@ namespace BLL
/// <param name="name">异常位置名称</param>
/// <param name="key">异常信息唯一标识</param>
/// <param name="value">异常信息</param>
public AlarmMsg(string name, string key, string value,int type=0)
public AlarmMsg(string name, string key, string value, int type = 0)
{
this.name = name;
this.msgKey = key;
......
......@@ -24,6 +24,8 @@ namespace AGVControl
public const string CheckShelf = "CheckShelf";
public const string DoorDToC = "DoorDToC";
public const string DoorCToD = "DoorCToD";
public const string DoorAirIn = "DoorAirIn";
public const string DoorAirOut = "DoorAirOut";
public const string DoubleLine_Name_Prefix = "A";
public const string Wait = "Wait";
public const string Done = "Done";
......@@ -42,6 +44,7 @@ namespace AGVControl
public const string IsUse = "IsUse";
public const string RFID = "RFID";
public const string EmptyShelfCnt = "EmptyShelfCnt";
public const string EmptyShelfRFIDs = "EmptyShelfRFIDs";
/// <summary>
/// 去4C的3辆车IP
/// </summary>
......@@ -63,6 +66,11 @@ namespace AGVControl
public const string A5 = "A5";
public const string D4_Name_Prefix = "D";
public const string C4_Name_Prefix = "C";
public const string IP_4D_Light = "IP_4D_Light";
public const string IP_4C_Light = "IP_4C_Light";
public const string Lines_In_Air_Door = "C8,C9,C10";
}
......@@ -93,7 +101,7 @@ namespace AGVControl
public static Dictionary<string, string> showNameMissionName;
//public static Dictionary<string, string> agvProductionLine;
public static System.Configuration.Configuration appConfig;
public static MissionManager missionManager;
public static UnlockMissionManager missionManager;
public static StandbyStation StandbyStation = new StandbyStation() { C4_Station1 = "", C4_Station2 = "" };
private static List<string> msg = new List<string>();
......@@ -201,9 +209,9 @@ namespace AGVControl
}
else
{
tarIdx = Common.agvInfo.FindIndex(s=> !s.IP.Equals(agv.IP) && s.CurJob !=null && s.CurJob is EmptyShelfBackJob
&& ((((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace)!=null ) && ((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace.Equals(SettingString.A5));
if(tarIdx==-1)
tarIdx = Common.agvInfo.FindIndex(s => !s.IP.Equals(agv.IP) && s.CurJob != null && s.CurJob is EmptyShelfBackJob
&& ((((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace) != null) && ((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace.Equals(SettingString.A5));
if (tarIdx == -1)
{
nodeName = SettingString.A5;
Common.log.Debug(string.Format("{0} {1}需要小料架", agv.Name, SettingString.A5));
......@@ -231,7 +239,7 @@ namespace AGVControl
{
tarIdx = Common.agvInfo.FindIndex(s => !s.IP.Equals(agv.IP) && s.CurJob != null && s.CurJob is EmptyShelfBackJob
&& ((((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace) != null) && ((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace.Equals(SettingString.A6));
if(tarIdx==-1)
if (tarIdx == -1)
{
nodeName = SettingString.A6;
Common.log.Debug(string.Format("{0} {1}需要小料架", agv.Name, SettingString.A6));
......@@ -263,8 +271,8 @@ namespace AGVControl
else
{
tarIdx = Common.agvInfo.FindIndex(s => !s.IP.Equals(agv.IP) && s.CurJob != null && s.CurJob is EmptyShelfBackJob
&& ((((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace) != null) && ((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace.Equals(SettingString.A5));
if(tarIdx==-1)
&& ((((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace) != null) && ((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace.Equals(SettingString.A5));
if (tarIdx == -1)
{
nodeName = SettingString.A5;
Common.log.Debug(string.Format("{0} {1}需要大料架", agv.Name, SettingString.A5));
......@@ -292,7 +300,7 @@ namespace AGVControl
{
tarIdx = Common.agvInfo.FindIndex(s => !s.IP.Equals(agv.IP) && s.CurJob != null && s.CurJob is EmptyShelfBackJob
&& ((((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace) != null) && ((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace.Equals(SettingString.A6));
if(tarIdx==-1)
if (tarIdx == -1)
{
nodeName = SettingString.A6;
Common.log.Debug(string.Format("{0} {1}需要大料架", agv.Name, SettingString.A6));
......@@ -490,50 +498,31 @@ namespace AGVControl
}
else if (shelfType.Equals(eShelfType.BigShelf))
{
//int tarIdx = Common.nodeInfo.FindIndex(s => s.Name == SettingString.A5
// && (s.StateEquals(eNodeStatus.NeedC) || s.StateEquals(eNodeStatus.NeedEnter)) && s.IsUse);
//if (tarIdx == -1)
//{
// Common.log.Debug(string.Format("{0} {1}不需要大料架", agv.Name, SettingString.A5));
//}
//else
//{
// nodeName = SettingString.A5;
// Common.log.Debug(string.Format("{0} {1}需要大料架", agv.Name, SettingString.A5));
// return true;
//}
int tarIdx = Common.nodeInfo.FindIndex(s => s.Name == SettingString.A5
&& (s.StateEquals(eNodeStatus.NeedC) || s.StateEquals(eNodeStatus.NeedEnter)) && s.IsUse);
if (tarIdx == -1)
{
Common.log.Debug(string.Format("{0} {1}不需要大料架", agv.Name, SettingString.A5));
}
else
{
nodeName = SettingString.A5;
Common.log.Debug(string.Format("{0} {1}需要大料架", agv.Name, SettingString.A5));
return true;
}
int tarIdx = Common.nodeInfo.FindIndex(s => s.Name == SettingString.A6 &&
tarIdx = Common.nodeInfo.FindIndex(s => s.Name == SettingString.A6 &&
(s.StateEquals(eNodeStatus.NeedEnter) || s.StateEquals(eNodeStatus.NeedEnterLeave)) && s.IsUse);
if (tarIdx == -1)
{
Common.log.Debug(string.Format("{0} {1}不需要大料架", agv.Name, SettingString.A6));
//rtn = Common.mir.Add_Mission_Fleet(agv, Common.agvMission[SettingString.MoveStandby]);
//if (rtn)
//{
// agv.NextPlace = "";
// agv.TaskSend = rtn ? SettingString.MoveStandby : "";
// agv.Msg = string.Format("{0} 在{1}已装载大料架,送往{2}", agv.Name, place, SettingString.MoveStandby);
// Common.LogInfo(string.Format("{0} 在{1}已装载大料架,送往{2}", agv.Name, place, SettingString.MoveStandby));
//}
Common.log.Debug(string.Format("{0} {1}不需要料架", agv.Name, SettingString.A6));
}
else
{
nodeName = SettingString.A6;
Common.log.Debug(string.Format("{0} {1}需要料架", agv.Name, SettingString.A6));
Common.log.Debug(string.Format("{0} {1}需要料架", agv.Name, SettingString.A6));
return true;
//rtn = Common.mir.Add_Mission_Fleet(agv, Common.agvMission[SettingString.Move + SettingString.A6]);
//if (rtn)
//{
// agv.NextPlace = "";
// tarNodeName = SettingString.A6;
// Common.nodeInfo[tarIdx].AgvName = agv.Name;
// agv.TaskSend = rtn ? SettingString.Move + SettingString.A6 : "";
// agv.Msg = string.Format("{0} 在{1}已装载大料架,送往{2}", agv.Name, place, SettingString.A6);
// Common.LogInfo(string.Format("{0} 在{1}已装载大料架,送往{2}", agv.Name, place, SettingString.A6));
// return true;
//}
}
}
......@@ -541,6 +530,7 @@ namespace AGVControl
return false;
}
/// <summary>
/// 检查AGV是否有负载
/// </summary>
......@@ -555,17 +545,25 @@ namespace AGVControl
agv.Place = doorName;
return Common.mir.Add_Mission_Fleet(agv, Common.agvMission[SettingString.Move + doorName]);
}
/// <summary>
/// 检查是否在4C风淋门内
/// </summary>
/// <param name="nodeName"></param>
/// <returns></returns>
public static bool CheckIsInAirDoor(string nodeName)
{
return SettingString.Lines_In_Air_Door.Split(',').Contains(nodeName);
}
/// <summary>
/// 检查当前任务是否结束
/// </summary>
/// <param name="taskName">任务名称</param>
/// <param name="taskGUID">任务GUID</param>
/// <returns></returns>
public static bool CheckTaskFinished(Agv_Info agv,string nodeName, string curTaskState)
public static bool CheckTaskFinished(Agv_Info agv, string nodeName, string curTaskState)
{
log.Debug(agv.Name + " 检查当前任务是否结束: " +SettingString.Move + nodeName + " " + curTaskState);
return Common.agvMission[SettingString.Move+nodeName].Equals(agv.CurTaskGUID) && curTaskState.Equals(SettingString.Done);
log.Debug(agv.Name + " 检查当前任务是否结束: " + SettingString.Move + nodeName + " " + curTaskState);
return Common.agvMission[SettingString.Move + nodeName].Equals(agv.CurTaskGUID) && curTaskState.Equals(SettingString.Done);
}
/// <summary>
/// 检查充电任务是否分配完成
......@@ -584,6 +582,7 @@ namespace AGVControl
}
//双层线工单信息
public static string doubleLine_WO = "";
public static string warnMsg = "";
/// <summary>
/// 查找空架任务
/// </summary>
......@@ -597,6 +596,8 @@ namespace AGVControl
nodeName = "";
if (!Common.CheckCanExecuteMission(agv))
return false;
///双层线出口检查
int idx = nodeInfo.FindIndex(s => s.Name.Equals(SettingString.A6)
&& (s.StateEquals(eNodeStatus.NeedEnterLeave) || (s.StateEquals(eNodeStatus.NeedLeave))) && !s.RFID.Equals(""));
if (idx > -1)
......@@ -610,14 +611,14 @@ namespace AGVControl
{
nodeName = FullShelfDestInfo.location;
Common.GetLineNameByNodeName(nodeName, out string line);
Common.LogInfo("A6出满料架的产线有空料架,优先处理 " + FullShelfDestInfo.ShowInfo(line));
Common.log.Debug("A6出满料架的产线有空料架,优先处理 " + FullShelfDestInfo.ShowInfo(line));
return true;
}
else if (FullShelfDestInfo.location.StartsWith(SettingString.D4_Name_Prefix) && !SettingString.C4_AGV_IPs.Contains(agv.IP))
{
nodeName = FullShelfDestInfo.location;
Common.GetLineNameByNodeName(nodeName, out string line);
Common.LogInfo("A6出满料架的产线有空料架,优先处理 " + FullShelfDestInfo.ShowInfo(line));
Common.log.Debug("A6出满料架的产线有空料架,优先处理 " + FullShelfDestInfo.ShowInfo(line));
return true;
}
......@@ -627,7 +628,7 @@ namespace AGVControl
{
if (FullShelfDestInfo != null)
{
Common.LogInfo("A6的出料信息不正确,请检查:" + FullShelfDestInfo.ShowInfo("ERROR"));
Common.log.Error("A6的出料信息不正确,请检查:" + FullShelfDestInfo.ShowInfo("ERROR"));
//return false;
}
}
......@@ -648,13 +649,13 @@ namespace AGVControl
if (loc.StartsWith(SettingString.C4_Name_Prefix) && SettingString.C4_AGV_IPs.Contains(agv.IP))
{
nodeName = loc;
Common.LogInfo("双层线正在出的工单目标产线有空料架,优先处4C-" + loc);
//Common.LogInfo("双层线正在出的工单目标产线有空料架,优先处4C-" + loc);
return true;
}
else if (loc.StartsWith(SettingString.D4_Name_Prefix) && !SettingString.C4_AGV_IPs.Contains(agv.IP))
{
nodeName = loc;
Common.LogInfo("双层线正在出的工单目标产线有空料架,优先处理4D-" + loc);
Common.log.Debug("双层线正在出的工单目标产线有空料架,优先处理4D-" + loc);
return true;
}
}
......@@ -668,8 +669,6 @@ namespace AGVControl
//双层线是否需要小料架
if (CheckA5A6State(agv, eShelfType.SmallShelf, out string lineNodeName))
{
//if (curPlace.Equals(""))//待机位
// {
//4C车间寻找
if (SettingString.C4_AGV_IPs.Contains(agv.IP))
......@@ -733,32 +732,32 @@ namespace AGVControl
}
}
else if (CheckA6State(agv, eShelfType.SmallShelf, out string lineNodeName1))
else if (CheckA6State(agv, eShelfType.BigShelf, out string lineNodeName1))
{
//4C车间寻找
//4C车间备料区寻找
if (SettingString.C4_AGV_IPs.Contains(agv.IP))
{
idx = nodeInfo.FindIndex(s => s.EmptyShelfCnt > 0 && s.Name.Equals(SettingString.C4FeederOut) && s.IsUse);
idx = nodeInfo.FindIndex(s => s.EmptyShelfCnt > 0 && s.Name.Equals(SettingString.C4FeederOut) && !s.RFID.StartsWith("0") && s.IsUse);
if (idx > -1)
{
int idx1 = agvInfo.FindIndex(s => s.CurJob is EnterLeaveShelfJob && ((EnterLeaveShelfJob)s.CurJob).LineName.Equals(SettingString.C4FeederOut));
if(idx1==-1)
if (idx1 == -1)
{
nodeName = nodeInfo[idx].Name;
Common.log.Debug(agv.Name + " 双层线需要小料架,准备去4C-" + nodeName);
Common.log.Debug(agv.Name + " 双层线右侧需要料架,准备去4C-" + nodeName);
return true;
}
}
}
//4D车间寻找
//4D车间备料区寻找
if (!SettingString.C4_AGV_IPs.Contains(agv.IP))
{
idx = nodeInfo.FindIndex(s => s.EmptyShelfCnt > 0 && s.Name.Equals(SettingString.D4FeederOut) && s.IsUse);
idx = nodeInfo.FindIndex(s => s.EmptyShelfCnt > 0 && s.Name.Equals(SettingString.D4FeederOut) && !s.RFID.StartsWith("0") && s.IsUse);
if (idx > -1)
{
nodeName = nodeInfo[idx].Name;
Common.log.Debug(agv.Name + " 双层线需要小料架,准备去4D-" + nodeName);
Common.log.Debug(agv.Name + " 双层线右侧需要料架,准备去4D-" + nodeName);
return true;
}
......@@ -847,6 +846,75 @@ namespace AGVControl
return false;
}
/// <summary>
/// 检查接驳台状态
/// </summary>
/// <returns></returns>
public static bool CheckStationState(ClientNode clientNode, out string rfid)
{
rfid = "";
if (!Common.missionManager.GetUnlockRfids(clientNode.Name).Contains(clientNode.RFID))
{
if (clientNode.Name.Equals(SettingString.C4FeederOut) || clientNode.Name.Equals(SettingString.D4FeederOut))
{
warnMsg = string.Format("[{1}]最外侧是料架[{0}],但没有解绑信息,请检查接驳台", clientNode.RFID, clientNode.Name);
Common.log.Debug(warnMsg);
}
else
{
string res = AGVManager.GetRFIDs(clientNode.Name);
warnMsg = string.Format("[{1}]最外侧是料架[{0}],但没有解绑信息,请检查接驳台:料架由里到外顺序:{2}", clientNode.RFID, clientNode.Name,res);
Common.log.Debug(warnMsg);
}
return false;
}
rfid = clientNode.RFID;
warnMsg = "";
return true;
}
/// <summary>
/// 上报接驳台状态
/// </summary>
/// <param name="clientNode"></param>
/// <returns>true:表示正常</returns>
public static bool UpdateStationState(ClientNode clientNode)
{
if (!Common.missionManager.GetUnlockRfids(clientNode.Name).Contains(clientNode.RFID))
{
if (clientNode.Name.Equals(SettingString.C4FeederOut) || clientNode.Name.Equals(SettingString.D4FeederOut))
{
clientNode.WarnMsg = string.Format("接驳台最外侧料架[{0}]没有解绑信息,请检查接驳台状况", clientNode.RFID);
return false;
}
else
{
string res = AGVManager.GetRFIDs(clientNode.Name);
clientNode.WarnMsg = string.Format("接驳台最外侧料架[{0}]没有解绑信息,当前料架由里到外顺序:{1}", clientNode.RFID, res);
return false;
}
}
clientNode.WarnMsg = "";
return true;
}
/// <summary>
/// 出料前检查接驳台状态
/// </summary>
/// <returns></returns>
public static bool CheckStationState(ClientNode clientNode)
{
if (Common.missionManager.GetUnlockCnt(clientNode.Name)>0)
{
// if (warnMsg.Equals(""))
{
warnMsg = string.Format("接驳台[{1}]有空料架未回收完,无法出满料,请检查接驳台RFID读取情况", clientNode.RFID, clientNode.Name);
Common.LogInfo(warnMsg);
}
return false;
}
return true;
}
/// <summary>
/// 计算当前小车距离最近的任务点(只针对产线)
/// </summary>
/// <param name="agv"></param>
......@@ -1053,122 +1121,24 @@ namespace AGVControl
//logTextBox.ScrollToCaret();
}
}
public static void ReadLinePlace()
{
if (!System.IO.File.Exists(CONFIG_PATH + "LinePlace.txt"))
{
File.Create(CONFIG_PATH + "LinePlace.txt");
return;
}
string[] s = System.IO.File.ReadAllLines(CONFIG_PATH + "LinePlace.txt");
for (int i = 0; i < s.Count(); i++)
{
string[] mission = s[i].Split(',');
if (mission.Length != 2)
continue;
//missionManager.missionList.Add(new MissionStru(mission[0], mission[1]));
missionManager.AddMission(new MissionStru(mission[0], mission[1]));
}
}
/// <summary>
/// 添加空料架解绑
/// 读取料架解绑信息
/// </summary>
/// <param name="nodeName"></param>
/// <returns></returns>
public static bool AddEmptyShelfTask(string nodeName)
public static void ReadUnlockLineInfo()
{
int idx = Common.nodeInfo.FindIndex(s => s.Name == nodeName);
if (idx > -1)
if (!System.IO.File.Exists(Common.CONFIG_PATH + "UnlockInfo.json"))
{
// Common.missionManager.missionList.Add(new MissionStru(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), nodeName));
Common.missionManager.AddMission(new MissionStru(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), nodeName));
Common.nodeInfo[idx].IncreEmptyShelfCnt(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
using (System.IO.StreamWriter file = new System.IO.StreamWriter(CONFIG_PATH + "LinePlace.txt"))
{
foreach (var item in Common.missionManager.missionList)
{
file.WriteLine(string.Format("{0},{1}", item.CreateTime, item.NodeName));
}
}
return true;
}
else
{
log.Error("AddLinePlace 失败 节点" + nodeName + "不存在");
return false;
}
}
/// <summary>
/// 删除空架任务
/// </summary>
/// <param name="nodeName"></param>
/// <returns></returns>
public static bool DelEmptyShelfTask(string nodeName)
{
int idx = Common.nodeInfo.FindIndex(s => s.Name == nodeName);
if (idx > -1)
{
Common.nodeInfo[idx].DecreEmptyShelfCnt();
idx = Common.missionManager.missionList.FindIndex(s => s.NodeName == nodeName);
if (idx > -1)
{
LogInfo("删除一个空料架任务:" + nodeName);
Common.missionManager.DelMission(idx);
//Common.missionManager.missionList.RemoveAt(idx);
using (System.IO.StreamWriter file = new System.IO.StreamWriter(CONFIG_PATH + "LinePlace.txt"))
{
foreach (var item in Common.missionManager.missionList)
{
file.WriteLine(string.Format("{0},{1}", item.CreateTime, item.NodeName));
}
}
return true;
}
log.Error("DelLinePlace 失败 节点任务" + nodeName + "不存在");
return false;
}
else
{
log.Error("DelLinePlace 失败 节点" + nodeName + "不存在");
return false;
File.Create(Common.CONFIG_PATH + "UnlockInfo.json");
missionManager = new UnlockMissionManager(nodeInfo);
return;
}
string s = File.ReadAllText(Common.CONFIG_PATH + "UnlockInfo.json");
missionManager = JsonHelper.DeserializeJsonToObject<UnlockMissionManager>(s);
if (missionManager == null)
missionManager = new UnlockMissionManager(nodeInfo);
missionManager.Init();
}
//public static void CheckAGVMissionState()
//{
// foreach (Agv_Info agv in agvInfo)
// {
// Thread.Sleep(50);
// bool rtn = Common.mir.Get_Register(agv, 20, out int regValue);
// if (rtn)
// {
// agv.GetPlace(regValue);
// Common.log.Debug(string.Format("软件开启:{0} Get_Register PLC{1}={2} Place={3} PlaceState={4}", agv.Name, 20, regValue, agv.Place, agv.PlaceState));
// if (!agv.Place.Equals(""))
// {
// int idx = nodeInfo.FindIndex(s => s.Name == agv.Place);
// if (idx > -1)
// {
// nodeInfo[idx].AgvName = agv.Name;
// }
// agv.TaskSend = "Move" + agv.Place;
// }
// }
// else
// {
// Common.log.Debug("CheckAGVMissionState 获取PLC20失败");
// }
// }
//}
public static void GetNodesPosition()
{
Agv_Info agv = agvInfo[0];
......@@ -1184,7 +1154,7 @@ namespace AGVControl
}
else
{
Common.log.Error(clientNode.Name+ " GetNodesPosition 获取节点位置失败");
Common.log.Error(clientNode.Name + " GetNodesPosition 获取节点位置失败");
}
}
}
......@@ -1244,7 +1214,7 @@ namespace AGVControl
StandbyStation.C4_Station2 = agv.Name;
Common.MoveToNode(agv, SettingString.C4_STANDBY2);
}
}
/// <summary>
/// 清除该小车在待机位的信息
......@@ -1452,63 +1422,5 @@ namespace AGVControl
public string C4_Station1;
public string C4_Station2;
}
/// <summary>
/// 任务信息结构
/// </summary>
public struct MissionStru
{
public string NodeName;
public string CreateTime;
/// <summary>
/// 任务结构
/// </summary>
/// <param name="dateTime">创建时间</param>
/// <param name="name">节点名称</param>
public MissionStru(string dateTime, string name)
{
NodeName = name;
CreateTime = dateTime;
}
}
/// <summary>
/// 任务管理
/// </summary>
public class MissionManager
{
public delegate void MissionChangedHandler();
public event MissionChangedHandler MissionChanged;
/// <summary>
/// 任务列表
/// </summary>
public List<MissionStru> missionList;
/// <summary>
/// 空料架解绑总数
/// </summary>
public Int32 EmptyMissionCount
{
get { return missionList.Count; }
}
public void AddMission(MissionStru missionStru)
{
missionList.Add(missionStru);
MissionChanged?.Invoke();
}
public void DelMission(int idx)
{
if (idx == -1)
return;
Common.missionManager.missionList.RemoveAt(idx);
MissionChanged?.Invoke();
}
public MissionManager()
{
missionList = new List<MissionStru>();
}
}
}
\ No newline at end of file
......@@ -7,24 +7,25 @@ using System.Threading;
using System.Threading.Tasks;
using System.Web.Script.Serialization;
using AGVControl;
using BLL;
using log4net.Util;
using RestSharp;
namespace BLL
namespace AGVControl.BLL
{
public class Control
{
//private int areaC_Index;
private System.Timers.Timer AgvCallTimer;
private System.Timers.Timer AgvStateTimer;
private System.Timers.Timer NodeStateTimer;
//public List<string> Marks;
private const int REG_STATUS = 20;
//private List<string> shelfLockedNodeNames;
public delegate void AgvChangedEvent(int agvIndex);
public delegate void AgvMissionEvent();
public event AgvChangedEvent AgvChanged;
public event AgvChangedEvent AgvOnline;
public event AgvChangedEvent NodeChangedEvent;
public Control()
{
AgvCallTimer = new System.Timers.Timer
......@@ -37,11 +38,18 @@ namespace BLL
AgvStateTimer = new System.Timers.Timer
{
Interval = 1500,
Interval = 3000,
AutoReset = true,
Enabled = false
};
AgvStateTimer.Elapsed += AgvStateTimer_Elapsed;
NodeStateTimer = new System.Timers.Timer
{
Interval = 5000,
AutoReset = true,
Enabled = false
};
NodeStateTimer.Elapsed += NodeStateTimer_Elapsed;
}
......@@ -49,42 +57,93 @@ namespace BLL
{
AgvCallTimer.Enabled = true;
AgvStateTimer.Enabled = true;
NodeStateTimer.Enabled = true;
AgvCallTimer.Start();
AgvStateTimer.Start();
NodeStateTimer.Start();
}
public void Stop()
{
AgvCallTimer.Enabled = false;
AgvStateTimer.Enabled = false;
NodeStateTimer.Enabled = false;
AgvCallTimer.Stop();
AgvStateTimer.Stop();
NodeStateTimer.Stop();
}
private bool NodeStateInProcess = false;
private void NodeStateTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (NodeStateInProcess) return;
NodeStateInProcess = true;
List<AlarmMsg> msglist = new List<AlarmMsg>();
try
{
String tmp = "";
for (int j = 0; j < Common.nodeInfo.Count; j++)
{
bool isAlarm = false;
if (!Common.UpdateStationState(Common.nodeInfo[j]))
{
isAlarm = true;
msglist.Add(new AlarmMsg(Common.nodeInfo[j].AliceName, "lineAgv." + Common.nodeInfo[j].Name + ".WarnMsg", Common.nodeInfo[j].WarnMsg));
}
if (!isAlarm && !Common.nodeInfo[j].Online)
{
msglist.Add(new AlarmMsg(Common.nodeInfo[j].AliceName, "lineAgv." + Common.nodeInfo[j].Name + ".OffLine", "离线"));
}
if (Common.nodeInfo[j].Name.StartsWith(SettingString.D4_Name_Prefix) || Common.nodeInfo[j].Name.StartsWith(SettingString.C4_Name_Prefix))
{
if (!Common.nodeInfo[j].Name.Equals(SettingString.C4FeederIn) && !Common.nodeInfo[j].Name.Equals(SettingString.C4FeederOut) &&
!Common.nodeInfo[j].Name.Equals(SettingString.D4FeederIn) && !Common.nodeInfo[j].Name.Equals(SettingString.D4FeederOut))
{
tmp = AGVManager.GetFirstRFID(Common.nodeInfo[j].Name);
if (!tmp.Equals(Common.nodeInfo[j].RFID))
{
Common.nodeInfo[j].RFID = tmp;
NodeChangedEvent?.Invoke(j);
}
}
if (Common.nodeInfo[j].Name.Equals(SettingString.C4FeederOut) || Common.nodeInfo[j].Name.Equals(SettingString.D4FeederOut))
{
if (Common.missionManager.GetUnlockCnt(Common.nodeInfo[j].Name) > 0)
{
tmp = Common.missionManager.GetUnlockRfids(Common.nodeInfo[j].Name)[0];
if (!tmp.Equals(Common.nodeInfo[j].RFID))
{
Common.nodeInfo[j].RFID = tmp;
NodeChangedEvent?.Invoke(j);
}
}
}
}
}
AGVManager.updateDeviceAlarmMsg(msglist);
}
catch(Exception ex)
{
Common.log.Error("NodeStateTimer " + ex.Message + ex.StackTrace);
}
NodeStateInProcess = false;
}
private bool AgvStateInProcess = false;
private eAGVState preAGVState = eAGVState.None;
//private eAGVState preAGVState = eAGVState.None;
private void AgvStateTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
bool rtn;
if (AgvStateInProcess) return;
AgvStateInProcess = true;
List<AlarmMsg> msglist = new List<AlarmMsg>();
for (int j = 0; j < Common.nodeInfo.Count; j++)
{
if (!Common.nodeInfo[j].Online)
{
msglist.Add(new AlarmMsg(Common.nodeInfo[j].AliceName, "lineAgv." + Common.nodeInfo[j].Name + ".OffLine", "离线"));
}
}
BLL.AGVManager.updateDeviceAlarmMsg(msglist);
for (int i = 0; i < Common.agvInfo.Count; i++)
{
//上报异常
bool isAlarm = false;
if (msglist.Count > 0)
msglist.Clear();
//if (msglist.Count > 0)
// msglist.Clear();
try
{
if (!CheckOnline(i)) continue;
......@@ -96,30 +155,24 @@ namespace BLL
Thread.Sleep(50);
if (rtn) change = Common.agvInfo[i].SetState(stateID, stateStr, battery, mission_text, position);
//更新状态stateID.Equals(eAGVState.Executing)
if (change)
// if (change)
{
AgvChanged?.Invoke(i);
}
Common.log.Debug("获取AGV状态");
Thread.Sleep(50);
rtn = Common.mir.Get_IO_Status(Common.agvInfo[i], out bool[] input, out bool[] output);
Common.log.Debug("获取IO状态");
preAGVState = Common.agvInfo[i].StateID;
if (Common.agvInfo[i].StandTimeOut)
if (stateText.Equals("Error") || stateText.Equals("EmergencyStop") || stateText.Equals("Pause"))
{
isAlarm = true;
msglist.Add(new AlarmMsg(Common.agvInfo[i].Name, "lineAgv." + Common.agvInfo[i].Name + ".StandTimeOut", "在" + Common.agvInfo[i].PlaceAliceName + "停留超时" + (DateTime.Now - Common.agvInfo[i].StandStartTime).TotalMinutes.ToString("f2") + "分钟"));
msglist.Add(new AlarmMsg(Common.agvInfo[i].Name, "lineAgv." + Common.agvInfo[i].Name + ".Error.EmergencyStop", "agv状态:" + stateText + ""));
}
if (stateText.Equals("Error") || stateText.Equals("EmergencyStop") || stateText.Equals("Pause"))
if (!isAlarm && Common.agvInfo[i].StandTimeOut)
{
isAlarm = true;
msglist.Add(new AlarmMsg(Common.agvInfo[i].Name, "lineAgv." + Common.agvInfo[i].Name + ".Error.EmergencyStop", "agv状态:" + stateText + ""));
msglist.Add(new AlarmMsg(Common.agvInfo[i].Name, "lineAgv." + Common.agvInfo[i].Name + ".StandTimeOut", "在" + Common.agvInfo[i].PlaceAliceName + "停留超时" + (DateTime.Now - Common.agvInfo[i].StandStartTime).TotalMinutes.ToString("f2") + "分钟"));
}
if (!isAlarm)
{
try
......@@ -139,7 +192,7 @@ namespace BLL
Common.log.Error(Common.agvInfo[i].Name + "上报小车运行步骤失败" + ex.Message + ex.StackTrace);
}
}
BLL.AGVManager.updateDeviceAlarmMsg(msglist);
AGVManager.updateDeviceAlarmMsg(msglist);
}
catch (Exception ex)
{
......@@ -147,7 +200,6 @@ namespace BLL
}
}
AgvStateInProcess = false;
}
......
......@@ -4,7 +4,7 @@ using System;
using System.Collections.Generic;
using System.IO;
namespace BLL
namespace AGVControl
{
/// <summary>
/// Json帮助类
......
......@@ -20,7 +20,7 @@ namespace BLL
//?emptyStation={line}
[OperationContract]
[WebInvoke(UriTemplate = "CreateEmptyRecycleTask?emptyStation={line}&rfid={RFID}", Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Xml)]
string CreateEmptyRecycleTaskGET(string line,string RFID="");
string CreateEmptyRecycleTaskGET(string line, string RFID = "");
}
......@@ -70,38 +70,35 @@ namespace BLL
}
if (Common.GetNodeNameByLineName(emptyStation, out string value))
{
if (!Common.AddEmptyShelfTask(value))
if (rfid == null)
{
Common.log.Error("CreateEmptyRecycleTask(POST) 节点[" + value + "]不存在");
res = new Result() { Succeed = false, ResultData = null, ErrorMessage = "CreateEmptyRecycleTask failed: " + emptyStation };
res = new Result() { Succeed = false, ResultData = null, ErrorMessage = "rfid=null" };
Log.Error(string.Format("Unlock Request(POST) Failed [emptyStation={0},rfid=null]", emptyStation));
}
else
{
if (rfid == null)
res = new Result() { Succeed = true, ResultData = rfid, ErrorMessage = "" };
Log.Info(string.Format("Unlock Request(POST) [emptyStation={0},rfid={1}]", emptyStation, rfid.ToUpper()));
if (!Common.missionManager.AddMission(value, rfid.ToUpper()))
{
res = new Result() { Succeed = true, ResultData = null, ErrorMessage = "" };
Log.Info(string.Format("WebService Request(POST) emptyStation={0},rfid=null", emptyStation));
Common.LogInfo("任务[POST]:" + value + " 出空料架 [" + emptyStation + "]");
Common.log.Error("CreateEmptyRecycleTask(POST) 节点[" + value + "]不存在");
res = new Result() { Succeed = false, ResultData = null, ErrorMessage = "CreateEmptyRecycleTask failed: " + emptyStation + " rfid=" + rfid };
}
else
{
res = new Result() { Succeed = true, ResultData = rfid, ErrorMessage = "" };
Log.Info(string.Format("WebService Request(POST) emptyStation={0},rfid={1}", emptyStation, rfid));
Common.LogInfo("任务[POST]:" + value + " 出空料架 [location=" + emptyStation + ",rfid=" + rfid + "]");
}
Common.LogInfo("任务[POST]:" + value + " 出空料架 [location=" + emptyStation + ",rfid=" + rfid.ToUpper() + "]");
}
// AGVControl.Common.log.Debug("WebService POST Response OK");
// AGVControl.Common.log.Debug("WebService POST Response OK");
}
else
{
res = new Result() { Succeed = false, ResultData = null, ErrorMessage = "Not find " + emptyStation };
AGVControl.Common.log.Error("WebService POST Response false " + "Not find " + emptyStation);
AGVControl.Common.log.Error("Unlock POST Response false " + "Not find " + emptyStation);
}
}
return JsonHelper.SerializeObject(res);
}
public string CreateEmptyRecycleTaskGET(string line,string RFID)
public string CreateEmptyRecycleTaskGET(string line, string RFID)
{
Result res;
if (line.Equals("Feeder"))
......@@ -115,7 +112,7 @@ namespace BLL
if (Common.GetNodeNameByLineName(line, out string value))
{
if (!Common.AddEmptyShelfTask(value))
if (!Common.missionManager.AddMission(value,RFID.ToUpper()))
{
Common.log.Error("CreateEmptyRecycleTask 节点[" + value + "]不存在");
res = new Result() { Succeed = false, ResultData = null, ErrorMessage = "CreateEmptyRecycleTask failed: " + line };
......@@ -123,14 +120,14 @@ namespace BLL
else
{
res = new Result() { Succeed = true, ResultData = RFID, ErrorMessage = "" };
Log.Info(string.Format("WebService Request(GET) emptyStation={0},rfid={1}", line, RFID));
Common.LogInfo("任务[GET]:" + value + " 出空料架 [emptyStation=" + line + ",rfid="+RFID+"]");
Log.Info(string.Format("Unlock Request(GET) [emptyStation={0},rfid={1}]", line, RFID.ToUpper()));
Common.LogInfo("任务[GET]:" + value + " 出空料架 [emptyStation=" + line + ",rfid=" + RFID.ToUpper() + "]");
}
}
else
{
res = new Result() { Succeed = false, ResultData = null, ErrorMessage = "Not find " + line };
AGVControl.Common.LogInfo("WebService GET Response false " + "Not find " + line);
AGVControl.Common.LogInfo("Unlock GET Response false " + "Not find " + line);
}
//Log.Info(string.Format("WebService GET Request emptyStation={0},rfid={1}", line, RFID));
return JsonHelper.SerializeObject(res);
......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AGVControl.BLL
{
/// <summary>
/// 接驳台RFID管理
/// </summary>
public class StationRFIDManager
{
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AGVControl
{
/// <summary>
///解绑料架任务管理
/// </summary>
public class UnlockMissionManager
{
public delegate void MissionChangedHandler(Dictionary<string, UnlockInfo> pairs);
public event MissionChangedHandler MissionChanged;
/// <summary>
/// 任务列表
/// </summary>
public Dictionary<string, UnlockedShelf> NodeUnlockMissions { get; private set; }
Dictionary<string, UnlockInfo> UnlockMissions;
public UnlockMissionManager(List<ClientNode> clientNodes)
{
NodeUnlockMissions = new Dictionary<string, UnlockedShelf>();
UnlockMissions = new Dictionary<string, UnlockInfo>();
foreach (ClientNode item in clientNodes)
{
if (item.Name.StartsWith("A") || item.Name.Equals(SettingString.D4FeederIn) || item.Name.Equals(SettingString.C4FeederIn))
continue;
NodeUnlockMissions.Add(item.Name, new UnlockedShelf());
UnlockMissions = new Dictionary<string, UnlockInfo>();
}
}
public UnlockMissionManager()
{
NodeUnlockMissions = new Dictionary<string, UnlockedShelf>();
UnlockMissions = new Dictionary<string, UnlockInfo>();
}
public void Init()
{
foreach (var item in NodeUnlockMissions.Keys)
{
UnlockMissions.Add(item, new UnlockInfo(item, NodeUnlockMissions[item].EmptyCnt, NodeUnlockMissions[item].GetRfidWithTime()));
}
MissionChanged?.Invoke(UnlockMissions);
}
public UnlockedShelf GetUnlockInfo(string nodeName)
{
if (NodeUnlockMissions.ContainsKey(nodeName))
{
return NodeUnlockMissions[nodeName];
}
return null;
}
public int GetUnlockCnt(string nodeName)
{
if (NodeUnlockMissions.ContainsKey(nodeName))
{
return NodeUnlockMissions[nodeName].EmptyCnt;
}
return -1;
}
public List<string> GetUnlockRfids(string nodeName)
{
if (NodeUnlockMissions.ContainsKey(nodeName))
{
return NodeUnlockMissions[nodeName].GetRfids();
}
return new List<string>();
}
public bool AddMission(string nodeName, string rfid)
{
bool rtn = NodeUnlockMissions[nodeName].Add(rfid);
if (rtn)
{
UnlockMissions[nodeName] = new UnlockInfo(nodeName, NodeUnlockMissions[nodeName].EmptyCnt, NodeUnlockMissions[nodeName].GetRfidWithTime());
WriteUnlockLineInfo();
Common.WriteIni(nodeName, SettingString.EmptyShelfCnt, NodeUnlockMissions[nodeName].EmptyCnt.ToString());
Common.LogInfo(string.Format("{0}解绑任务添加成功:RFID={1}", nodeName, rfid));
MissionChanged?.Invoke(UnlockMissions);
}
else
Common.LogInfo(string.Format("{0}解绑任务添加失败:RFID={1}", nodeName, rfid));
return rtn;
}
public bool DelMission(string nodeName, string rfid)
{
bool rtn = NodeUnlockMissions[nodeName].Delete(rfid);
if (rtn)
{
UnlockMissions[nodeName] = new UnlockInfo(nodeName, NodeUnlockMissions[nodeName].EmptyCnt, NodeUnlockMissions[nodeName].GetRfidWithTime());
WriteUnlockLineInfo();
Common.WriteIni(nodeName, SettingString.EmptyShelfCnt, NodeUnlockMissions[nodeName].EmptyCnt.ToString());
Common.LogInfo(string.Format("{0}解绑任务删除成功:RFID={1}", nodeName, rfid));
MissionChanged?.Invoke(UnlockMissions);
}
else
Common.LogInfo(string.Format("{0}解绑任务删除失败:RFID={1}", nodeName, rfid));
return rtn;
}
/// <summary>
/// 保存料架解绑信息
/// </summary>
void WriteUnlockLineInfo()
{
using (System.IO.StreamWriter file = new System.IO.StreamWriter(Common.CONFIG_PATH + "UnlockInfo.json"))
{
string s = JsonHelper.SerializeObject(this);
file.WriteLine(s);
}
}
}
public class UnlockInfo
{
public string Line { get; set; }
public int Count { get; set; }
public string RFID { get; set; }
public List<UnlockRfid> UnlockRfids { get; private set; }
public UnlockInfo(string nodeName, int count, Dictionary<string, string> rfids)
{
if (Common.GetLineNameByNodeName(nodeName, out string line))
{
Line = line;
}
else
{
Line = nodeName;
}
Count = count;
RFID = string.Join(",", rfids.Keys);
UnlockRfids = new List<UnlockRfid>();
foreach (var item in rfids.Keys)
{
UnlockRfids.Add(new UnlockRfid(nodeName, rfids[item], item));
}
}
}
public class UnlockRfid
{
public String Line { get; set; }
public string RFID { get; set; }
public string Time { get; set; }
public UnlockRfid(string line, string time, string rfid)
{
Time = time;
RFID = rfid;
Line = line;
}
}
}
......@@ -28,11 +28,19 @@
/// </summary>
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(FrmMain));
this.DgvAgv = new System.Windows.Forms.DataGridView();
this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column2 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column4 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column14 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column21 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column3 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column18 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column23 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column13 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column19 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column11 = new System.Windows.Forms.DataGridViewButtonColumn();
this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel();
this.tabControl1 = new System.Windows.Forms.TabControl();
this.tabPage1 = new System.Windows.Forms.TabPage();
......@@ -53,26 +61,33 @@
this.groupBox3 = new System.Windows.Forms.GroupBox();
this.lblWO = new System.Windows.Forms.Label();
this.tableLayoutPanel7 = new System.Windows.Forms.TableLayoutPanel();
this.groupBox4 = new System.Windows.Forms.GroupBox();
this.dgvLineMission = new System.Windows.Forms.DataGridView();
this.Column24 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column8 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.lblWarn = new System.Windows.Forms.Label();
this.grpUnlock = new System.Windows.Forms.GroupBox();
this.tblLayoutUnlock = new System.Windows.Forms.TableLayoutPanel();
this.dgvUnlockDetail = new System.Windows.Forms.DataGridView();
this.dgvUnlockInfo = new System.Windows.Forms.DataGridView();
this.tabPage2 = new System.Windows.Forms.TabPage();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.groupBox8 = new System.Windows.Forms.GroupBox();
this.lblStandy2 = new System.Windows.Forms.Label();
this.lblStandy1 = new System.Windows.Forms.Label();
this.lblCharge4 = new System.Windows.Forms.Label();
this.lblCharge3 = new System.Windows.Forms.Label();
this.tabPage2 = new System.Windows.Forms.TabPage();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.TxtLog = new System.Windows.Forms.TextBox();
this.tabPage3 = new System.Windows.Forms.TabPage();
this.groupBox7 = new System.Windows.Forms.GroupBox();
this.groupBox4 = new System.Windows.Forms.GroupBox();
this.btnClearStationRFID = new System.Windows.Forms.Button();
this.label11 = new System.Windows.Forms.Label();
this.txtBoxLineName = new System.Windows.Forms.TextBox();
this.btnUpdateStatus = new System.Windows.Forms.Button();
this.btnGetStationRfid = new System.Windows.Forms.Button();
this.label8 = new System.Windows.Forms.Label();
this.label7 = new System.Windows.Forms.Label();
this.btnUpdateStatus = new System.Windows.Forms.Button();
this.txtBoxRFID = new System.Windows.Forms.TextBox();
this.groupBox6 = new System.Windows.Forms.GroupBox();
this.label10 = new System.Windows.Forms.Label();
this.label9 = new System.Windows.Forms.Label();
this.txtRfid = new System.Windows.Forms.TextBox();
this.btnDeleteMission = new System.Windows.Forms.Button();
this.btnAddMission = new System.Windows.Forms.Button();
this.cmbBoxLineName = new System.Windows.Forms.ComboBox();
......@@ -91,17 +106,9 @@
this.label3 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column2 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column4 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column14 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column21 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column3 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column18 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column23 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column13 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column19 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column11 = new System.Windows.Forms.DataGridViewButtonColumn();
this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker();
this.agvRemoveRfid = new System.Windows.Forms.Button();
this.label12 = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.DgvAgv)).BeginInit();
this.tableLayoutPanel3.SuspendLayout();
this.tabControl1.SuspendLayout();
......@@ -113,13 +120,15 @@
this.groupBox5.SuspendLayout();
this.groupBox3.SuspendLayout();
this.tableLayoutPanel7.SuspendLayout();
this.groupBox4.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.dgvLineMission)).BeginInit();
this.groupBox8.SuspendLayout();
this.grpUnlock.SuspendLayout();
this.tblLayoutUnlock.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.dgvUnlockDetail)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.dgvUnlockInfo)).BeginInit();
this.tabPage2.SuspendLayout();
this.tableLayoutPanel1.SuspendLayout();
this.groupBox8.SuspendLayout();
this.tabPage3.SuspendLayout();
this.groupBox7.SuspendLayout();
this.groupBox4.SuspendLayout();
this.groupBox6.SuspendLayout();
this.groupBox2.SuspendLayout();
this.tableLayoutPanel4.SuspendLayout();
......@@ -157,9 +166,97 @@
this.DgvAgv.RowHeadersVisible = false;
this.DgvAgv.RowHeadersWidth = 51;
this.DgvAgv.RowTemplate.Height = 23;
this.DgvAgv.Size = new System.Drawing.Size(1061, 125);
this.DgvAgv.Size = new System.Drawing.Size(1105, 141);
this.DgvAgv.TabIndex = 3;
this.DgvAgv.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.DgvAgv_CellClick);
this.DgvAgv.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.DgvAgv_CellContentClick);
//
// Column1
//
this.Column1.HeaderText = "名称";
this.Column1.MinimumWidth = 6;
this.Column1.Name = "Column1";
this.Column1.ReadOnly = true;
this.Column1.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column2
//
this.Column2.HeaderText = "IP";
this.Column2.MinimumWidth = 6;
this.Column2.Name = "Column2";
this.Column2.ReadOnly = true;
this.Column2.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column4
//
this.Column4.HeaderText = "小车状态";
this.Column4.MinimumWidth = 6;
this.Column4.Name = "Column4";
this.Column4.ReadOnly = true;
this.Column4.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column14
//
this.Column14.HeaderText = "任务ID";
this.Column14.MinimumWidth = 6;
this.Column14.Name = "Column14";
this.Column14.ReadOnly = true;
this.Column14.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column21
//
this.Column21.HeaderText = "任务名称";
this.Column21.MinimumWidth = 6;
this.Column21.Name = "Column21";
this.Column21.ReadOnly = true;
this.Column21.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column3
//
this.Column3.HeaderText = "任务状态";
this.Column3.MinimumWidth = 6;
this.Column3.Name = "Column3";
this.Column3.ReadOnly = true;
this.Column3.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column18
//
this.Column18.HeaderText = "目的地";
this.Column18.MinimumWidth = 6;
this.Column18.Name = "Column18";
this.Column18.ReadOnly = true;
this.Column18.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column23
//
this.Column23.HeaderText = "负载";
this.Column23.MinimumWidth = 6;
this.Column23.Name = "Column23";
this.Column23.ReadOnly = true;
this.Column23.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column13
//
this.Column13.HeaderText = "连接";
this.Column13.MinimumWidth = 6;
this.Column13.Name = "Column13";
this.Column13.ReadOnly = true;
this.Column13.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column19
//
this.Column19.HeaderText = "电量";
this.Column19.MinimumWidth = 6;
this.Column19.Name = "Column19";
this.Column19.ReadOnly = true;
this.Column19.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column11
//
this.Column11.HeaderText = "自动";
this.Column11.MinimumWidth = 6;
this.Column11.Name = "Column11";
this.Column11.ReadOnly = true;
//
// tableLayoutPanel3
//
......@@ -170,13 +267,13 @@
this.tableLayoutPanel3.Controls.Add(this.tableLayoutPanel4, 0, 1);
this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel3.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel3.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.tableLayoutPanel3.Margin = new System.Windows.Forms.Padding(2);
this.tableLayoutPanel3.Name = "tableLayoutPanel3";
this.tableLayoutPanel3.RowCount = 3;
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 30F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel3.Size = new System.Drawing.Size(1067, 656);
this.tableLayoutPanel3.Size = new System.Drawing.Size(1111, 735);
this.tableLayoutPanel3.TabIndex = 7;
//
// tabControl1
......@@ -185,10 +282,10 @@
this.tabControl1.Controls.Add(this.tabPage2);
this.tabControl1.Controls.Add(this.tabPage3);
this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tabControl1.Location = new System.Drawing.Point(3, 330);
this.tabControl1.Location = new System.Drawing.Point(3, 370);
this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0;
this.tabControl1.Size = new System.Drawing.Size(1061, 323);
this.tabControl1.Size = new System.Drawing.Size(1105, 362);
this.tabControl1.TabIndex = 7;
//
// tabPage1
......@@ -196,8 +293,8 @@
this.tabPage1.Controls.Add(this.tableLayoutPanel2);
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(1053, 297);
this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
this.tabPage1.Size = new System.Drawing.Size(1097, 336);
this.tabPage1.TabIndex = 0;
this.tabPage1.Text = "节点状态&产线任务";
this.tabPage1.UseVisualStyleBackColor = true;
......@@ -211,11 +308,11 @@
this.tableLayoutPanel2.Controls.Add(this.groupBox1, 1, 0);
this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel2.Location = new System.Drawing.Point(3, 3);
this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(2);
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
this.tableLayoutPanel2.RowCount = 1;
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel2.Size = new System.Drawing.Size(1047, 291);
this.tableLayoutPanel2.Size = new System.Drawing.Size(1091, 330);
this.tableLayoutPanel2.TabIndex = 34;
//
// DgvNode
......@@ -247,7 +344,7 @@
this.DgvNode.RowHeadersVisible = false;
this.DgvNode.RowHeadersWidth = 50;
this.DgvNode.RowTemplate.Height = 23;
this.DgvNode.Size = new System.Drawing.Size(584, 285);
this.DgvNode.Size = new System.Drawing.Size(609, 324);
this.DgvNode.TabIndex = 1;
this.DgvNode.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.DgvNode_CellClick);
//
......@@ -326,11 +423,11 @@
this.groupBox1.Controls.Add(this.tableLayoutPanel5);
this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox1.Font = new System.Drawing.Font("宋体", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.groupBox1.Location = new System.Drawing.Point(592, 2);
this.groupBox1.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.groupBox1.Location = new System.Drawing.Point(617, 2);
this.groupBox1.Margin = new System.Windows.Forms.Padding(2);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Padding = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.groupBox1.Size = new System.Drawing.Size(453, 287);
this.groupBox1.Padding = new System.Windows.Forms.Padding(2);
this.groupBox1.Size = new System.Drawing.Size(472, 326);
this.groupBox1.TabIndex = 33;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "任务信息";
......@@ -342,26 +439,28 @@
this.tableLayoutPanel5.Controls.Add(this.groupBox5, 0, 1);
this.tableLayoutPanel5.Controls.Add(this.groupBox3, 0, 0);
this.tableLayoutPanel5.Controls.Add(this.tableLayoutPanel7, 0, 2);
this.tableLayoutPanel5.Controls.Add(this.grpUnlock, 0, 3);
this.tableLayoutPanel5.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel5.Location = new System.Drawing.Point(2, 19);
this.tableLayoutPanel5.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.tableLayoutPanel5.Margin = new System.Windows.Forms.Padding(2);
this.tableLayoutPanel5.Name = "tableLayoutPanel5";
this.tableLayoutPanel5.RowCount = 3;
this.tableLayoutPanel5.RowCount = 4;
this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 15F));
this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 15F));
this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 15F));
this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 70F));
this.tableLayoutPanel5.Size = new System.Drawing.Size(449, 266);
this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 55F));
this.tableLayoutPanel5.Size = new System.Drawing.Size(468, 305);
this.tableLayoutPanel5.TabIndex = 2;
//
// groupBox5
//
this.groupBox5.Controls.Add(this.lblDestInfo);
this.groupBox5.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox5.Location = new System.Drawing.Point(2, 41);
this.groupBox5.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.groupBox5.Location = new System.Drawing.Point(2, 47);
this.groupBox5.Margin = new System.Windows.Forms.Padding(2);
this.groupBox5.Name = "groupBox5";
this.groupBox5.Padding = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.groupBox5.Size = new System.Drawing.Size(445, 35);
this.groupBox5.Padding = new System.Windows.Forms.Padding(2);
this.groupBox5.Size = new System.Drawing.Size(464, 41);
this.groupBox5.TabIndex = 2;
this.groupBox5.TabStop = false;
this.groupBox5.Text = "出料信息";
......@@ -373,7 +472,7 @@
this.lblDestInfo.Location = new System.Drawing.Point(2, 19);
this.lblDestInfo.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.lblDestInfo.Name = "lblDestInfo";
this.lblDestInfo.Size = new System.Drawing.Size(441, 14);
this.lblDestInfo.Size = new System.Drawing.Size(460, 20);
this.lblDestInfo.TabIndex = 40;
this.lblDestInfo.Text = "lblDestInfo";
//
......@@ -382,10 +481,10 @@
this.groupBox3.Controls.Add(this.lblWO);
this.groupBox3.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox3.Location = new System.Drawing.Point(2, 2);
this.groupBox3.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.groupBox3.Margin = new System.Windows.Forms.Padding(2);
this.groupBox3.Name = "groupBox3";
this.groupBox3.Padding = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.groupBox3.Size = new System.Drawing.Size(445, 35);
this.groupBox3.Padding = new System.Windows.Forms.Padding(2);
this.groupBox3.Size = new System.Drawing.Size(464, 41);
this.groupBox3.TabIndex = 0;
this.groupBox3.TabStop = false;
this.groupBox3.Text = "双层线工单信息";
......@@ -397,95 +496,120 @@
this.lblWO.Location = new System.Drawing.Point(2, 19);
this.lblWO.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.lblWO.Name = "lblWO";
this.lblWO.Size = new System.Drawing.Size(441, 14);
this.lblWO.Size = new System.Drawing.Size(460, 20);
this.lblWO.TabIndex = 40;
this.lblWO.Text = "lblWO";
//
// tableLayoutPanel7
//
this.tableLayoutPanel7.ColumnCount = 2;
this.tableLayoutPanel7.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 56.58784F));
this.tableLayoutPanel7.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 43.41216F));
this.tableLayoutPanel7.Controls.Add(this.groupBox4, 0, 0);
this.tableLayoutPanel7.Controls.Add(this.groupBox8, 1, 0);
this.tableLayoutPanel7.ColumnCount = 1;
this.tableLayoutPanel7.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel7.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel7.Controls.Add(this.lblWarn, 0, 0);
this.tableLayoutPanel7.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel7.Location = new System.Drawing.Point(2, 80);
this.tableLayoutPanel7.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.tableLayoutPanel7.Location = new System.Drawing.Point(2, 92);
this.tableLayoutPanel7.Margin = new System.Windows.Forms.Padding(2);
this.tableLayoutPanel7.Name = "tableLayoutPanel7";
this.tableLayoutPanel7.RowCount = 1;
this.tableLayoutPanel7.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel7.Size = new System.Drawing.Size(445, 184);
this.tableLayoutPanel7.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel7.Size = new System.Drawing.Size(464, 41);
this.tableLayoutPanel7.TabIndex = 3;
//
// groupBox4
// lblWarn
//
this.lblWarn.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblWarn.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.lblWarn.ForeColor = System.Drawing.Color.Red;
this.lblWarn.Location = new System.Drawing.Point(2, 0);
this.lblWarn.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.lblWarn.Name = "lblWarn";
this.lblWarn.Size = new System.Drawing.Size(460, 41);
this.lblWarn.TabIndex = 41;
this.lblWarn.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// grpUnlock
//
this.grpUnlock.Controls.Add(this.tblLayoutUnlock);
this.grpUnlock.Dock = System.Windows.Forms.DockStyle.Fill;
this.grpUnlock.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.grpUnlock.Location = new System.Drawing.Point(3, 138);
this.grpUnlock.Name = "grpUnlock";
this.grpUnlock.Size = new System.Drawing.Size(462, 164);
this.grpUnlock.TabIndex = 4;
this.grpUnlock.TabStop = false;
this.grpUnlock.Text = "解绑信息";
//
// tblLayoutUnlock
//
this.tblLayoutUnlock.AutoSize = true;
this.tblLayoutUnlock.ColumnCount = 2;
this.tblLayoutUnlock.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tblLayoutUnlock.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tblLayoutUnlock.Controls.Add(this.dgvUnlockDetail, 1, 0);
this.tblLayoutUnlock.Controls.Add(this.dgvUnlockInfo, 0, 0);
this.tblLayoutUnlock.Dock = System.Windows.Forms.DockStyle.Fill;
this.tblLayoutUnlock.Location = new System.Drawing.Point(3, 19);
this.tblLayoutUnlock.Name = "tblLayoutUnlock";
this.tblLayoutUnlock.RowCount = 1;
this.tblLayoutUnlock.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tblLayoutUnlock.Size = new System.Drawing.Size(456, 142);
this.tblLayoutUnlock.TabIndex = 1;
//
// dgvUnlockDetail
//
this.dgvUnlockDetail.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells;
this.dgvUnlockDetail.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells;
this.dgvUnlockDetail.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dgvUnlockDetail.Dock = System.Windows.Forms.DockStyle.Fill;
this.dgvUnlockDetail.Location = new System.Drawing.Point(231, 3);
this.dgvUnlockDetail.Name = "dgvUnlockDetail";
this.dgvUnlockDetail.ReadOnly = true;
this.dgvUnlockDetail.RowHeadersVisible = false;
this.dgvUnlockDetail.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
this.dgvUnlockDetail.RowTemplate.Height = 23;
this.dgvUnlockDetail.Size = new System.Drawing.Size(222, 136);
this.dgvUnlockDetail.TabIndex = 1;
//
// dgvUnlockInfo
//
this.dgvUnlockInfo.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells;
this.dgvUnlockInfo.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells;
this.dgvUnlockInfo.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dgvUnlockInfo.Dock = System.Windows.Forms.DockStyle.Fill;
this.dgvUnlockInfo.Location = new System.Drawing.Point(3, 3);
this.dgvUnlockInfo.Name = "dgvUnlockInfo";
this.dgvUnlockInfo.ReadOnly = true;
this.dgvUnlockInfo.RowHeadersVisible = false;
this.dgvUnlockInfo.RowTemplate.Height = 23;
this.dgvUnlockInfo.Size = new System.Drawing.Size(222, 136);
this.dgvUnlockInfo.TabIndex = 0;
//
this.groupBox4.Controls.Add(this.dgvLineMission);
this.groupBox4.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox4.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.groupBox4.Location = new System.Drawing.Point(2, 2);
this.groupBox4.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.groupBox4.Name = "groupBox4";
this.groupBox4.Padding = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.groupBox4.Size = new System.Drawing.Size(247, 180);
this.groupBox4.TabIndex = 2;
this.groupBox4.TabStop = false;
this.groupBox4.Text = "产线解绑信息";
//
// dgvLineMission
//
this.dgvLineMission.AllowUserToAddRows = false;
dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Control;
dataGridViewCellStyle1.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText;
dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
this.dgvLineMission.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1;
this.dgvLineMission.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dgvLineMission.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.Column24,
this.Column8});
dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle2.BackColor = System.Drawing.SystemColors.Window;
dataGridViewCellStyle2.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
dataGridViewCellStyle2.ForeColor = System.Drawing.SystemColors.ControlText;
dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
this.dgvLineMission.DefaultCellStyle = dataGridViewCellStyle2;
this.dgvLineMission.Dock = System.Windows.Forms.DockStyle.Fill;
this.dgvLineMission.Location = new System.Drawing.Point(2, 16);
this.dgvLineMission.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.dgvLineMission.Name = "dgvLineMission";
dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle3.BackColor = System.Drawing.SystemColors.Control;
dataGridViewCellStyle3.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
dataGridViewCellStyle3.ForeColor = System.Drawing.SystemColors.WindowText;
dataGridViewCellStyle3.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle3.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
this.dgvLineMission.RowHeadersDefaultCellStyle = dataGridViewCellStyle3;
this.dgvLineMission.RowHeadersVisible = false;
this.dgvLineMission.RowHeadersWidth = 51;
this.dgvLineMission.RowTemplate.Height = 27;
this.dgvLineMission.Size = new System.Drawing.Size(243, 162);
this.dgvLineMission.TabIndex = 28;
this.dgvLineMission.Click += new System.EventHandler(this.dgvLineMission_Click);
//
// Column24
//
this.Column24.HeaderText = "时间";
this.Column24.MinimumWidth = 6;
this.Column24.Name = "Column24";
this.Column24.Width = 150;
//
// Column8
//
this.Column8.HeaderText = "任务";
this.Column8.MinimumWidth = 6;
this.Column8.Name = "Column8";
this.Column8.Width = 150;
// tabPage2
//
this.tabPage2.Controls.Add(this.tableLayoutPanel1);
this.tabPage2.Location = new System.Drawing.Point(4, 22);
this.tabPage2.Name = "tabPage2";
this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
this.tabPage2.Size = new System.Drawing.Size(1097, 336);
this.tabPage2.TabIndex = 3;
this.tabPage2.Text = "日志";
this.tabPage2.UseVisualStyleBackColor = true;
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 2;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 181F));
this.tableLayoutPanel1.Controls.Add(this.groupBox8, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.TxtLog, 0, 0);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 3);
this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(2);
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(1091, 330);
this.tableLayoutPanel1.TabIndex = 6;
//
// groupBox8
//
......@@ -495,12 +619,12 @@
this.groupBox8.Controls.Add(this.lblCharge3);
this.groupBox8.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox8.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.groupBox8.Location = new System.Drawing.Point(253, 2);
this.groupBox8.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.groupBox8.Location = new System.Drawing.Point(912, 2);
this.groupBox8.Margin = new System.Windows.Forms.Padding(2);
this.groupBox8.Name = "groupBox8";
this.groupBox8.Padding = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.groupBox8.Size = new System.Drawing.Size(190, 180);
this.groupBox8.TabIndex = 3;
this.groupBox8.Padding = new System.Windows.Forms.Padding(2);
this.groupBox8.Size = new System.Drawing.Size(177, 326);
this.groupBox8.TabIndex = 6;
this.groupBox8.TabStop = false;
this.groupBox8.Text = "位置占用情况";
//
......@@ -548,32 +672,6 @@
this.lblCharge3.TabIndex = 0;
this.lblCharge3.Text = "lblCharge3";
//
// tabPage2
//
this.tabPage2.Controls.Add(this.tableLayoutPanel1);
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(1053, 297);
this.tabPage2.TabIndex = 3;
this.tabPage2.Text = "日志";
this.tabPage2.UseVisualStyleBackColor = true;
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 1;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 15F));
this.tableLayoutPanel1.Controls.Add(this.TxtLog, 0, 0);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 3);
this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
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(1047, 291);
this.tableLayoutPanel1.TabIndex = 6;
//
// TxtLog
//
this.TxtLog.Dock = System.Windows.Forms.DockStyle.Fill;
......@@ -581,52 +679,98 @@
this.TxtLog.Multiline = true;
this.TxtLog.Name = "TxtLog";
this.TxtLog.ScrollBars = System.Windows.Forms.ScrollBars.Both;
this.TxtLog.Size = new System.Drawing.Size(1041, 285);
this.TxtLog.Size = new System.Drawing.Size(904, 324);
this.TxtLog.TabIndex = 5;
//
// tabPage3
//
this.tabPage3.Controls.Add(this.groupBox7);
this.tabPage3.Controls.Add(this.label12);
this.tabPage3.Controls.Add(this.groupBox4);
this.tabPage3.Controls.Add(this.groupBox6);
this.tabPage3.Controls.Add(this.groupBox2);
this.tabPage3.Controls.Add(this.BtnMissionAdd);
this.tabPage3.Controls.Add(this.LstAgvPlace);
this.tabPage3.Location = new System.Drawing.Point(4, 22);
this.tabPage3.Name = "tabPage3";
this.tabPage3.Padding = new System.Windows.Forms.Padding(3, 3, 3, 3);
this.tabPage3.Size = new System.Drawing.Size(1053, 297);
this.tabPage3.Padding = new System.Windows.Forms.Padding(3);
this.tabPage3.Size = new System.Drawing.Size(1097, 336);
this.tabPage3.TabIndex = 2;
this.tabPage3.Text = "手动";
this.tabPage3.UseVisualStyleBackColor = true;
//
// groupBox7
//
this.groupBox7.Controls.Add(this.txtBoxLineName);
this.groupBox7.Controls.Add(this.label8);
this.groupBox7.Controls.Add(this.label7);
this.groupBox7.Controls.Add(this.btnUpdateStatus);
this.groupBox7.Controls.Add(this.txtBoxRFID);
this.groupBox7.Location = new System.Drawing.Point(518, 24);
this.groupBox7.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.groupBox7.Name = "groupBox7";
this.groupBox7.Padding = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.groupBox7.Size = new System.Drawing.Size(153, 121);
this.groupBox7.TabIndex = 36;
this.groupBox7.TabStop = false;
this.groupBox7.Text = "物料状态上报";
// groupBox4
//
this.groupBox4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224)))));
this.groupBox4.Controls.Add(this.agvRemoveRfid);
this.groupBox4.Controls.Add(this.btnClearStationRFID);
this.groupBox4.Controls.Add(this.label11);
this.groupBox4.Controls.Add(this.txtBoxLineName);
this.groupBox4.Controls.Add(this.btnUpdateStatus);
this.groupBox4.Controls.Add(this.btnGetStationRfid);
this.groupBox4.Controls.Add(this.label8);
this.groupBox4.Controls.Add(this.label7);
this.groupBox4.Controls.Add(this.txtBoxRFID);
this.groupBox4.Location = new System.Drawing.Point(800, 24);
this.groupBox4.Name = "groupBox4";
this.groupBox4.Size = new System.Drawing.Size(291, 262);
this.groupBox4.TabIndex = 38;
this.groupBox4.TabStop = false;
this.groupBox4.Text = "操作";
//
// btnClearStationRFID
//
this.btnClearStationRFID.Location = new System.Drawing.Point(8, 142);
this.btnClearStationRFID.Margin = new System.Windows.Forms.Padding(2);
this.btnClearStationRFID.Name = "btnClearStationRFID";
this.btnClearStationRFID.Size = new System.Drawing.Size(125, 35);
this.btnClearStationRFID.TabIndex = 46;
this.btnClearStationRFID.Text = "清除接驳台RFID";
this.btnClearStationRFID.UseVisualStyleBackColor = true;
this.btnClearStationRFID.Click += new System.EventHandler(this.btnClearStationRFID_Click);
//
// label11
//
this.label11.AutoSize = true;
this.label11.Location = new System.Drawing.Point(4, 200);
this.label11.Name = "label11";
this.label11.Size = new System.Drawing.Size(29, 12);
this.label11.TabIndex = 45;
this.label11.Text = "null";
//
// txtBoxLineName
//
this.txtBoxLineName.Location = new System.Drawing.Point(60, 50);
this.txtBoxLineName.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.txtBoxLineName.Location = new System.Drawing.Point(111, 54);
this.txtBoxLineName.Margin = new System.Windows.Forms.Padding(2);
this.txtBoxLineName.Name = "txtBoxLineName";
this.txtBoxLineName.Size = new System.Drawing.Size(77, 21);
this.txtBoxLineName.Size = new System.Drawing.Size(111, 21);
this.txtBoxLineName.TabIndex = 44;
//
// btnUpdateStatus
//
this.btnUpdateStatus.Location = new System.Drawing.Point(147, 91);
this.btnUpdateStatus.Margin = new System.Windows.Forms.Padding(2);
this.btnUpdateStatus.Name = "btnUpdateStatus";
this.btnUpdateStatus.Size = new System.Drawing.Size(125, 35);
this.btnUpdateStatus.TabIndex = 41;
this.btnUpdateStatus.Text = "物料状态上报";
this.btnUpdateStatus.UseVisualStyleBackColor = true;
this.btnUpdateStatus.Click += new System.EventHandler(this.btnUpdateStatus_Click);
//
// btnGetStationRfid
//
this.btnGetStationRfid.Location = new System.Drawing.Point(8, 91);
this.btnGetStationRfid.Margin = new System.Windows.Forms.Padding(2);
this.btnGetStationRfid.Name = "btnGetStationRfid";
this.btnGetStationRfid.Size = new System.Drawing.Size(125, 35);
this.btnGetStationRfid.TabIndex = 41;
this.btnGetStationRfid.Text = "获取接驳台RFID";
this.btnGetStationRfid.UseVisualStyleBackColor = true;
this.btnGetStationRfid.Click += new System.EventHandler(this.btnGetStationRfid_Click);
//
// label8
//
this.label8.AutoSize = true;
this.label8.Location = new System.Drawing.Point(4, 58);
this.label8.Location = new System.Drawing.Point(60, 63);
this.label8.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label8.Name = "label8";
this.label8.Size = new System.Drawing.Size(47, 12);
......@@ -636,52 +780,71 @@
// label7
//
this.label7.AutoSize = true;
this.label7.Location = new System.Drawing.Point(4, 24);
this.label7.Location = new System.Drawing.Point(62, 31);
this.label7.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(35, 12);
this.label7.TabIndex = 42;
this.label7.Text = "RFID:";
//
// btnUpdateStatus
//
this.btnUpdateStatus.Location = new System.Drawing.Point(37, 78);
this.btnUpdateStatus.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.btnUpdateStatus.Name = "btnUpdateStatus";
this.btnUpdateStatus.Size = new System.Drawing.Size(75, 39);
this.btnUpdateStatus.TabIndex = 41;
this.btnUpdateStatus.Text = "上报";
this.btnUpdateStatus.UseVisualStyleBackColor = true;
this.btnUpdateStatus.Click += new System.EventHandler(this.btnUpdateStatus_Click);
//
// txtBoxRFID
//
this.txtBoxRFID.Location = new System.Drawing.Point(60, 19);
this.txtBoxRFID.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.txtBoxRFID.Location = new System.Drawing.Point(111, 23);
this.txtBoxRFID.Margin = new System.Windows.Forms.Padding(2);
this.txtBoxRFID.Name = "txtBoxRFID";
this.txtBoxRFID.Size = new System.Drawing.Size(77, 21);
this.txtBoxRFID.Size = new System.Drawing.Size(111, 21);
this.txtBoxRFID.TabIndex = 0;
//
// groupBox6
//
this.groupBox6.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(192)))));
this.groupBox6.Controls.Add(this.label10);
this.groupBox6.Controls.Add(this.label9);
this.groupBox6.Controls.Add(this.txtRfid);
this.groupBox6.Controls.Add(this.btnDeleteMission);
this.groupBox6.Controls.Add(this.btnAddMission);
this.groupBox6.Controls.Add(this.cmbBoxLineName);
this.groupBox6.Location = new System.Drawing.Point(297, 21);
this.groupBox6.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.groupBox6.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.groupBox6.Location = new System.Drawing.Point(320, 21);
this.groupBox6.Margin = new System.Windows.Forms.Padding(2);
this.groupBox6.Name = "groupBox6";
this.groupBox6.Padding = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.groupBox6.Size = new System.Drawing.Size(191, 124);
this.groupBox6.TabIndex = 35;
this.groupBox6.Padding = new System.Windows.Forms.Padding(2);
this.groupBox6.Size = new System.Drawing.Size(247, 180);
this.groupBox6.TabIndex = 37;
this.groupBox6.TabStop = false;
this.groupBox6.Text = "产线绑定";
this.groupBox6.Text = "产线手动绑定";
//
// label10
//
this.label10.AutoSize = true;
this.label10.Location = new System.Drawing.Point(14, 61);
this.label10.Name = "label10";
this.label10.Size = new System.Drawing.Size(41, 12);
this.label10.TabIndex = 44;
this.label10.Text = "RFID:";
//
// label9
//
this.label9.AutoSize = true;
this.label9.Location = new System.Drawing.Point(14, 26);
this.label9.Name = "label9";
this.label9.Size = new System.Drawing.Size(41, 12);
this.label9.TabIndex = 43;
this.label9.Text = "产线:";
//
// txtRfid
//
this.txtRfid.Location = new System.Drawing.Point(79, 52);
this.txtRfid.Name = "txtRfid";
this.txtRfid.Size = new System.Drawing.Size(137, 21);
this.txtRfid.TabIndex = 42;
//
// btnDeleteMission
//
this.btnDeleteMission.Location = new System.Drawing.Point(92, 50);
this.btnDeleteMission.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.btnDeleteMission.Location = new System.Drawing.Point(129, 105);
this.btnDeleteMission.Margin = new System.Windows.Forms.Padding(2);
this.btnDeleteMission.Name = "btnDeleteMission";
this.btnDeleteMission.Size = new System.Drawing.Size(75, 52);
this.btnDeleteMission.Size = new System.Drawing.Size(104, 52);
this.btnDeleteMission.TabIndex = 41;
this.btnDeleteMission.Text = "删除绑定任务";
this.btnDeleteMission.UseVisualStyleBackColor = true;
......@@ -689,10 +852,10 @@
//
// btnAddMission
//
this.btnAddMission.Location = new System.Drawing.Point(4, 50);
this.btnAddMission.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.btnAddMission.Location = new System.Drawing.Point(4, 105);
this.btnAddMission.Margin = new System.Windows.Forms.Padding(2);
this.btnAddMission.Name = "btnAddMission";
this.btnAddMission.Size = new System.Drawing.Size(75, 52);
this.btnAddMission.Size = new System.Drawing.Size(93, 52);
this.btnAddMission.TabIndex = 40;
this.btnAddMission.Text = "添加绑定任务";
this.btnAddMission.UseVisualStyleBackColor = true;
......@@ -701,31 +864,32 @@
// cmbBoxLineName
//
this.cmbBoxLineName.FormattingEnabled = true;
this.cmbBoxLineName.Location = new System.Drawing.Point(4, 18);
this.cmbBoxLineName.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.cmbBoxLineName.Location = new System.Drawing.Point(79, 18);
this.cmbBoxLineName.Margin = new System.Windows.Forms.Padding(2);
this.cmbBoxLineName.Name = "cmbBoxLineName";
this.cmbBoxLineName.Size = new System.Drawing.Size(137, 20);
this.cmbBoxLineName.TabIndex = 39;
//
// groupBox2
//
this.groupBox2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(255)))), ((int)(((byte)(255)))));
this.groupBox2.Controls.Add(this.btnReSendTask);
this.groupBox2.Controls.Add(this.BtnClearError);
this.groupBox2.Controls.Add(this.BtnMissionReady);
this.groupBox2.Controls.Add(this.BtnMissionPause);
this.groupBox2.Location = new System.Drawing.Point(701, 24);
this.groupBox2.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.groupBox2.Location = new System.Drawing.Point(583, 24);
this.groupBox2.Margin = new System.Windows.Forms.Padding(2);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Padding = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.groupBox2.Size = new System.Drawing.Size(262, 177);
this.groupBox2.Padding = new System.Windows.Forms.Padding(2);
this.groupBox2.Size = new System.Drawing.Size(193, 177);
this.groupBox2.TabIndex = 32;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "操作";
this.groupBox2.Text = "小车操作";
//
// btnReSendTask
//
this.btnReSendTask.Location = new System.Drawing.Point(152, 102);
this.btnReSendTask.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.btnReSendTask.Location = new System.Drawing.Point(96, 102);
this.btnReSendTask.Margin = new System.Windows.Forms.Padding(2);
this.btnReSendTask.Name = "btnReSendTask";
this.btnReSendTask.Size = new System.Drawing.Size(75, 52);
this.btnReSendTask.TabIndex = 45;
......@@ -735,7 +899,7 @@
//
// BtnClearError
//
this.BtnClearError.Location = new System.Drawing.Point(35, 102);
this.BtnClearError.Location = new System.Drawing.Point(5, 102);
this.BtnClearError.Name = "BtnClearError";
this.BtnClearError.Size = new System.Drawing.Size(75, 52);
this.BtnClearError.TabIndex = 19;
......@@ -745,7 +909,7 @@
//
// BtnMissionReady
//
this.BtnMissionReady.Location = new System.Drawing.Point(35, 19);
this.BtnMissionReady.Location = new System.Drawing.Point(5, 23);
this.BtnMissionReady.Name = "BtnMissionReady";
this.BtnMissionReady.Size = new System.Drawing.Size(75, 52);
this.BtnMissionReady.TabIndex = 1;
......@@ -755,7 +919,7 @@
//
// BtnMissionPause
//
this.BtnMissionPause.Location = new System.Drawing.Point(152, 15);
this.BtnMissionPause.Location = new System.Drawing.Point(96, 23);
this.BtnMissionPause.Name = "BtnMissionPause";
this.BtnMissionPause.Size = new System.Drawing.Size(75, 52);
this.BtnMissionPause.TabIndex = 2;
......@@ -781,7 +945,7 @@
this.LstAgvPlace.ItemHeight = 12;
this.LstAgvPlace.Location = new System.Drawing.Point(3, 3);
this.LstAgvPlace.Name = "LstAgvPlace";
this.LstAgvPlace.Size = new System.Drawing.Size(150, 291);
this.LstAgvPlace.Size = new System.Drawing.Size(150, 330);
this.LstAgvPlace.TabIndex = 0;
//
// tableLayoutPanel4
......@@ -790,13 +954,13 @@
this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel4.Controls.Add(this.tableLayoutPanel6, 0, 0);
this.tableLayoutPanel4.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel4.Location = new System.Drawing.Point(2, 133);
this.tableLayoutPanel4.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.tableLayoutPanel4.Location = new System.Drawing.Point(2, 149);
this.tableLayoutPanel4.Margin = new System.Windows.Forms.Padding(2);
this.tableLayoutPanel4.Name = "tableLayoutPanel4";
this.tableLayoutPanel4.RowCount = 1;
this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 169F));
this.tableLayoutPanel4.Size = new System.Drawing.Size(1063, 192);
this.tableLayoutPanel4.Size = new System.Drawing.Size(1107, 216);
this.tableLayoutPanel4.TabIndex = 8;
//
// tableLayoutPanel6
......@@ -815,12 +979,12 @@
this.tableLayoutPanel6.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel6.Font = new System.Drawing.Font("宋体", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.tableLayoutPanel6.Location = new System.Drawing.Point(2, 2);
this.tableLayoutPanel6.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.tableLayoutPanel6.Margin = new System.Windows.Forms.Padding(2);
this.tableLayoutPanel6.Name = "tableLayoutPanel6";
this.tableLayoutPanel6.RowCount = 2;
this.tableLayoutPanel6.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel6.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel6.Size = new System.Drawing.Size(1059, 188);
this.tableLayoutPanel6.Size = new System.Drawing.Size(1103, 212);
this.tableLayoutPanel6.TabIndex = 0;
//
// label6
......@@ -828,10 +992,10 @@
this.label6.AutoSize = true;
this.label6.Dock = System.Windows.Forms.DockStyle.Fill;
this.label6.Font = new System.Drawing.Font("宋体", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label6.Location = new System.Drawing.Point(708, 95);
this.label6.Location = new System.Drawing.Point(737, 107);
this.label6.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(346, 90);
this.label6.Size = new System.Drawing.Size(361, 102);
this.label6.TabIndex = 5;
this.label6.Text = "label6";
//
......@@ -840,10 +1004,10 @@
this.label5.AutoSize = true;
this.label5.Dock = System.Windows.Forms.DockStyle.Fill;
this.label5.Font = new System.Drawing.Font("宋体", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label5.Location = new System.Drawing.Point(356, 95);
this.label5.Location = new System.Drawing.Point(371, 107);
this.label5.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(345, 90);
this.label5.Size = new System.Drawing.Size(359, 102);
this.label5.TabIndex = 4;
this.label5.Text = "label5";
//
......@@ -852,10 +1016,10 @@
this.label4.AutoSize = true;
this.label4.Dock = System.Windows.Forms.DockStyle.Fill;
this.label4.Font = new System.Drawing.Font("宋体", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label4.Location = new System.Drawing.Point(5, 95);
this.label4.Location = new System.Drawing.Point(5, 107);
this.label4.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(344, 90);
this.label4.Size = new System.Drawing.Size(359, 102);
this.label4.TabIndex = 3;
this.label4.Text = "label4";
//
......@@ -864,10 +1028,10 @@
this.label3.AutoSize = true;
this.label3.Dock = System.Windows.Forms.DockStyle.Fill;
this.label3.Font = new System.Drawing.Font("宋体", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label3.Location = new System.Drawing.Point(708, 3);
this.label3.Location = new System.Drawing.Point(737, 3);
this.label3.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(346, 89);
this.label3.Size = new System.Drawing.Size(361, 101);
this.label3.TabIndex = 2;
this.label3.Text = "label3";
//
......@@ -876,10 +1040,10 @@
this.label2.AutoSize = true;
this.label2.Dock = System.Windows.Forms.DockStyle.Fill;
this.label2.Font = new System.Drawing.Font("宋体", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label2.Location = new System.Drawing.Point(356, 3);
this.label2.Location = new System.Drawing.Point(371, 3);
this.label2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(345, 89);
this.label2.Size = new System.Drawing.Size(359, 101);
this.label2.TabIndex = 1;
this.label2.Text = "label2";
//
......@@ -891,102 +1055,37 @@
this.label1.Location = new System.Drawing.Point(5, 3);
this.label1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(344, 89);
this.label1.Size = new System.Drawing.Size(359, 101);
this.label1.TabIndex = 0;
this.label1.Text = "label1";
//
// Column1
//
this.Column1.HeaderText = "名称";
this.Column1.MinimumWidth = 6;
this.Column1.Name = "Column1";
this.Column1.ReadOnly = true;
this.Column1.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column2
//
this.Column2.HeaderText = "IP";
this.Column2.MinimumWidth = 6;
this.Column2.Name = "Column2";
this.Column2.ReadOnly = true;
this.Column2.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column4
// agvRemoveRfid
//
this.Column4.HeaderText = "小车状态";
this.Column4.MinimumWidth = 6;
this.Column4.Name = "Column4";
this.Column4.ReadOnly = true;
this.Column4.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
this.agvRemoveRfid.Location = new System.Drawing.Point(147, 142);
this.agvRemoveRfid.Margin = new System.Windows.Forms.Padding(2);
this.agvRemoveRfid.Name = "agvRemoveRfid";
this.agvRemoveRfid.Size = new System.Drawing.Size(125, 35);
this.agvRemoveRfid.TabIndex = 47;
this.agvRemoveRfid.Text = "清理料架的缓存信息";
this.agvRemoveRfid.UseVisualStyleBackColor = true;
this.agvRemoveRfid.Click += new System.EventHandler(this.agvRemoveRfid_Click);
//
// Column14
// label12
//
this.Column14.HeaderText = "任务ID";
this.Column14.MinimumWidth = 6;
this.Column14.Name = "Column14";
this.Column14.ReadOnly = true;
this.Column14.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column21
//
this.Column21.HeaderText = "任务名称";
this.Column21.MinimumWidth = 6;
this.Column21.Name = "Column21";
this.Column21.ReadOnly = true;
this.Column21.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column3
//
this.Column3.HeaderText = "任务状态";
this.Column3.MinimumWidth = 6;
this.Column3.Name = "Column3";
this.Column3.ReadOnly = true;
this.Column3.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column18
//
this.Column18.HeaderText = "目的地";
this.Column18.MinimumWidth = 6;
this.Column18.Name = "Column18";
this.Column18.ReadOnly = true;
this.Column18.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column23
//
this.Column23.HeaderText = "负载";
this.Column23.MinimumWidth = 6;
this.Column23.Name = "Column23";
this.Column23.ReadOnly = true;
this.Column23.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column13
//
this.Column13.HeaderText = "连接";
this.Column13.MinimumWidth = 6;
this.Column13.Name = "Column13";
this.Column13.ReadOnly = true;
this.Column13.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column19
//
this.Column19.HeaderText = "电量";
this.Column19.MinimumWidth = 6;
this.Column19.Name = "Column19";
this.Column19.ReadOnly = true;
this.Column19.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column11
//
this.Column11.HeaderText = "自动";
this.Column11.MinimumWidth = 6;
this.Column11.Name = "Column11";
this.Column11.ReadOnly = true;
this.label12.AutoSize = true;
this.label12.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(224)))), ((int)(((byte)(192)))));
this.label12.Location = new System.Drawing.Point(302, 224);
this.label12.Name = "label12";
this.label12.Size = new System.Drawing.Size(407, 60);
this.label12.TabIndex = 46;
this.label12.Text = "说明:\r\n1、获取接驳台RFID:获取指定产线上的料架RFID信息\r\n2、物料状态上报:上报料车的产线信息\r\n3、清除接驳台RFID:清理指定产线的RFID信息\r" +
"\n4、清理料架的缓存信息:输入RFID,清除RFID的缓存信息,使料架可以复用\r\n";
//
// FrmMain
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1067, 656);
this.ClientSize = new System.Drawing.Size(1111, 735);
this.Controls.Add(this.tableLayoutPanel3);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "FrmMain";
......@@ -1005,17 +1104,22 @@
this.groupBox5.ResumeLayout(false);
this.groupBox3.ResumeLayout(false);
this.tableLayoutPanel7.ResumeLayout(false);
this.groupBox4.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.dgvLineMission)).EndInit();
this.groupBox8.ResumeLayout(false);
this.groupBox8.PerformLayout();
this.grpUnlock.ResumeLayout(false);
this.grpUnlock.PerformLayout();
this.tblLayoutUnlock.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.dgvUnlockDetail)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.dgvUnlockInfo)).EndInit();
this.tabPage2.ResumeLayout(false);
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
this.groupBox8.ResumeLayout(false);
this.groupBox8.PerformLayout();
this.tabPage3.ResumeLayout(false);
this.groupBox7.ResumeLayout(false);
this.groupBox7.PerformLayout();
this.tabPage3.PerformLayout();
this.groupBox4.ResumeLayout(false);
this.groupBox4.PerformLayout();
this.groupBox6.ResumeLayout(false);
this.groupBox6.PerformLayout();
this.groupBox2.ResumeLayout(false);
this.tableLayoutPanel4.ResumeLayout(false);
this.tableLayoutPanel6.ResumeLayout(false);
......@@ -1063,23 +1167,9 @@
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel5;
private System.Windows.Forms.GroupBox groupBox5;
private System.Windows.Forms.Label lblDestInfo;
private System.Windows.Forms.GroupBox groupBox6;
private System.Windows.Forms.Button btnDeleteMission;
private System.Windows.Forms.Button btnAddMission;
private System.Windows.Forms.ComboBox cmbBoxLineName;
private System.Windows.Forms.GroupBox groupBox7;
private System.Windows.Forms.Button btnUpdateStatus;
private System.Windows.Forms.TextBox txtBoxRFID;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel7;
private System.Windows.Forms.GroupBox groupBox4;
private System.Windows.Forms.DataGridView dgvLineMission;
private System.Windows.Forms.DataGridViewTextBoxColumn Column24;
private System.Windows.Forms.DataGridViewTextBoxColumn Column8;
private System.Windows.Forms.GroupBox groupBox8;
private System.Windows.Forms.Label lblCharge4;
private System.Windows.Forms.Label lblCharge3;
private System.Windows.Forms.Label lblStandy2;
private System.Windows.Forms.Label lblStandy1;
private System.Windows.Forms.TextBox txtBoxLineName;
private System.Windows.Forms.Label label8;
private System.Windows.Forms.Label label7;
......@@ -1095,6 +1185,30 @@
private System.Windows.Forms.DataGridViewTextBoxColumn Column13;
private System.Windows.Forms.DataGridViewTextBoxColumn Column19;
private System.Windows.Forms.DataGridViewButtonColumn Column11;
private System.Windows.Forms.GroupBox groupBox6;
private System.Windows.Forms.Label label10;
private System.Windows.Forms.Label label9;
private System.Windows.Forms.TextBox txtRfid;
private System.Windows.Forms.Button btnDeleteMission;
private System.Windows.Forms.Button btnAddMission;
private System.Windows.Forms.ComboBox cmbBoxLineName;
private System.Windows.Forms.GroupBox groupBox8;
private System.Windows.Forms.Label lblStandy2;
private System.Windows.Forms.Label lblStandy1;
private System.Windows.Forms.Label lblCharge4;
private System.Windows.Forms.Label lblCharge3;
private System.Windows.Forms.Label lblWarn;
private System.Windows.Forms.GroupBox grpUnlock;
private System.Windows.Forms.DataGridView dgvUnlockInfo;
private System.Windows.Forms.TableLayoutPanel tblLayoutUnlock;
private System.Windows.Forms.DataGridView dgvUnlockDetail;
private System.Windows.Forms.GroupBox groupBox4;
private System.Windows.Forms.Button btnGetStationRfid;
private System.ComponentModel.BackgroundWorker backgroundWorker1;
private System.Windows.Forms.Label label11;
private System.Windows.Forms.Button btnClearStationRFID;
private System.Windows.Forms.Button agvRemoveRfid;
private System.Windows.Forms.Label label12;
}
}
......@@ -5,6 +5,7 @@ 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;
......@@ -61,7 +62,7 @@ namespace AGVControl
cmbBoxLineName.Items.Add("产线名称");
foreach (var item in Common.nodeInfo)
{
if (item.Name.StartsWith("A"))
if (item.Name.StartsWith("A") || item.Name.Equals(SettingString.D4FeederIn) || item.Name.Equals(SettingString.C4FeederIn))
continue;
cmbBoxLineName.Items.Add(item.AliceName);
}
......@@ -115,10 +116,6 @@ namespace AGVControl
}));
System.GC.Collect();
}
private void MissionManager_MissionChanged()
{
ShowEmptyTask();
}
private void Control_AgvOnline(int agvIndex)
{
Invoke(new Action(() => { DgvAgv.Rows[agvIndex].DefaultCellStyle.ForeColor = Common.agvInfo[agvIndex].IsCon ? Color.Black : Color.Red; }));
......@@ -176,14 +173,59 @@ namespace AGVControl
Common.control.AgvChanged += Control_AgvChanged;
Common.control.AgvOnline += Control_AgvOnline;
Common.server.NodeChanged += Server_NodeChanged;
Common.control.NodeChangedEvent += Server_NodeChanged;
Common.server.NodeOnline += Server_NodeOnline;
ReadUnlockLineInfo();
}
void ReadUnlockLineInfo()
{
if (!System.IO.File.Exists(Common.CONFIG_PATH + "UnlockInfo.json"))
{
File.Create(Common.CONFIG_PATH + "UnlockInfo.json");
Common.missionManager = new UnlockMissionManager(Common.nodeInfo);
Common.missionManager.MissionChanged += MissionManager_MissionChanged;
return;
}
string s = File.ReadAllText(Common.CONFIG_PATH + "UnlockInfo.json");
Common.missionManager = JsonHelper.DeserializeJsonToObject<UnlockMissionManager>(s);
if (Common.missionManager == null)
Common.missionManager = new UnlockMissionManager(Common.nodeInfo);
Common.missionManager.MissionChanged += MissionManager_MissionChanged;
//foreach (var item in Common.agvInfo)
//{
// cmbBoxAGVName.Items.Add(item.Name);
//}
//cmbBoxAGVName.Items.Add("None");
//cmbBoxAGVName.SelectedIndex = Common.agvInfo.Count;
Common.missionManager.Init();
}
private void MissionManager_MissionChanged(Dictionary<string, UnlockInfo> pairs)
{
BindingSource bs = new BindingSource();
BindingSource bs2 = new BindingSource();
try
{
dgvUnlockInfo.BeginInvoke(new MethodInvoker(delegate
{
foreach (var item in pairs.Values)
{
if (item.Count > 0)
{
bs.Add(item);
foreach (var item1 in item.UnlockRfids)
{
bs2.Add(item1);
}
}
}
dgvUnlockInfo.DataSource = bs; //赋值控件自动更新
dgvUnlockDetail.DataSource = bs2;
}));
this.Invoke(new Action(() =>
{
//grpUnlock.Text = "解绑总数:"+count;
}
));
}
catch (Exception e)
{
Common.log.Error("ShowUnlockInfo", e);
}
}
private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
......@@ -236,7 +278,8 @@ namespace AGVControl
Common.LogInfo(string.Format("手动开启小车自动模式,并清除上一次的自动模式的运行信息{0} {1}", Common.agvInfo[e.RowIndex].Name, Common.agvInfo[e.RowIndex].RunInfo()));
//Common.agvInfo[e.RowIndex].CurJob = null;
Common.agvInfo[e.RowIndex].RFID = "";
// Common.agvInfo[e.RowIndex].Place = "";
if (Common.agvInfo[e.RowIndex].Place.Equals(SettingString.AutoCharge) || Common.agvInfo[e.RowIndex].Place.Equals(SettingString.Standby))
Common.agvInfo[e.RowIndex].Place = "";
Common.agvInfo[e.RowIndex].IsUse = true;
// }
//else
......@@ -269,23 +312,10 @@ namespace AGVControl
else if (e.ColumnIndex == 8) //清除缓存
{
//清除节点缓存
Common.LogInfo(string.Format("手动清除缓存,{0} {1}", Common.nodeInfo[e.RowIndex].AgvName, Common.nodeInfo[e.RowIndex].Name));
string name = Common.nodeInfo[e.RowIndex].AgvName;
Common.nodeInfo[e.RowIndex].AgvName = "";
Common.LogInfo(string.Format("手动清除缓存,{0}", Common.nodeInfo[e.RowIndex].Name));
DgvNode.Rows[e.RowIndex].Cells[5].Value = "";
Common.nodeInfo[e.RowIndex].RFID = "";
DgvNode.Rows[e.RowIndex].Cells[4].Value = "";
//清除小车缓存
int idx = Common.agvInfo.FindIndex(s => s.Name == name);
if (idx > -1)
{
Common.agvInfo[idx].Place = "";
Common.agvInfo[idx].RFID = "";
DgvAgv.Rows[idx].SetValues(Common.agvInfo[idx].ToRow());
//添加Init任务
Common.mir.Add_Mission_Fleet(Common.agvInfo[idx], Common.agvMission["Init"]);
Common.mir.State_Ready(Common.agvInfo[idx]);
}
DgvNode.Rows[e.RowIndex].SetValues(Common.nodeInfo[e.RowIndex].ToRow());
}
}
......@@ -373,53 +403,27 @@ namespace AGVControl
try
{
agvRunInfo[i].Text = Common.agvInfo[i].RunInfo();
Application.DoEvents();
}
catch (Exception ex)
{
Common.log.Error("显示"+ Common.agvInfo[i].Name+"运行信息异常");
Common.log.Error("显示" + Common.agvInfo[i].Name + "运行信息异常");
}
}
if (!Common.doubleLine_WO.Equals(""))
lblWO.Text = Common.doubleLine_WO;
if (!AGVManager.A6_Target.Equals(""))
lblDestInfo.Text = AGVManager.A6_Target;
Application.DoEvents();
//if (!Common.doubleLine_WO.Equals(""))
lblWO.Text = Common.doubleLine_WO;
// if (!AGVManager.A6_Target.Equals(""))
lblDestInfo.Text = AGVManager.A6_Target;
lblCharge3.Text = "充电桩3:" + Common.chargeStatus.charge3;
lblCharge4.Text = "充电桩6:" + Common.chargeStatus.charge6;
lblStandy1.Text = "4C待机位1:" + Common.StandbyStation.C4_Station1;
lblStandy2.Text = "4C待机位2:" + Common.StandbyStation.C4_Station2;
lblWarn.Text = Common.warnMsg;
}));
InShhow = false;
}
private void ShowEmptyTask()
{
if (dgvLineMission.InvokeRequired)
{
dgvLineMission.Invoke(new Action(() => ShowEmptyTask()));
return;
}
try
{
if (dgvLineMission.Rows.Count != 0)
dgvLineMission.Rows.Clear();
foreach (var item in Common.missionManager.missionList)
{
var key = Common.nodeInfo.Where(q => q.Name == item.NodeName).Select(q => q.AliceName);
if (key.ToList().Count > 0)
dgvLineMission.Rows.Add(item.CreateTime, key.ToList()[0]);
}
groupBox4.Text = "产线解绑信息:共" + Common.missionManager.EmptyMissionCount.ToString() + "个";
}
catch (Exception ex)
{
Common.log.Error(ex);
}
}
private void ChkAutoCharge_CheckedChanged(object sender, EventArgs e)
{
......@@ -438,21 +442,23 @@ namespace AGVControl
}
if (MessageBox.Show("确定删除产线任务[" + cmbBoxLineName.SelectedItem.ToString() + "]", "手动删除解绑任务", MessageBoxButtons.YesNo) == DialogResult.No)
return;
//int idx=Common.missionList.FindIndex(s => s.NodeName == Common.agvProductionLine[txtBoxMission.Text]);
int idx = Common.nodeInfo.FindIndex(s => s.AliceName.Equals(cmbBoxLineName.SelectedItem.ToString()));
if (idx > -1)
if (txtRfid.Text.ToUpper().StartsWith("D") || txtRfid.Text.ToUpper().StartsWith("C"))
{
if (Common.DelEmptyShelfTask(Common.nodeInfo[idx].Name))
{
Common.LogInfo("手动删除任务成功:" + cmbBoxLineName.SelectedItem.ToString());
}
else
int idx = Common.nodeInfo.FindIndex(s => s.AliceName.Equals(cmbBoxLineName.SelectedItem.ToString()));
if (idx > -1)
{
Common.LogInfo("手动删除任务失败");
if (Common.missionManager.DelMission(Common.nodeInfo[idx].Name, txtRfid.Text.ToUpper()))
{
Common.LogInfo(string.Format("手动删除任务成功:{0} {1}", cmbBoxLineName.SelectedItem.ToString(), txtRfid.Text.ToUpper()));
}
else
{
Common.LogInfo("手动删除任务失败");
}
}
}
}
catch (Exception ex)
{
......@@ -465,32 +471,35 @@ namespace AGVControl
{
try
{
if (cmbBoxLineName.SelectedItem == null || cmbBoxLineName.SelectedIndex == 0)
if (cmbBoxLineName.SelectedItem == null || cmbBoxLineName.SelectedIndex == 0 || txtRfid.Text.Equals(""))
{
return;
}
if (cmbBoxLineName.SelectedItem.ToString().StartsWith("A"))
return;
if (MessageBox.Show("确定添加产线任务[" + cmbBoxLineName.SelectedItem.ToString() + "]", "手动1添加解绑", MessageBoxButtons.YesNo) == DialogResult.No)
if (MessageBox.Show("确定添加产线任务[" + cmbBoxLineName.SelectedItem.ToString() + "]", "手动添加解绑", MessageBoxButtons.YesNo) == DialogResult.No)
return;
int idx = Common.nodeInfo.FindIndex(s => s.AliceName.Equals(cmbBoxLineName.SelectedItem.ToString()));
if (idx > -1)
if (txtRfid.Text.ToUpper().StartsWith("D") || txtRfid.Text.ToUpper().StartsWith("C"))
{
if (Common.AddEmptyShelfTask(Common.nodeInfo[idx].Name))
{
Common.LogInfo("手动添加任务成功:" + cmbBoxLineName.SelectedItem.ToString());
}
else
int idx = Common.nodeInfo.FindIndex(s => s.AliceName.Equals(cmbBoxLineName.SelectedItem.ToString()));
if (idx > -1)
{
Common.LogInfo("手动添加任务失败");
}
if (Common.missionManager.AddMission(Common.nodeInfo[idx].Name, txtRfid.Text.ToUpper()))
{
Common.LogInfo(string.Format("手动添加任务成功:{0} {1}", cmbBoxLineName.SelectedItem.ToString(), txtRfid.Text.ToUpper()));
}
else
{
Common.LogInfo("手动添加任务失败");
}
}
}
}
catch (Exception ex)
{
ShowEmptyTask();
Common.log.Error("手动添加任务失败:" + ex.Message);
}
}
......@@ -606,9 +615,11 @@ namespace AGVControl
{
Task.Factory.StartNew(() =>
{
AGVManager.UpdateStatus(txtBoxRFID.Text.ToUpper(), txtBoxLineName.Text.ToUpper());
bool rtn = AGVManager.UpdateStatus(txtBoxRFID.Text.ToUpper(), txtBoxLineName.Text.ToUpper());
this.Invoke(new Action(() => { label11.Text = rtn ? "状态上报成功" : "状态上报失败"; }));
Common.LogInfo(string.Format("手动上报状态 产线{0} 物料状态更新成功[{1}]", txtBoxLineName.Text.ToUpper(), txtBoxRFID.Text.ToUpper()));
txtBoxLineName.Text = "";
txtBoxRFID.Text = "";
});
}
catch (Exception ex)
......@@ -617,11 +628,6 @@ namespace AGVControl
}
}
private void dgvLineMission_Click(object sender, EventArgs e)
{
ShowEmptyTask();
}
private void btnClearC4StandyInfo_Click(object sender, EventArgs e)
{
Common.StandbyStation.C4_Station1 = "";
......@@ -656,5 +662,79 @@ namespace AGVControl
DgvAgv.Rows[idx].SetValues(Common.agvInfo[idx].ToRow());
}
}
private void btnGetStationRfid_Click(object sender, EventArgs e)
{
if (txtBoxLineName.Text.Equals(""))
return;
try
{
Task.Factory.StartNew(new Action(() => {
string res = AGVManager.GetRFIDs(txtBoxLineName.Text.ToUpper());
this.Invoke(new Action(() => { label11.Text = string.Format("由里到外料架顺序:{0}", res); }));
}));
}
catch { }
}
private void btnClearStationRFID_Click(object sender, EventArgs e)
{
if (!txtBoxLineName.Text.Equals("") && !txtBoxRFID.Text.Equals(""))
{
try
{
Task.Factory.StartNew(new Action(() => {
bool rtn = AGVManager.ClearRFID(txtBoxLineName.Text.ToUpper(), txtBoxRFID.Text.ToUpper());
this.Invoke(new Action(() => { label11.Text = rtn ? "清除接驳RFID成功:" + txtBoxLineName.Text + " " + txtBoxRFID.Text : "清除接驳RFID失败:" + txtBoxLineName.Text + " " + txtBoxRFID.Text; }));
txtBoxLineName.Text = "";
txtBoxRFID.Text = "";
Common.LogInfo(rtn ? "手动清除接驳RFID成功:" + txtBoxLineName.Text + " " + txtBoxRFID.Text : "手动清除接驳RFID失败:" + txtBoxLineName.Text + " " + txtBoxRFID.Text);
}));
}
catch { }
}
}
/// <summary>
/// 点击小车状态刷新
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DgvAgv_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
Invoke(new Action(() =>
{
try
{
for (int i = 0; i < Common.agvInfo.Count; i++)
{
DgvAgv.Rows[i].SetValues(Common.agvInfo[i].ToRow());
}
}
catch { }
}));
}
private void agvRemoveRfid_Click(object sender, EventArgs e)
{
try
{
Task.Factory.StartNew(() =>
{
if(txtBoxRFID.Text.StartsWith("C") || txtBoxRFID.Text.StartsWith("D"))
{
bool rtn = AGVManager.AgvRemoveRfid(txtBoxRFID.Text.ToUpper());
this.Invoke(new Action(() => { label11.Text = rtn ? "清理料架的缓存信息成功" : "清理料架的缓存信息失败"; }));
Common.LogInfo(string.Format("手动清理料架的缓存信息成功[{0}]", txtBoxRFID.Text.ToUpper()));
}
txtBoxLineName.Text = "";
txtBoxRFID.Text = "";
});
}
catch (Exception ex)
{
}
}
}
}
......@@ -174,1011 +174,103 @@
<metadata name="Column16.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column24.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column8.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
<metadata name="backgroundWorker1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAgHEAAAEAIAA46QAAFgAAACgAAACAAAAA4gAAAAEAIAAAAAAAAOIAAGEPAABhDwAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAwAAAEAAAACEAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAA
AI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAA
AI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAABqAAAAEHFKLAD7pGIAYkAmAAAAACwAAACAAAAAjwAA
AI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAA
AI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAA
AI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAA
AI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAA
AI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAABvAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAA7gAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8IBQN8/75yDP+yaw1rRiobAQEBvwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAADCAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAFQAAANAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/1s7I+v7pGLI/aVjx9yPVs8fFAz6AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAB9AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtAAAA7AAAAP8AAAD/EwsG/yMV
DP8jFAz/IxQM/yMUDP8jFAz/IxQM/yMUDP8jEwv/IxIK/yMSCv8jEgr/IxIK/xcMB/8AAAD/AAAA/wEB
AP8aEQr/JBcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yIX
Df8/KRn/xoJN//2lY//7pGL/+aNh/5JfOf8qHBH/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMX
Dv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMX
Dv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMX
Dv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMX
Dv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDf8jFQz/IxQM/yMUDP8jFQz/IRML/wcE
Av8AAAD/AAAA/wAAAKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAC8AAADuAAAA/wAAAP92RSf/4oRL/9+DSv/fg0r/34NK/9+DSv/fg0r/34NK/958
R//ec0H/3nNB/95zQf/idUL/kUwr/wEBAP8AAAD/BgQC/6FpP//klVn/4JNY/+CTWP/gk1j/4JNY/+CT
WP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4ZNY/+2bXf/8pWL/+6Ri//ukYv/7pGL/+qNi/+aX
Wv/gklj/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CT
WP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CT
WP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CT
WP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CT
WP/gk1j/4JFW/9+ETP/fgkr/34NK/9+DSv/QekX/KxkO/wAAAP8AAAD/AAAAoQAAAAEAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwAAAO4AAAD/AAAA/4RO
LP/+lVX/+5NU//uTVP/7k1T/+5NU//uTVP/7k1T/+oxP//qCSf/6gkn/+oJJ//6ES/+kVTD/AQEA/wAA
AP8HBAP/tXZH//+oZP/9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2l
Y//9pWP//KVi//ukYv/7pGL/+6Ri//ukYv/7pGL//KVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2l
Y//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2l
Y//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2l
Y//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2l
Y//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2lY//8o2H/+5VV//uTU//7k1T//JRU/+qJ
Tv8wHBD/AAAA/wAAAP8AAAChAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAvAAAA7gAAAP8AAAD/g00s//yUVP/5klP/+ZJT//mSU//5klP/+ZJT//mS
U//5i0//+IFJ//iBSf/4gUn//INK/6NVMP8BAQD/AAAA/wcEA/+zdUb//6dk//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//uiYP/5lFX/+ZJT//mSU//6k1P/6YhO/y8cEP8AAAD/AAAA/wAAAKEAAAABAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8AAADuAAAA/wAA
AP+DTSz//JRU//mSU//5klP/+ZJT//mSU//5klP/+ZJT//mLT//4gUn/+IFJ//iBSf/8g0r/o1Uw/wEB
AP8AAAD/BwQD/7N1Rv//p2T/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Jg//mUVf/5klP/+ZJT//qT
U//piE7/LxwQ/wAAAP8AAAD/AAAAoQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAALwAAAO4AAAD/AAAA/4NNLP/8lFT/+ZJT//mSU//5klP/+ZJT//mS
U//5klP/+YtP//iBSf/4gUn/+IFJ//yDSv+jVTD/AQEA/wAAAP8HBAP/s3VG//+nZP/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7omD/+ZRV//mSU//5klP/+pNT/+mITv8vHBD/AAAA/wAAAP8AAAChAAAAAQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAAAA7gAA
AP8AAAD/g00s//yUVP/5klP/+ZJT//mSU//5klP/+ZJT//mSU//5i0//+IFJ//iBSf/4gUn//INK/6NV
MP8BAQD/AAAA/wcEA/+zdUb//6dk//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uiYP/5lFX/+ZJT//mS
U//6k1P/6YhO/y8cEP8AAAD/AAAA/wAAAKEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8AAADuAAAA/wAAAP+DTSz//JRU//mSU//5klP/+ZJT//mS
U//5klP/+ZJT//mLT//4gUn/+IFJ//iBSf/8g0r/o1Uw/wEBAP8AAAD/BwQD/7N1Rv//p2T/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Jg//mUVf/5klP/+ZJT//qTU//piE7/LxwQ/wAAAP8AAAD/AAAAoQAA
AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwAA
AO4AAAD/AAAA/4NNLP/8lFT/+ZJT//mSU//5klP/+ZJT//mSU//5klP/+YtP//iBSf/4gUn/+IFJ//yD
Sv+jVTD/AQEA/wAAAP8HBAP/s3VG//+nZP/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7omD/+ZRV//mS
U//5klP/+pNT/+mITv8vHBD/AAAA/wAAAP8AAAChAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAAAA7gAAAP8AAAD/g00s//yUVP/5klP/+ZJT//mS
U//5klP/+ZJT//mSU//5i0//+IFJ//iBSf/4gUn//INK/6NVMP8BAQD/AAAA/wcEA/+zdUb//6dk//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uiYP/5lFX/+ZJT//mSU//6k1P/6YhO/y8cEP8AAAD/AAAA/wAA
AKEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AC8AAADuAAAA/wAAAP+DTSz//JRU//mSU//5klP/+ZJT//mSU//5klP/+ZJT//mLT//4gUn/+IFJ//iB
Sf/8g0r/o1Uw/wEBAP8AAAD/BwQD/7N1Rv//p2T/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Jg//mU
Vf/5klP/+ZJT//qTU//piE7/LxwQ/wAAAP8AAAD/AAAAoQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwAAAO4AAAD/AAAA/4NNLP/8lFT/+ZJT//mS
U//5klP/+ZJT//mSU//5klP/+YtP//iBSf/4gUn/+IFJ//yDSv+jVTD/AQEA/wAAAP8HBAP/s3VG//+n
ZP/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7omD/+ZRV//mSU//5klP/+pNT/+mITv8vHBD/AAAA/wAA
AP8AAAChAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAvAAAA7gAAAP8AAAD/g00s//yUVP/5klP/+ZJT//mSU//5klP/+ZJT//mSU//5i0//+IFJ//iB
Sf/4gUn//INK/6NVMP8BAQD/AAAA/wcEA/+zdUb//6dk//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ui
YP/5lFX/+ZJT//mSU//6k1P/6YhO/y8cEP8AAAD/AAAA/wAAAKEAAAABAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8AAADuAAAA/wAAAP+DTSz//JRU//mS
U//5klP/+ZJT//mSU//5klP/+ZJT//mLT//4gUn/+IFJ//iBSf/8g0r/o1Uw/wEBAP8AAAD/BwQD/7N1
Rv//p2T/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Jg//mUVf/5klP/+ZJT//qTU//piE7/LxwQ/wAA
AP8AAAD/AAAAoQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAALwAAAO4AAAD/AAAA/4NNLP/8lFT/+ZJT//mSU//5klP/+ZJT//mSU//5klP/+YtP//iB
Sf/4gUn/+IFJ//yDSv+jVTD/AQEA/wAAAP8HBAP/s3VG//+nZP/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7omD/+ZRV//mSU//5klP/+pNT/+mITv8vHBD/AAAA/wAAAP8AAAChAAAAAQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAAAA7gAAAP8AAAD/g00s//yU
VP/5klP/+ZJT//mSU//5klP/+ZJT//mSU//5i0//+IFJ//iBSf/4gUn//INK/6NVMP8BAQD/AAAA/wcE
A/+zdUb//6dk//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uiYP/5lFX/+ZJT//mSU//6k1P/6YhO/y8c
EP8AAAD/AAAA/wAAAKEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAC8AAADuAAAA/wAAAP+DTSz//JRU//mSU//5klP/+ZJT//mSU//5klP/+ZJT//mL
T//4gUn/+IFJ//iBSf/8g0r/o1Uw/wEBAP8AAAD/BwQD/7N1Rv//p2T/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Jg//mUVf/5klP/+ZJT//qTU//piE7/LxwQ/wAAAP8AAAD/AAAAoQAAAAEAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwAAAO4AAAD/AAAA/4NN
LP/8lFT/+ZJT//mSU//5klP/+ZJT//mSU//5klP/+YtP//iBSf/4gUn/+IFJ//yDSv+jVTD/AQEA/wAA
AP8HBQP/tXZH//+oZP/9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2m
Y//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2m
Y//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2m
Y//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2m
Y//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2m
Y//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9o2H//JZW//uTVP/7k1T//ZRU/+yL
T/8wHBD/AAAA/wAAAP8AAAChAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAvAAAA7gAAAP8AAAD/g00s//yUVP/5klP/+ZJT//mSU//5klP/+ZJT//mS
U//5i0//+IFJ//iBSf/4gUn//INK/6NVMP8BAQD/AAAA/wQCAf9WOCL/eE8v/3ZNLv92TS7/dk0u/3ZN
Lv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZN
Lv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZN
Lv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZN
Lv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZN
Lv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZN
Lv92TS7/dk0u/3ZMLf92Rij/dkUn/3VFJ/97SCn/hE0s/x8SCv8AAAD/AAAA/wAAAKEAAAABAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8AAADuAAAA/wAA
AP+DTSz//JRU//mSU//5klP/+ZJT//mSU//5klP/+ZJT//mLT//4gUn/+IFJ//iBSf/8g0r/o1Uw/wEB
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAALwAAAO4AAAD/AAAA/4RNLP/8lFT/+ZJT//mSU//5klP/+ZJT//mS
U//5klP/+YtP//iBSf/4gUn/+IFJ//yDSv+jVTD/AQEA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADKAAAAJQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAA6wAA
AP8AAAD/fUkq//yUVP/5klP/+ZJT//mSU//5klP/+ZJT//mSU//5i0//+IFJ//iBSf/4gUn//INK/6FU
L/8BAAD/AAAA/wEBAf8TEA7/GRYT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkV
E/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkV
E/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkV
E/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkV
E/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkV
E/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRL/GRQQ/xkT
D/8XEg7/CggG/wAAAP8AAAD/AAAA/wAAAP8AAADDAAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADcAAAA/wAAAP9fNyD/+ZJT//mSU//5klP/+ZJT//mS
U//5klP/+ZJT//iJTv/4gUn/+IFJ//iBSf/8g0r/h0Yo/wAAAP8AAAD/DAoJ/6qSgP/cvaX/2bqj/9m6
o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6
o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6
o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6
o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6
o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6
o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZtJf/2KyI/9aqhv+5k3T/alRD/xMPDP8AAAD/AAAA/wAA
AP8AAAClAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAA
AL0AAAD/AAAA/yoZDv/gg0v/+5NU//mSU//5klP/+ZJT//mSU//5kVP/+IZM//iBSf/4gUn/+YFJ//B9
R/9JJhX/AAAA/wAAAP8kHxv/48Kq///dwf//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///b
wP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///b
wP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///b
wP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///b
wP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///b
wP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///a
vv//0Kv//sqf///LoP/7x57/s45x/yIbFf8AAAD/AAAA/wAAAPgAAABWAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAP8AAAD/AgEB/4tRLv/7k1T/+ZJT//mS
U//5klP/+ZJT//mOUf/4gkr/+IFJ//iBSf/8g0r/rloz/wwGBP8AAAD/AAAA/1lNQ//51rv//dm+//3Z
vv/92b7//tq///7av//92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//7a
v//+2r///dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//tq///3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//7av//+2r7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/+2r///tq///3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//tq///7av//92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//7avv/+2r///dm///3WuP/8yqH//Mie//zInv//y6D/rYls/w4L
Cf8AAAD/AAAA/wAAALQAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAvAAAA5gAAAP8AAAD/Gg8J/7ZqPf/8lFT/+pNT//mSU//5klP/+IdN//iBSf/5gUn//INK/81q
PP8vGA7/AAAA/wAAAP8JCAf/sJeE///cwf/92b7//dm+//7av//uzLP/7cuy//7av//92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/+2r//8tC2/+nIr//82L3//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//tq///fUuv/nxq7/+da7//7av//92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//7avv/717z/6Meu//XSuP/+2r///dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+/+vJsP/wzrT//tq///3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//7a
v//vzbT/7Mqx//7Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/+2r//9NG3/+jH
rv/72L3//tm+//zOqf/8yJ7//Mie//3Inv/3xJv/V0U3/wAAAP8AAAD/AAAA5gAAACcAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAACEAAAA/wAAAP8AAAD/HhIK/5pb
M//si0///JRU//2NUP/8hEv//INK//F9R/+vWzT/LxkO/wAAAP8AAAD/AAAA/1VJQP/00bf//tq///3Z
vv//28D/vqOP/zsyLP83Lyn/tZuI///av//92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//9u//9m6
o/9OQzv/LCYh/5WAcP/72L3//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//7av//syrH/Z1hN/ygj
Hv90Y1f/8tC2//7av//92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7/+NW6/4ZzZf8qJB//WU1D/+PD
qv//2r///dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//7avv+mjn3/MSol/0I5Mv/Lrpj//9vA//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv//28D/xamU/z82L/80LCf/rpWD//7av//92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//9q//96/p/9USD//KyQg/415av/61rz//dKw//zInv/8yJ7//Mie///L
of+dfWP/AQEB/wAAAP8AAADvAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAABYAAAC3AAAA/wAAAP8AAAD/BwQC/0AlFf+DSyv/plcx/6dXMf+MSSn/TCgW/w0H
BP8AAAD/AAAA/wAAAP8sJiH/07Wf///bwP/92b7//dm+//rWvP9VSUD/AAAA/wAAAP9MQTn/99S6//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv//3MH/h3Rl/wAAAP8AAAD/JB8b/+PDq///2r///dm+//3Z
vv/92b7//dm+//3Zvv/92b7//9zB/7OZhv8EBAP/AAAA/wwKCf/FqZT//9zA//3Zvv/92b7//dm+//3Z
vv/92b7//dm+///bwP/WuKH/FxMR/wAAAP8AAAD/m4V1///dwf/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/+2r//8M61/zoxK/8AAAD/AAAA/2tcUP/+2r///dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//zZ
vv9fUkj/AAAA/wAAAP9CODH/9NG3//7Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv//3MH/k35u/wAA
AP8AAAD/HBgV/9y9pv//1bT//Mie//zInv/8yJ7//8ug/76Wd/8KCAb/AAAA/wAAAO4AAAAvAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEAAADzAAAA/wAA
AP8AAAD/AAAA/wAAAP8CAQH/AgEB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/5WAcP//3cH//dm+//3Z
vv/92b7//dm+/3NjVv8AAAD/AAAA/2dZTv/717z//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+///c
wf+giXj/BQQE/wAAAP8+NS//7cuy//7av//92b7//dm+//3Zvv/92b7//dm+//3Zvv//3MD/xqqV/xQR
D/8AAAD/IBsY/9W3oP//28D//dm+//3Zvv/92b7//dm+//3Zvv/92b7//9q//+PDqv8vKCP/AAAA/wsJ
CP+ymYb//9zB//3Zvv/92b7//dm+//3Zvv/92b7//dm+//7Zvv/207n/VUlA/wAAAP8AAAD/h3Rm///b
wP/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//tq//31rXv8AAAD/AAAA/15QRv/51bv//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+///cwf+qkoD/CAcG/wAAAP81Lij/58eu//7Us//8yJ7//Mie//zI
nv//y6D/tpBy/wcGBf8AAAD/AAAA7gAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAANQAAAO8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8BAQD/pI17///dwf/92b7//dm+//3Zvv/+2r//5sWs/4l2Z/+FcmT/4cGp//7a
v//92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//tq///PQtv+ahHT/emlc/8+xm//+2r///dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/61rv/r5aD/3ZlWf+5n4v//Ni9//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//tm+/8WplP93Zlr/pI17//fTuf/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//7av//ZuqP/gG1g/5B8bP/syrH//tq///3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/+2r//6civ/415av+CcGL/3b6m//7av//92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//tq+//XS
uP+fiXj/eGda/8mtl//+2r///dCu//zInv/8yJ7//Mie///LoP+Ha1X/AAAA/wAAAP8AAADuAAAALwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAA8AAA
AP8AAAD/KyIb/yohGv8NCgj/BgUE/wYFBP8LCQf/IxwW/zktJP8FBAP/AAAA/wEAAP+ji3r//93B//3Z
vv/92b7//dm+//3Zvv/+2r///9zA///bwP//2r///dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//tq////cwP//28D//9vA//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv//3MD//9vA///bwP/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//9vA///b
wP//3MD//tm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+///bv///28D//9zA//7a
v//92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/+2r///9zA///bwP//2r///dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//tq+///cwP//28D//9vA//3YvP/8zKb//Mie//zI
nv/+yp//57eR/zcrIv8AAAD/AAAA/wAAANkAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAAADwAAAA/wAAAP+Lblf/6LiR/8Sce/+zjnD/so1v/8CY
eP/hs43/uJJ0/woIBv8AAAD/AQAA/6KLev//3cH//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dOz//zJn//8yJ7//8qg//bDmv91XUr/AQEB/wAAAP8AAAD/AAAAkwAA
AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgAA
APAAAAD/AAAA/45xWf//zaL//8ug///LoP//y6D//8ug///Mof++lnf/CggG/wAAAP8AAAD/pY18///h
xf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///d
wf//3MH//tq+//3Zvv/92b7//dm+//7av///3cH//93B///dwf//3cH//93B///dwf//3cH//93B///d
wf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///d
wf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///d
wf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///d
wf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93C///avP//z6f//8ug//3I
nv/cr4r/bldF/wcFBP8AAAD/AAAA/wAAAOQAAAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAA8AAAAP8AAAD/jnFZ///Lof/8yJ7//Mie//zI
nv/8yJ7//8ug/72Wd/8KCAb/AAAA/wAAAP9dUEb/lH9v/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9
bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1u/7Sah//00bf//tq///3Zvv/+2r//6Meu/6aO
fP+RfG3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9
bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9
bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9
bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9
bf+SfW3/kn1t/5J9bf+SfW3/kXdi/5FzW/+OcFn/aFNB/yYeGP8AAAD/AAAA/wAAAP8AAAD5AAAAbgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ADYAAADwAAAA/wAAAP+OcVn//8uh//zInv/8yJ7//Mie//zInv//y6D/vZZ3/woIBv8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/CAcG/456a///2r///tm+//bTuf9fUUf/AQEB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA9wAAAIMAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgAAAPAAAAD/AAAA/45xWf//y6H//Mie//zI
nv/8yJ7//Mie///LoP+9lnf/CggG/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/LykkzvrWvHb/3MB11LafgBMR
D+cAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAANoAAABkAAAABgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAA2AAAA8AAAAP8AAAD/jnFZ///Lof/8yJ7//Mie//zInv/8yJ7//8ug/72Wd/8KCAb/AAAA/wAA
AP8AAAD1AAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
APAAAADwAAAA8AAAAN8AAABSoYp5AOrJsAD///8AAAAAfQAAAOoAAADwAAAA8AAAAPAAAADwAAAA8AAA
APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
APAAAADuAAAA5AAAAMEAAAB6AAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAAADwAAAA/wAAAP+OcVn//8uh//zI
nv/8yJ7//Mie//zInv//y6D/vZZ3/woIBv8AAAD/AAAA/wAAAH4AAAAzAAAANgAAADYAAAA2AAAANgAA
ADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAAIgAAAAEAAAAAAAAAAAAA
AAAAAAAHAAAAKwAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAA
ADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAA
ADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAA
ADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAA
ADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADIAAAAkAAAADAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAANgAAAPAAAAD/AAAA/45xWf//y6H//Mie//zInv/8yJ7//Mie///LoP+9lnf/CggG/wAA
AP8AAAD/AAAAWgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAA8AAAAP8AAAD/jnFZ///L
of/8yJ7//Mie//zInv/8yJ7//8ug/72Wd/8KCAb/AAAA/wAAAP8AAABcAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAADYAAADwAAAA/wAAAP+OcVn//8uh//zInv/8yJ7//Mie//zInv//y6D/vZZ3/woI
Bv8AAAD/AAAA/wAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgAAAPAAAAD/AAAA/45x
Wf//y6H//Mie//zInv/8yJ7//Mie///LoP+9lnf/CggG/wAAAP8AAAD/AAAAXAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAA2AAAA8AAAAP8AAAD/jnFZ///Lof/8yJ7//Mie//zInv/8yJ7//8ug/72W
d/8KCAb/AAAA/wAAAP8AAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAAADwAAAA/wAA
AP+OcVn//8uh//zInv/8yJ7//Mie//zInv//y6D/vZZ3/woIBv8AAAD/AAAA/wAAAFwAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAANgAAAPAAAAD/AAAA/45xWf//y6H//Mie//zInv/8yJ7//Mie///L
oP+9lnf/CggG/wAAAP8AAAD/AAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAA8AAA
AP8AAAD/jnFZ///Lof/8yJ7//Mie//zInv/8yJ7//8ug/72Wd/8KCAb/AAAA/wAAAP8AAABcAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAAADwAAAA/wAAAP+OcVn//8uh//zInv/8yJ7//Mie//zI
nv//y6D/vZZ3/woIBv8AAAD/AAAA/wAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAcAAAAvAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgAA
APAAAAD/AAAA/45xWf//y6H//Mie//zInv/8yJ7//Mie///LoP+9lnf/CggG/wAAAP8AAAD/AAAAXAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAfQAAAO4AAADaAAAAQgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAA8AAAAP8AAAD/jnFZ///Lof/8yJ7//Mie//zI
nv/8yJ7//8ug/72Wd/8KCAb/AAAA/wAAAP8AAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAC4AAADnAAAA/wAAAP8AAACPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ADYAAADwAAAA/wAAAP+OcVn//8uh//zInv/8yJ7//Mie//zInv//y6D/vZZ3/woIBv8AAAD/AAAA/wAA
AFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhQAAAP8AAAD/AAAA/AAA
AGIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgAAAPAAAAD/AAAA/45xWf//y6H//Mie//zI
nv/8yJ7//Mie///LoP+9lnf/CggG/wAAAP8AAAD/AAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAB8AAADXAAAA/wAAAP8AAADRAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAIAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAA2AAAA8AAAAP8AAAD/jnFZ///Lof/8yJ7//Mie//zInv/8yJ7//8ug/72Wd/8KCAb/AAAA/wAA
AP8AAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAP0AAAD/AAAA/wAA
AIsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAALwAAACTAAAAFgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAAADwAAAA/wAAAP+OcVn//8uh//zI
nv/8yJ7//Mie//zInv//y6D/vZZ3/woIBv8AAAD/AAAA/wAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAABDAAAA8wAAAP8AAAD/AAAAvQAAABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ACgAAADhAAAA/wAAAP8AAABnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAANgAAAPAAAAD/AAAA/45xWf//zKH//Mie//zInv/8yJ7//Mie///LoP++lnf/CggG/wAA
AP8AAAD/AAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAACnAAAA/wAA
AP8AAAD8AAAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAP8AAAD/AAAA/gAAAGIAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAA7QAAAP8AAAD/fWNP///M
of/8yJ7//Mie//zInv/8yJ7//8yh/6aEaP8EAwL/AAAA/wAAAP0AAABXAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAADqAAAA/wAAAP8AAADSAAAAHAAAAAAAAAALAAAAJAAA
AFMAAADZAAAA/wAAAP8AAADXAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAABkAAADXAAAA/wAAAP8pIRr/xp18//nGnP/7x53/+8ed//rGnf/ZrIj/QjQp/wAA
AP8AAAD/AAAA7gAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA
AI4AAAD/AAAA/wAAAP4AAACmAAAAjgAAAMAAAADjAAAA+QAAAP8AAAD/AAAA/wAAAIQAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAI0AAAD/AAAA/wAA
AP8cFhL/UUAz/15LO/9eSzv/VkQ2/ycfGP8AAAD/AAAA/wAAAP8AAACyAAAACgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAAANoAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAADmAAAALQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAKwAAAOIAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA9AAAAEkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAlQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADxAAAA0gAAAGcAAAACAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTAAAA8wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD8AAAAbwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAADRAAAA/wAAAP8AAAD9AAAA6AAA
AMYAAACYAAAAZgAAADgAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAALsAAAD/AAAA/wkEAv88Gw//LxYM/ygSCv8oEgr/LBQL/zwc
EP8PBwT/AAAA/wAAAP8AAADTAAAAGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAhQAAAP8AAAD/AAAA/wAAAJ0AAAAoAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAA7gAA
AP8AAAD/WSkX/+prPf/maTz/42g7/+NoO//laTv/7W09/3M1Hv8AAAD/AAAA/wAAAPkAAABOAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUAAADnAAAA/wAAAP8AAADaAAAAJQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFUAAAD8AAAA/wQCAf+mTCv//HNB//hxQP/4ckD/+HJA//hy
QP/7c0H/v1gy/w0GA/8AAAD/AAAA/wAAAHUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAHAAAApQAAAP8AAAD/AAAA/QAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAA
AP4AAAD/BwMC/7dUL//7c0H/93FA//dxQP/3cUD/93FA//pyQf/PXzb/FgoG/wAAAP8AAAD/AAAAgwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAD1AAAA/wAAAP8AAADCAAAAEwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNAAAA+gAAAP8BAAD/k0Mm//tzQf/3cUD/93FA//dx
QP/3cUD/+3NB/65QLf8HAwL/AAAA/wAAAP8AAABoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAATAAAAwQAAAP8AAAD/AAAA9QAAAFEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ACYAAADjAAAA/wAAAP83GQ7/3GU5//tzQf/4cUD/+HFA//tzQf/pazz/TSMU/wAAAP8AAAD/AAAA9wAA
AE8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAIAAAALAAAAEwAAABPAAAAMAAAAHYAAAD9AAAA/wAAAP8AAACmAAAABwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAJ4AAAD/AAAA/wAAAP9IIRP/wFgy/+pr
Pf/sbD3/yFs0/1opF/8DAQH/AAAA/wAAAP8AAAD+AAAA1wAAAH4AAAAXAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAARQAAALEAAADpAAAA+gAA
APsAAADtAAAA8gAAAP8AAAD/AAAA5gAAADUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAMgAAAOEAAAD/AAAA/wAAAP8SCAX/NxkO/zsbD/8WCgb/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAALoAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAgAAAGoAAADtAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAAAgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAOkAAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8FBAP/AAAA/wAAAP8AAAD/AAAA/wAAAKkAAAALAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKAAAA7wAAAP8AAAD/AAAA/wIC
Af8DAwL/AAAA/wAAAP8AAAD/AAAA/wAAAOUAAABRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAMEAAAD5AAAA/wAAAP8AAAD/AAAA/wICAf81KiH/jG9Y/6+L
bv97Yk3/GRQQ/wAAAP8AAAD/AAAA+QAAAFoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAEAAAAL8AAAD/AAAA/wIBAf9IOS3/oH9k/6iFaf9iTj3/Ew8M/wAAAP8AAAD/AAAA/wAA
ANoAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA
AHAAAAD3AAAA/wAAAP8UEA3/i25X/+e3kf//y6D//8uh///KoP+riGv/DgsJ/wAAAP8AAAD/AAAAwgAA
ABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABeAAAA+gAAAP8AAAD/Tz4x/+q6
k///zKH//8uh//nGnP/Dm3r/SDkt/wAAAP8AAAD/AAAA/wAAAIYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAP0AAAD/AQEB/4hsVf/+yqD//smf//zI
nv/8yJ7//cme//jFnP9dSjr/AAAA/wAAAP8AAAD7AAAAYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAEwAAAMUAAAD/AAAA/xIOC//BmXn//8ug//zInv/8yJ7//Mie///Lof/dr4r/LCMc/wAA
AP8AAAD/AAAAyAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAB/AAAA/wAAAP8VEQ3/0qaD///KoP/8yJ7//Mie//zInv/8yJ7//8ug/8Sce/8UEA3/AAAA/wAA
AP8AAADIAAAAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlAAAA/AAAAP8AAAD/Y08+//nF
nP/8yJ7//Mie//zInv/8yJ7//Mie//7Kn/9sVkT/AAAA/wAAAP8AAADgAAAAHgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH0AAAD/AAAA/xMPDP/MooD//8qg//zI
nv/8yJ7//Mie//zInv/8yJ7/+sac/2dSQf8AAAD/AAAA/wAAAP0AAABpAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAGAAAAMwAAAD/AAAA/xcSDv/Jn37//8qg//zInv/8yJ7//Mie//zInv/8yJ7//Mie/2ZR
QP8AAAD/AAAA/wAAAN8AAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAWQAAAPwAAAD/AAAA/4FnUf/+yZ///Mie//zInv/8yJ7//Mie//zInv//yqD/zKKA/xkU
EP8AAAD/AAAA/wAAAM8AAAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABvAAAA/gAAAP8AAAD/bFZE//rH
nf/8yJ7//Mie//zInv/8yJ7//Mie//7Kn//arYn/JR4X/wAAAP8AAAD/AAAAwgAAAA0AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAA2gAAAP8AAAD/IxwW/9ir
h//+yp///Mie//zInv/8yJ7//Mie//zInv/7x53/b1hG/wAAAP8AAAD/AAAA/wAAAHQAAAAAAAAAAAAA
AAAAAAAAAAAAHQAAANMAAAD/AAAA/xoVEf/PpIH//8qg//zInv/8yJ7//Mie//zInv/8yJ7//cmf/31j
Tv8AAAD/AAAA/wAAAP8AAAB7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAB+AAAA/wAAAP8AAAD/eWBM//3Jnv/8yJ7//Mie//zInv/8yJ7//Mie///K
oP/RpoP/HBcS/wAAAP8AAAD/AAAA1gAAAB8AAAAAAAAAAAAAAAAAAAB3AAAA/wAAAP8AAAD/c1tI//zI
nv/8yJ7//Mie//zInv/8yJ7//Mie//7KoP/WqYb/IRoU/wAAAP8AAAD/AAAA2gAAACMAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAADYAAAA/wAA
AP8eGBP/06iE///KoP/8yJ7//Mie//zInv/8yJ7//Mie//zInv93Xkv/AAAA/wAAAP8AAAD/AAAAewAA
AAAAAAAAAAAAIQAAANgAAAD/AAAA/yAZFP/UqIX//8qg//zInv/8yJ7//Mie//zInv/8yJ7//Mie/3Ze
Sv8AAAD/AAAA/wAAAP8AAAB5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHUAAAD/AAAA/wAAAP9yW0j//Mie//zInv/8yJ7//Mie//zI
nv/8yJ7//sqf/9erh/8jHBb/AAAA/wAAAP8AAADaAAAAJAAAAAAAAAB/AAAA/wAAAP8AAAD/fWNO//3J
n//8yJ7//Mie//zInv/8yJ7//Mie///KoP/QpYL/HBYS/wAAAP8AAAD/AAAA0wAAAB0AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAA
ANAAAAD/AAAA/xoVEP/No4H//8qg//zInv/8yJ7//Mie//zInv/8yJ7//cmf/4FmUf8AAAD/AAAA/wAA
AP8AAACBAAAAJwAAAN4AAAD/AAAA/yYeGP/arYn//sqf//zInv/8yJ7//Mie//zInv/8yJ7/+8ed/21X
RP8AAAD/AAAA/wAAAP4AAABvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAawAAAP0AAAD/AAAA/2lTQv/6xp3//Mie//zI
nv/8yJ7//Mie//zInv/+yp//3a+K/yggGf8AAAD/AAAA/wAAAN8AAACsAAAA/wAAAP8AAAD/hWpT//7K
n//8yJ7//Mie//zInv/8yJ7//Mie///KoP/Jn37/FxIO/wAAAP8AAAD/AAAAzQAAABgAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAWAAAAygAAAP8AAAD/FBAN/8WdfP//yqD//Mie//zInv/8yJ7//Mie//zInv/+yp//iWxW/wAA
AP8AAAD/AAAA/wAAAP4AAAD/AAAA/yoiG//fsYz//sqf//zInv/8yJ7//Mie//zInv/8yJ7/+cac/2NP
Pv8AAAD/AAAA/wAAAP0AAABoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAA/AAAAP8AAAD/YEw8//jF
nP/8yJ7//Mie//zInv/8yJ7//Mie//7Jn//hs43/LSQc/wAAAP8AAAD/AAAA/wAAAP8BAQH/jXBY///K
oP/8yJ7//Mie//zInv/8yJ7//Mie///LoP/Dm3r/Ew8M/wAAAP8AAAD/AAAAxwAAABQAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAABMAAADEAAAA/wAAAP8RDgv/wJh4///LoP/8yJ7//Mie//zInv/8yJ7//Mie///K
oP+Rc1v/AgIB/wAAAP8AAAD/AAAA/zIoH//ktY///smf//zInv/8yJ7//Mie//zInv/8yJ7/98Sb/11K
Ov8AAAD/AAAA/wAAAPoAAABfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFsAAAD5AAAA/wAA
AP9ZRzj/9sOa//3Inv/8yJ7//Mie//zInv/8yJ7//smf/+a2kP8yKCD/AAAA/wAAAP8CAgH/lHZd///L
oP/8yJ7//Mie//zInv/8yJ7//Mie///LoP+8lXb/DwwK/wAAAP8AAAD/AAAAvwAAABAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAALsAAAD/AAAA/w4LCf+4knP//8ug//zInv/8yJ7//Mie//zI
nv//yqD//Mie/2JOPf8AAAD/AAAA/xENCv/In37//82i//3Jn//8yJ7//Mie//zInv/9yZ7/9MKZ/1RC
NP8AAAD/AAAA/wAAAPgAAABWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUwAA
APcAAAD/AAAA/08/Mv/zwZj//cme//zInv/9yZ7//Mie/8adfP9oUkH/GhQQ/wAAAP8AAAD/BAMD/z4x
J/+XeF//67qT//7Kn//8yJ7//Mie///LoP+zjnD/CwkH/wAAAP8AAAD/AAAAuAAAAAwAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAtQAAAP8AAAD/CggG/7CMbv//zKH//cmf//fE
m/+Pclr/FxIP/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wICAf9IOS3/06iE//7KoP/9yZ//88GY/0w8
L/8AAAD/AAAA/wAAAPYAAABPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAABMAAAA9AAAAP8AAAD/Oi4k/9irh//9yZ7/j3FZ/wgHBf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP85LST/266K//nGnP+Pclr/BwYE/wAAAP8AAAD/AAAAsQAAAAoAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAACrAAAA/wAAAP8AAAD/LCMc/2RP
P/8VEQ3/AAAA/wAAAP8CAQH/ORoP/3o4IP+GPSP/XysY/xUKBv8AAAD/AAAA/wAAAP9ENiv/VUQ1/wwJ
B/8AAAD/AAAA/wAAAPIAAABGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAADUAAADfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AwEB/24yHP/laTv/+nNB//tz
Qf/2cUD/t1Qw/yYRCv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAjwAAAAUAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAADWAAAA/wAA
AP8AAAD/AAAA/wAAAP89HBD/5mk8//lyQf/3cUD/93FA//dxQP/7c0H/nUgp/wYDAf8AAAD/AAAA/wAA
AP8AAAD/AAAA9wAAAJYAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYAAACIAAAA1QAAAP4AAAD/AAAA/4E7If/7c0H/93FA//dx
QP/3cUD/93FA//lyQP/cZTn/Ig8J/wAAAP8AAAD/AAAA8AAAALIAAABVAAAACAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAABGAAAA9AAAAP8AAAD/kEIl//tzQf/3cUD/93FA//dxQP/3cUD/+HJA/+RoO/8qEwv/AAAA/wAA
AP8AAACrAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoAAADpAAAA/wAAAP9qMBv/+HJA//dx
QP/3cUD/93FA//dxQP/6ckH/y101/xYKBv8AAAD/AAAA/wAAAI8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAADwAAAMUAAAD/AAAA/xwNB//CWTL//HNB//lyQP/4cUD/+nJB//JvP/9pMBv/AAAA/wAA
AP8AAAD9AAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcwAAAP8AAAD/AAAA/y0V
DP+mTCv/4Gc6/+dqPP/OXjX/azEc/wcDAv8AAAD/AAAA/wAAANIAAAAbAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAYAAAAwQAAAP8AAAD/AAAA/wgEAv8nEgr/MRYN/xgLBv8AAAD/AAAA/wAA
AP8AAAD3AAAAYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzAAAAzwAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+AAAAIIAAAAGAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAowAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/QAA
ANQAAABkAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAHAAAAPQAAAH4AAACjAAAAqwAAAJQAAABgAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAEAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////
/////////gAAAAAcAAAAAAAAAAAD//gAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAB/8AAAAAAA
AAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAAf/AA
AAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAA
AH/wAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAA
AAAAAAB/8AAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAB/8AAAAAAA
AAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAAf/AA
AAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAAP/AAAAAAAAAAAAAAAAAA
AB/wAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAA
AAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA/4AAAAAAAAAAAAAAAAAAAP+AAAAAAA
AAAAAAAAAAAAD/wAAAAAAAAAAAAAAAAAAA/+AAAAAAAAAAAAAAAAAAAP/gAAAAAAAAAAAAAAAAAAD/4A
AAAAAAAAAAAAAAAAAA/+AAAAAAAAAAAAAAAAAAAP/gAAAAAAAAAAAAAAAAAAH/4AAAAAAAAAAAAAAAAA
AD/+AAAAAAAAAAAAAAAAAAA//gAAAAAAAAAAAAAAAAAA//4AAAAAAAAAAAAAAAAAAf/+AAB/////////
/////////gAAf/////////////////4AAH/////////////////+AAB//////////////////gAAf///
//////////////4AAH/////////////////+AAB///8B/////////////gAAf///AP////////////4A
AH///gD////////////+AAB///4A/////////////gAAf//+AOB///////////4AAH///gDAf///////
///+AAB///4BwD///////////gAAf//+AIA///////////4AAH///gAAP//////////+AAB///4AAD//
/////////gAAf//+AAB///////////4AAH///wAAf//////////+AAB///8AAP///////////gAAf///
AAD///////////4AAH///gAB///////////+AAB///4AB////////////gAAf//8AH////////////4A
AH///AD////////////+AAAf/wAA/////////////gAAD/4AAf////////////4AAAf8AAP/////////
///+AAAH+AAD/////////////gAAA/gAA/////////////8AAAPwAAH/////////////gAAB8AAB////
/////////8AAAeAAAf/////////////gAADgAAH/////////////4AAAwAAB/////////////+AAAAAA
Af/////////////gAAAAAAH/////////////8AAAAAAB//////////////AAAAAAA//////////////4
AAAAAAP/////////////+AAAAAAD//////////////wAAAAAB//////////////8AAAAAA//////////
/////gAAAAAP//////////////4AAAAAH///////////////AAAAAB///////////////wAAAAA/////
//////////+AAAAAP///////////////gAAAAH///////////////8AAAAB////////////////AAAAA
////////////////4AAAAP///////////////+AAAAH////////////////wAAAB////////////////
+AAAA/////////////////wAAA//////////////////AAAf/////////////////wAAH///////////
//////8AAD//////////////////AAA//////////////////4AAf//////////////////AAP//////
////////////4AH///////////////////wH////////////////////////////////////////////
//////////////////////////////////8=
AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAADAE
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAQgAAAC0AAAAAAAAACAAA
ABEAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKCsrK60hISHBAAAABhsb
G54mJibCFBQUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATExNpKSkpugAA
AAAXFxeeFxcXmwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAAAAA0AAAAACQkJbRER
EcUAAAAAGRkZoRcXF5IAAAAAAAAAAAAAACcAAAANAAAAAAAAAAAAAAAAHx8Ra1NRLrA9PSOLAAAASQUF
BZwLCwvSAAAANBISEroMDAypAAAANwAAABY5OR+8BgYEgQAAABMAAAAAAAAAACUlFWFUVDO6ICAYiF9f
WazV1cfs1NTG38vLveCFhXzDG0lXsjk5NrMAAAATNDQjvjQ0HbAAAAAGAAAAAAAAAAAAAAAAFxcXjiYm
JrNmZl6j5eXW/+Xl1v/l5db/e354ww+z7fA6Oja0ExMTeUpKSr4AAAAnAAAAAAAAAAAAAAAAAAAAAAAA
ADI1NTXAPz87veXl1v/l5db/5eXW/5WaksozXGe0U1NMuCoqKr0bGxuCAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAABGBgYsWBgWrjl5db/5eXW/7y8r90aGhnFMDAtv1VVUbYiIiK1AAAAEwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAwMDEAlJSOYMTEssi8vLKQvLyykNDQxnDY2M5skJCKIBQUFMgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAATcnJvOfV1cjvrq6k1dPTxezFxbjjMzMudAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFDa2s3zkpKIys7OweqwsKTX3NzN9jo6NXMAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEA1fzs7B6mZmYLzl5db/UVFPuby8sN4cHBpkAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBwZZmVlXrhiYly5dXVusG1tZrRaWlSbAAAAHQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALCwt5AAAANgAAAAAAAABNDQ0NhQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOwAAAAIAAAAAAAAAAQQE
BEUAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD8jwAA/p8AAP6fAADkmQAA4AkAAOALAADwAwAA8AcAAPgP
AAD8HwAA/B8AAPwfAAD8HwAA/98AAP//AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ACMAAACFAAAAhwAAAHMAAAA2AAAAAAAAAAAAAAADAAAAMgAAADMAAAAmAAAAGQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAhlBQUL9ZWVnCPDw8wAYGBtwAAAAVAAAAAAAAAG07Ozu/TU1NwDc3N78WFhbJAAAAQwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAcAAAAdwQEBNZZWVnCBQUF1AAAAAQAAAAAAAAAfxISEswWFhbJCwsLzwYG
BskAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEzR8fH8QCAgLOAAAAAAAAAAAAAABhCAgI1woK
CtYAAABuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAzAn5+f4ggICMIAAAAAAAAAAAAA
AF4xMTHAMjIywAAAAF0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBM82NjbABQUFywAA
AAAAAAAAAAAAcTk5Ob8eHh7FAAAASwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOAAAAowAAADUAAAAAAAAAAAAAAAAAAAAABAQE0yMj
I74EBATWAAAAAAAAAAAAAACHHx8fxA0NDdEAAABIAAAAAAAAAAAAAAAAAAAAAAAAABcAAAB9AAAANgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAOQAAAIyOjFDPHh4RxgAAACsAAAAAAAAAAAAA
AAAEBATSNDQ0wAYGBtoAAAAAAAAAAAAAAKIXFxfICAgI2AAAAEgAAAAAAAAAAAAAAAAAAAAPCgoFw0tJ
Kb8AAACDAAAAFwAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIs2Nh7CFBQLzKGeWtiLiE7OAAAAbAAA
AH0AAACnAAAAmQICAuQbGxvGAgIC5QAAAHkAAAB3AAAA00ZGRsAXFxfJAAAAtgAAAJYAAABiAAAAAAAA
AFNraTzELCwZwQAAAJIDAwLhAAAAUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUNBJb/PzHT/x8Rw9hsb
D8YAAAAqBAQEsdXVyO/U1MbjzMy/2sDAs9O0tKjVrq6j1q6uo9aurqPWcnJqvDQ0L7dHR0O0hoZ9vhQU
E8kAAAACAAAAFxoYDsbEwW/0oZ9a1ywrGMAAAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZwUF
AtcQEA/NGhoaxwAAAFIAAACb19fJ8uXl1v/l5db/5eXW/+Xl1v/l5db/5eXW/+Xl1v8gIB3HC4q30guH
stAeHhzKIyMixQAAAAgAAAAwDAwM1QwMCNMWFgzNAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAdh4eHsUQEBDNAAAAmAAAAJPKyr3n5eXW/+Xl1v/l5db/5eXW/+Xl1v/l5db/5eXW/yMj
IMUQuvf4D67o7SsrJ8kdHRzIAAAABAEBAbigoKDkg4OD0AAAAIYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAANCgoKy7e3t/gGBgbSAAAAl8LCteHl5db/5eXW/+Xl1v/l5db/5eXW/+Xl
1v/l5db/EhgayBC//v8NndDdPj46xhsbGMkAAABNGBgYyBYWFsgJCQnPAAAAFgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJERERzS4uLsAAAADvvLyw3uXl1v/l5db/5eXW/+Xl
1v/l5db/5eXW/+Xl1v8FCgvWB1JuwQVDWb9bW1XCFBQTzQoKCs8UFBTIPDw8vwAAAG8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADk4ODi/c3NzyAEBAe3Gxrnk5eXW/+Xl
1v/l5db/5eXW/+Xl1v/k5NX+uLis26ammtKVlYvMg4N6xsjIu+UQEA/QFhYWyZOTk9YBAQHTAAAABAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAN5MTEzAGxsbxs/P
wuvl5db/5eXW/+Xl1v/l5db/5eXW/0tLRb8sLCzADAwM0C8vK8MPDw/NlZWNyxQUE8qKiorTBQUF3wAA
AFEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbxUV
Fc8DAwPk2NjJ8eXl1v/l5db/5eXW/+Xl1v/l5db/sbGm1xYWFMk/Pzu+h4d+xx4eG8aysqfWBwcH2hIS
EskFBQWlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAALCAgIxAcHB9qQkIjNeXlwyFtbVsdJSUTHSUlEx0lJRMdJSUTHSUlEx0lJRMdRUUzCVlZRwFZW
UcACAgLnBgYGsQAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAASAAAAXAAAAIYAAACjAAAAowAAAKAAAACgAAAAoAAAAKAAAACVAAAAkgAA
AJIAAACMAAAAawAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmJGRiMy4uKzUwcG11sLCteLCwrXiwsK14sDA
tN+urqPWn5+Uz5mZj80TExHNAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWycm85+Xl1v/l5db/5eXW/6ur
otVwcGnC2trM9OXl1v/l5db/5eXW/ycnJcMAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJrS0sTt5eXW/+Xl
1v/l5db/w8O345KSiMrU1Mbu5eXW/+Xl1v/l5db/JyclwwAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAo9fX
yfLY2MvzLCwqwzo6NcDl5db/5eXW/35+dcRcXFXAv7+z4OXl1v8fHxzGAAAABAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAABAQGw4ODR+oWFfMcNDQ3REREQzeXl1v/j49P8CAgI1x4eHsUqKifE5eXW/xkZFsQAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAwMC73l5db/5eXW/9fXyPHg4NH55eXW/+Xl1v/MzL7okpKIytray/Xj49T9CAgIuwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAABFxcWyOXl1v/l5db/5eXW/+Xl1v/l5db/5eXW/+Xl1v/l5db/3d3O9ltb
VL8AAABxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQGxBQUFwAUFBcAAAADzAAAAzwAAALoAAACqAAAA4AAA
AL0AAAClAAAAaAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAZwAAAJIAAAACAAAAAAAA
AAAAAAAvAAAAtgAAACsAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDA5gMDAzSAAAAOgAA
AAAAAAAAAAAAAAAAAAAAAABPBwcH2QcHB84AAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZgAA
AIEAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwOfAwMDmgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////8////+Dh///44f//+Of///jn///45//++Mf//HjHx/Bg
wcP4QADD/EAAx/4AAIf+AACP/gAAH/8AAB//AAA//4AAP/+AAH//4AP//+AB///gAf//4AH//+AB///g
Af//4AH//+AD///gB////e////Pz///78///////
</value>
</data>
</root>
\ No newline at end of file
......@@ -42,11 +42,10 @@ namespace AGVControl
}
//Common.logTextBox = new TextBox();
//Common.missionView = new DataGridView();
Common.missionManager = new MissionManager();
Common.log = log4net.LogManager.GetLogger("AgvServer");
Common.log.Info("=====程序开始=====");
ReadConfig();
Common.ReadLinePlace();
//Common.ReadUnlockLineInfo();
Common.mir = new MiR_API();
Common.control = new BLL.Control();
......
......@@ -195,27 +195,10 @@ namespace AGVControl
else
return string.Format("设备:{1}{0}RFID:{2}{0}任务信息:[任务名称={3}][任务状态={4}]{0}当前步骤:{5}{0}执行信息:{6}",
"\r\n", Name, RFID, curJobTaskName, curJobTaskState, Msg, MissionText);
//if (RFID.StartsWith("C"))
//{
// return string.Format("Name:{1}{0}RFID:{2}{0}CurJob:{3}{0}CurJobTaskInfo:[TaskName={4}][TaskID={5}][TaskState={6}]{0}RunInfo:{7}{0}BoxDestInfo:{8}{0}GetRack:{9}{0}MissionText:{10}",
// "\r\n", Name, RFID, CurJob.ToString(), curJobTaskName, curJobTaskID, curJobTaskState, Msg, BoxDestInfo, BLL.AGVManager.GetRackBy(RFID), MissionText);
//}
//else if (RFID.StartsWith("D"))
//{
// return string.Format("Name:{1}{0}RFID:{2}{0}CurJob:{3}{0}CurJobTaskInfo:[TaskName={4}][TaskID={5}][TaskState={6}]{0}RunInfo:{7}{0}BoxDestInfo:{8}{0}MissionText:{9}",
// "\r\n", Name, RFID, CurJob.ToString(), curJobTaskName, curJobTaskID, curJobTaskState, Msg, BoxDestInfo, MissionText);
//}
//else
// return string.Format("Name:{1}{0}RFID:{2}{0}CurJob:{3}{0}CurJobTaskInfo:[TaskName={4}][TaskID={5}][TaskState={6}]{0}RunInfo:{7}{0}MissionText:{8}",
// "\r\n", Name, RFID, CurJob.ToString(), curJobTaskName, curJobTaskID, curJobTaskState, Msg, MissionText);
}
else
return string.Format("设备:{1}{0}RFID:{2}{0}任务信息:[任务名称={3}][任务状态={4}]{0}执行信息:{5}",
"\r\n", Name, RFID, curJobTaskName, curJobTaskState, MissionText);
//return string.Format("Name:{1}{0}RFID:{2}{0}CurTaskInfo:[TaskName={3}][TaskID={4}][TaskState={5}]{0}MissionText:{6}",
// "\r\n", Name, RFID, curJobTaskName, curJobTaskID, curJobTaskState, MissionText);
}
/// <summary>
/// 任务重发
......@@ -365,39 +348,6 @@ namespace AGVControl
}
Position = position;
}
//public void GetPlace(int value)
//{
// // Common.log.Debug(Name + " PLC20=" + value);
// if (value == 0)
// {
// Place = "";
// PlaceState = ePlaceState.None;
// }
// else if (value > 0 && value < 1000)
// {
// //Place = "";
// //PlaceState = PlaceState.None;
// //TaskSend = "";
// }
// else if (value >= 1000)
// {
// int a = value / 1000;
// int b = (value - a * 1000) / 10;
// int c = value - a * 1000 - b * 10;
// //if (c.Equals(1) || c.Equals(3) || c.Equals(5))//Move,Enter,Leave
// // TaskSend = "";
// Place = (char)(64 + a) + b.ToString();
// if (Common.nodeInfo != null && Common.nodeInfo.Count != 0)
// {
// ClientNode node = Common.nodeInfo.Find(s => s.Name == Place);
// if (node != null)
// PlaceAliceName = node.AliceName;
// else
// PlaceAliceName = Place;
// }
// PlaceState = (ePlaceState)c;
// }
//}
public string[] ToRow()
{
......
......@@ -41,7 +41,11 @@ namespace AGVControl
{
Name = name;
}
/// <summary>
/// 状态比较
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public bool StateEquals(eNodeStatus obj)
{
return nodeStatus.Equals(obj);
......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AGVControl
{
public class UnlockedShelf
{
/// <summary>
/// 已解绑料架信息
/// </summary>
/// <param name="nodeName"></param>
public UnlockedShelf()
{
Rfids = new Dictionary<string, string>();
}
/// <summary>
/// 空料架数量
/// </summary>
public int EmptyCnt { get; set; }
public string NodeName;
/// <summary>
/// 解绑的RFID及时间
/// </summary>
public Dictionary<string, string> Rfids { get; set; }
public List<string> GetRfids()
{
if (Rfids == null || Rfids.Count <= 0)
return new List<string>();
return Rfids.Keys.ToList<string>();
}
public Dictionary<string, string> GetRfidWithTime()
{
if (Rfids == null || Rfids.Count <= 0)
return new Dictionary<string, string>();
return Rfids;
}
/// <summary>
///添加解绑的空料架,如果RFID相同,不增加数量
/// </summary>
public bool Add(string rfid)
{
if (!rfid.Equals("") && !Rfids.Keys.Contains(rfid))
{
if (EmptyCnt < 0)
{
EmptyCnt = 0;
if (Rfids.Count > 0)
Rfids.Clear();
}
int tmp = EmptyCnt;
System.Threading.Interlocked.Increment(ref tmp);
EmptyCnt = tmp;
Rfids.Add(rfid, DateTime.Now.ToString("yyyy/MM/dd/HH:mm:ss,fff"));
return true;
}
return false;
}
/// <summary>
/// 删除一个解绑任务
/// </summary>
public bool Delete(string rfid)
{
if (EmptyCnt > 0)
{
if (!rfid.Equals("") && Rfids.Keys.Contains(rfid))
{
int tmp = EmptyCnt;
System.Threading.Interlocked.Decrement(ref tmp);
EmptyCnt = tmp;
if (EmptyCnt.Equals(0) && Rfids.Count > 0)
{
Rfids.Clear();
}
if (rfid.Equals(SettingString.C4FeederOut) || rfid.Equals(SettingString.D4FeederOut))
Rfids.Remove(rfid);
return true;
}
}
else if (Rfids.Count > 0)
{
EmptyCnt = 0;
Rfids.Clear();
return true;
}
return false;
}
}
}
......@@ -49,23 +49,31 @@ namespace AGVControl
{
string msg = agv.Name + " ";
bool rtn = false;
runInfo = "";
agv.Msg = runInfo;
//if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st))
// CurTaskState = st;
//runInfo = "充电任务:";
CurTaskState = Common.GetTakJobState(CurTaskID);
if (ChargeStep.IsStep(CHARGE_STEP.NONE))
{
if (agv.Battery > Common.chargeStatus.chargeMax)
{
if (agv.Place.Equals(SettingString.Standby))//在待机位不操作
if (agvPlace.Equals(SettingString.Standby) || agvPlace.Equals(""))//在待机位不操作
{
ChargeStep.ToNextStep(CHARGE_STEP.END);
runInfo = "在待机位,电量充足[" + agv.Battery + "%],等待任务";
msg += runInfo;
ChargeStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix) && Common.CheckIsInAirDoor(agvPlace))
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "电量充足[" + agv.Battery + "%],从当前位置" + agvPlace + "回到待机位,先过4C风淋门";
msg += runInfo;
ChargeStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR);
......@@ -89,7 +97,17 @@ namespace AGVControl
}
else
{
if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
if (agvPlace.StartsWith(SettingString.C4_Name_Prefix) && Common.CheckIsInAirDoor(agvPlace))
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + Common.chargeStatus.chargeMax + "%],从当前位置" + agvPlace + "回到充电位,先过4C风淋门";
msg += runInfo;
ChargeStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + Common.chargeStatus.chargeMax + "%],从当前位置" + agvPlace + "回到充电位,先到4D门";
......@@ -123,7 +141,18 @@ namespace AGVControl
}
}
else if (ChargeStep.IsStep(CHARGE_STEP.WAIT_AGV_REACH_AIR_DOOR))
{
if (Common.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "电量充足[" + agv.Battery + "%],从当前位置" + agvPlace + "回到待机位,先到4D门";
msg += runInfo;
ChargeStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (ChargeStep.IsStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR))
{
if (Common.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState))
......@@ -166,7 +195,7 @@ namespace AGVControl
if (Common.CheckTaskFinished(agv, CurTaskName))
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK);
runInfo = "充电任务分配完成,去充电等待任务";
runInfo = "充电任务分配完成,去充电等待任务";
msg += runInfo;
ChargeStep.Msg = msg;
}
......@@ -213,20 +242,12 @@ namespace AGVControl
Job job = Common.control.GetJob(agv);
if (job != null && !(job is ChargeJob))
{
runInfo = "充电过程检测到任务,电量[" + agv.Battery + "%]大于最小电量[" + Common.chargeStatus.chargeMin + "%],中断充电执行任务";
runInfo = "充电过程检测到任务,电量[" + agv.Battery + "%]大于最小电量[" + Common.chargeStatus.chargeMin + "%],中断充电执行任务";
msg += runInfo;
ChargeStep.Msg = msg;
Common.chargeStatus.ClearRandomChargeInfo(agv);
return job;
}
//else if (job == null && agv.Battery < Common.chargeStatus.chargeMax / 2)
//{
// ChargeStep.ToNextStep(CHARGE_STEP.NONE);
// runInfo = "在待机位暂无任务,且当前电量小于" + Common.chargeStatus.chargeMax / 2 + "%,去充电位";
// msg += runInfo;
// ChargeStep.Msg = msg;
// Common.chargeStatus.ClearRandomChargeInfo(agv);
//}
}
}
......@@ -291,7 +312,10 @@ namespace AGVControl
///
/// </summary>
NONE,
/// <summary>
/// 等待到达风淋门
/// </summary>
WAIT_AGV_REACH_AIR_DOOR,
/// <summary>
/// 等待到达4D门
/// </summary>
......
......@@ -51,9 +51,8 @@ namespace AGVControl
{
string msg = agv.Name + " ";
bool rtn = false;
agv.Msg = runInfo;
//if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st))
// CurTaskState = st;
agv.Msg = "返回任务:"+runInfo;
// runInfo = "返回任务:";
CurTaskState = Common.GetTakJobState(CurTaskID);
if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.NONE))
{
......@@ -61,20 +60,62 @@ namespace AGVControl
if (Common.FindEmptyShelfNode(agv, out string nodeName, true))
{
int i = Common.agvInfo.FindIndex(s => s.CurJob is GoEmptyShelfLineJob && ((GoEmptyShelfLineJob)s.CurJob).EmptyShelfPlace.Equals(nodeName));
if(i==-1)
if (i == -1)
{
runInfo= "小车在产线 " + agvPlace + " 准备返回时检测到 " + nodeName + " 有空料架";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
return new GoEmptyShelfLineJob(agvPlace, nodeName);
ClientNode clientNode = Common.nodeInfo.Find(s => s.Name.Equals(nodeName));
if (Common.CheckStationState(clientNode, out string rfid))
{
runInfo = "小车在产线 " + agvPlace + " 准备返回时检测到 " + nodeName + " 有空料架";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
return new GoEmptyShelfLineJob(agvPlace, nodeName, rfid);
}
else
{
if (Common.CheckIsInAirDoor(agvPlace))
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "从产线" + agvPlace + "回待机位,先过4C风淋门";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "从产线" + agvPlace + "回待机位,先到4D门";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY);
runInfo = "从产线" + agvPlace + "回待机位";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
}
else
{
if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
if (Common.CheckIsInAirDoor(agvPlace))
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "从产线" + agvPlace + "回待机位,先过4C风淋门";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo= "从产线" + agvPlace + "回待机位,先到4D门";
runInfo = "从产线" + agvPlace + "回待机位,先到4D门";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
......@@ -83,22 +124,30 @@ namespace AGVControl
else
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY);
runInfo= "从产线" + agvPlace + "回待机位";
msg += runInfo;
runInfo = "从产线" + agvPlace + "回待机位";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
//EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.END);
}
else
{
if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
if (Common.CheckIsInAirDoor(agvPlace))
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "从产线" + agvPlace + "回待机位,先过4C风淋门";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo= "从产线" + agvPlace + "回待机位,先到4D门";
runInfo = "从产线" + agvPlace + "回待机位,先到4D门";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
......@@ -107,7 +156,7 @@ namespace AGVControl
else
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY);
runInfo= "从产线" + agvPlace + "回待机位";
runInfo = "从产线" + agvPlace + "回待机位";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby);
......@@ -118,19 +167,19 @@ namespace AGVControl
else if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.Standby,CurTaskState))
if (Common.CheckTaskFinished(agv, SettingString.Standby, CurTaskState))
{
Job job = Common.control.GetJob(agv);
if (job == null && agv.Battery < Common.chargeStatus.chargeMax)
{
runInfo= "到达待机位,电量[" + agv.Battery + "]小于最大电量[" + Common.chargeStatus.chargeMax + "],暂无任务,去充电";
runInfo = "到达待机位,电量[" + agv.Battery + "]小于最大电量[" + Common.chargeStatus.chargeMax + "],暂无任务,去充电";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
return new ChargeJob("");
}
else
{
runInfo= "到达待机位,检测到新任务,执行任务";
runInfo = "到达待机位,检测到新任务,执行任务";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
return job;
......@@ -141,31 +190,27 @@ namespace AGVControl
{
if (Common.FindFullShelfTask(agv))
{
runInfo= "从产线" + agvPlace + "回待机位过程中,检测到A6出满料,去A6";
runInfo = "从产线" + agvPlace + "回待机位过程中,检测到A6出满料,去A6";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
return new GoFullShelfStationJob(SettingString.Standby);
}
//else
//{
// msg = "从产线" + agvPlace + "到达4D门,暂无任务,去充电位";
// EmptyAGVBackStep.Msg = msg;
// return new ChargeJob(SettingString.D4_DOOR_Name);
//}
}
}
//else if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR))
//{
// CurTaskState = Common.GetTakJobState(CurTaskID);
// if (Common.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState))
// {
// EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY);
// runInfo = "从产线" + agvPlace + "回待机位";
// msg += runInfo;
// EmptyAGVBackStep.Msg = msg;
// }
//}
else if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "从产线" + agvPlace + "回待机位,先到4D门";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
......@@ -180,7 +225,7 @@ namespace AGVControl
}
else
{
runInfo = "从产线" + agvPlace + "到达4D门,暂无任务,去充电位";
runInfo = "从产线" + agvPlace + "到达4D门,暂无任务,去充电位";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
return new ChargeJob(SettingString.DoorCToD);
......@@ -189,8 +234,6 @@ namespace AGVControl
}
return this;
}
/// <summary>
/// AGV回收空料架流程
/// </summary>
......@@ -200,7 +243,10 @@ namespace AGVControl
/// 查询任务
/// </summary>
NONE,
/// <summary>
/// 等待到达4C风淋门
/// </summary>
WAIT_AGV_REACH_AIR_DOOR,
/// <summary>
/// 等待到达4D门
/// </summary>
......
......@@ -62,16 +62,23 @@ namespace AGVControl
{
string msg = agv.Name+ " ";
bool rtn = false;
agv.Msg = runInfo;
//if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st))
// CurTaskState = st;
agv.Msg = "空料架返回:"+runInfo;
//runInfo = "空料架返回:";
if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.NONE))
{
if (EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4C车间
if (Common.CheckIsInAirDoor(EmptyShelfPlace))//4C车间
{
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "从产线[" + EmptyShelfPlace + "]前往4C风淋门";
msg += runInfo;
EmptyBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4C车间
{
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR);
runInfo= "空料架从产线" + EmptyShelfPlace + "前往4D门";
runInfo = "从产线[" + EmptyShelfPlace + "]前往4D门";
msg += runInfo;
EmptyBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
......@@ -83,7 +90,7 @@ namespace AGVControl
{
EmptyShelfTargetPlace = nodeName;
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
runInfo= "空料架从产线 [" + EmptyShelfPlace + "] 送往双层线" + EmptyShelfTargetPlace;
runInfo = "从产线 [" + EmptyShelfPlace + "]送往双层线" + EmptyShelfTargetPlace;
msg += runInfo;
EmptyBackStep.Msg = msg;
if (!EmptyShelfTargetPlace.Equals(""))
......@@ -91,12 +98,12 @@ namespace AGVControl
Common.MoveToNode(agv, EmptyShelfTargetPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else
{
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
runInfo= "双层线暂不需要空料架,从产线[" + EmptyShelfPlace + "]到待机位";
runInfo = "双层线暂不需要空料架,从产线[" + EmptyShelfPlace + "]到待机位";
msg += runInfo;
EmptyBackStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby);
......@@ -104,6 +111,19 @@ namespace AGVControl
}
}
}
else if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
{
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR);
runInfo = "出风淋门,前往4D门";
msg += runInfo;
EmptyBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
......@@ -113,7 +133,7 @@ namespace AGVControl
{
EmptyShelfTargetPlace = nodeName;
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
runInfo= "空料架从产线 [" + EmptyShelfPlace + "] 送往双层线" + EmptyShelfTargetPlace;
runInfo = "进4D门,送往双层线" + EmptyShelfTargetPlace;
msg += runInfo;
EmptyBackStep.Msg = msg;
Common.MoveToNode(agv, EmptyShelfTargetPlace);
......@@ -122,7 +142,7 @@ namespace AGVControl
else
{
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
runInfo= "双层线暂不需要空料架,从产线[" + EmptyShelfPlace + "]到待机位";
runInfo = "进4D门,双层线暂不需要空料架,到待机位";
msg += runInfo;
EmptyBackStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby);
......@@ -137,7 +157,7 @@ namespace AGVControl
{
EmptyShelfTargetPlace = nodeName;
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
runInfo= "待机位检测到双层线需要料架,送往双层线 " + EmptyShelfTargetPlace;
runInfo = "待机位检测到双层线需要料架,送往双层线 " + EmptyShelfTargetPlace;
msg += runInfo;
EmptyBackStep.Msg = msg;
Common.MoveToNode(agv, EmptyShelfTargetPlace);
......@@ -149,11 +169,8 @@ namespace AGVControl
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, EmptyShelfTargetPlace, CurTaskState) && EmptyShelfTargetPlace.StartsWith("A"))
{
//msg = "AGV到达 " + EmptyShelfTargetPlace;
//EmptyBackStep.Msg = msg;
//return new EnterLeaveShelfJob(EmptyShelfTargetPlace,eEnterLeaveType.Leave,shelfType);
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_DOUBLE_LINE_RESPONSE);
runInfo= "AGV到达 " + EmptyShelfTargetPlace + ",并发送入料架请求[ReadyEnter]";
runInfo = "AGV到达 " + EmptyShelfTargetPlace + ",并发送入料架请求[ReadyEnter]";
msg += runInfo;
EmptyBackStep.Msg = msg;
Common.server.ReadyEnter(EmptyShelfTargetPlace);
......@@ -165,7 +182,7 @@ namespace AGVControl
ClientNode node = Common.nodeInfo[id];
if (node.StateEquals(eNodeStatus.MayEnter))
{
if(!agv.CurTaskName.Equals("Leave"))
if (!agv.CurTaskName.Equals("Leave"))
{
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT__EMPTY_SHELF_IN_DOUBLE_LINE);
runInfo = "收到双层线入料架请求[ReadyEnter]的响应 " + EmptyShelfTargetPlace + "入料架,小车链条运行";
......@@ -179,57 +196,34 @@ namespace AGVControl
else if (EmptyBackStep.IsTimeOut(15000, out double timeOutValue))
{
tryTimes++;
if (tryTimes < 5)
if (tryTimes < 3)
return this;
// if(EmptyShelfTargetPlace.Equals(SettingString.A6))
// {
tryTimes = 0;
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
runInfo = "双层线"+ EmptyShelfTargetPlace + "暂不需要空料架,从[" + EmptyShelfTargetPlace + "]到待机位";
msg += runInfo;
EmptyBackStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
// }
//else if(EmptyShelfTargetPlace.Equals(SettingString.A5))
//{
// tryTimes = 0;
// EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
// runInfo = "双层线A5暂不需要空料架,从[" + EmptyShelfTargetPlace + "]到待机位";
// msg += runInfo;
// EmptyBackStep.Msg = msg;
// Common.MoveToNode(agv, SettingString.Standby);
// UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
//}
//else
//{
// EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
//}
// EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
//runInfo= "AGV到达 " + EmptyShelfTargetPlace + ",15秒后重新向双层线发送入料架请求[ReadyEnter]";
//msg += runInfo;
//EmptyBackStep.Msg = msg;
tryTimes = 0;
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
runInfo = "双层线" + EmptyShelfTargetPlace + "暂不需要空料架,从[" + EmptyShelfTargetPlace + "]到待机位";
msg += runInfo;
EmptyBackStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT__EMPTY_SHELF_IN_DOUBLE_LINE))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckEnterOrLeaveFinished(agv,"Leave",CurTaskState))
if (Common.CheckEnterOrLeaveFinished(agv, "Leave", CurTaskState))
{
//EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.END);
agv.RFID = "";
Job job = Common.control.GetJob(agv);
if (job != null)
{
runInfo= "在双层线检测到任务,执行任务";
runInfo = "在双层线检测到任务,执行任务";
msg += runInfo;
EmptyBackStep.Msg = msg;
return job;
}
else
{
runInfo= "空料架进入" + EmptyShelfTargetPlace + "完成,暂无任务,回充电位";
runInfo = "空料架进入" + EmptyShelfTargetPlace + "完成,暂无任务,回充电位";
msg += runInfo;
EmptyBackStep.Msg = msg;
agv.RFID = "";
......@@ -240,10 +234,7 @@ namespace AGVControl
}
else if (EmptyBackStep.IsTimeOut(60000, out double timeOutValue))
{
//链条停止
runInfo= "空料架在[" + EmptyShelfTargetPlace + "]离开小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架离开小车的情况";
//msg += runInfo;
//EmptyBackStep.Msg = msg;
runInfo = "空料架在[" + EmptyShelfTargetPlace + "]离开小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架离开小车的情况";
}
}
......@@ -264,6 +255,10 @@ namespace AGVControl
/// </summary>
NONE,
/// <summary>
/// 等待到达4C风淋门
/// </summary>
WAIT_AGV_REACH_AIR_DOOR,
/// <summary>
/// 等待AGV到达门
/// </summary>
WAIT_AGV_REACH_DOOR,
......
......@@ -176,7 +176,7 @@ namespace AGVControl
runInfo = "料架在" + LineName + "出去完成 [" + RFID + "]";
msg += runInfo;
EnterLeaveShelfStep.Msg = msg;
Common.DelEmptyShelfTask(LineName);
Common.missionManager.DelMission(LineName,RFID);
return new EmptyShelfBackJob(LineName,eShelfType.BigShelf);
}
else if (EnterLeaveShelfStep.IsTimeOut(60000, out double timeOutValue))
......
......@@ -19,12 +19,13 @@ namespace AGVControl
/// </summary>
/// <param name="agvPlae">小车当前位置,空表示在待机位</param>
/// <param name="palce">空料架位置点</param>
public GoEmptyShelfLineJob(string agvPlae, string palce)
public GoEmptyShelfLineJob(string agvPlae, string palce, string rfid)
{
EmptyShelfPlace = palce;
this.agvPlae = agvPlae;
RFID = rfid;
}
public string RFID { get; set; }
/// <summary>
/// 空料架位置点
/// </summary>
......@@ -56,54 +57,184 @@ namespace AGVControl
{
string msg = agv.Name + " ";
bool rtn = false;
agv.Msg = runInfo;
agv.Msg = "回收空料架任务:"+runInfo;
//runInfo = "回收空料架任务:";
int nodeIdx = Common.FindNode(EmptyShelfPlace);
//if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st))
// CurTaskState = st;
if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.NONE))
{
if (agvPlae.StartsWith(SettingString.C4_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.D4_Name_Prefix))//4C->4D
if (agvPlae.StartsWith(SettingString.C4_Name_Prefix)&& Common.CheckIsInAirDoor(agvPlae) && !Common.CheckIsInAirDoor(EmptyShelfPlace))//4C风淋门内->风淋门外
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "去空料架产线" + EmptyShelfPlace + ",先前往4D门[" + agvPlae + "->" + EmptyShelfPlace + "]";
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_OUT_DOOR);
runInfo = "去产线" + EmptyShelfPlace + ",先过风淋门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if ((agvPlae.StartsWith(SettingString.D4_Name_Prefix) || agvPlae.StartsWith("A") || agvPlae.Equals(SettingString.Standby) || agvPlae.Equals(SettingString.AutoCharge))
&& EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4D->4C
else if (!Common.CheckIsInAirDoor(agvPlae) && Common.CheckIsInAirDoor(EmptyShelfPlace))//4C风淋门外->风淋门内
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4C_DOOR);
runInfo= "去空料架产线" + EmptyShelfPlace + ",先前往4C门[" + agvPlae + "->" + EmptyShelfPlace + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorDToC);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
if (agvPlae.StartsWith(SettingString.C4_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4C->4C
{
if (Common.Check4CTarget(agv, EmptyShelfPlace))//被占用
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.MoveTo4CStandy(agv);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_IN_DOOR);
runInfo = "去产线" + EmptyShelfPlace + ",先过风淋门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirIn);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if ((agvPlae.StartsWith(SettingString.D4_Name_Prefix) || agvPlae.StartsWith("A") || agvPlae.Equals(SettingString.Standby) ||
agvPlae.Equals(SettingString.AutoCharge))
&& EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4D->4C
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4C_DOOR);
runInfo = "去产线" + EmptyShelfPlace + ",先过4C门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorDToC);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if(agvPlae.StartsWith(SettingString.C4_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))
else//起始与目的地在风淋门同一侧
{
if(Common.Check4CTarget(agv, EmptyShelfPlace))//被占用
if (agvPlae.StartsWith(SettingString.C4_Name_Prefix) && Common.CheckIsInAirDoor(agvPlae) && Common.CheckIsInAirDoor(EmptyShelfPlace))//都在风淋门内
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位";
if (Common.Check4CTarget(agv, EmptyShelfPlace))//被占用
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_OUT_DOOR);
runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先过风淋门,再到临时待机位" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
}
}
else if(agvPlae.Equals("")|| (!Common.CheckIsInAirDoor(agvPlae)) && !Common.CheckIsInAirDoor(EmptyShelfPlace))//都在风淋门外
{
if (agvPlae.StartsWith(SettingString.C4_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4C->4C
{
if (Common.Check4CTarget(agv, EmptyShelfPlace))//被占用
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.MoveTo4CStandy(agv);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
}
}
else if (agvPlae.StartsWith(SettingString.C4_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.D4_Name_Prefix))//4C->4D
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "去产线" + EmptyShelfPlace + ",先过4D门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if ((agvPlae.StartsWith(SettingString.D4_Name_Prefix) || agvPlae.StartsWith("A") || agvPlae.Equals(SettingString.Standby) ||
agvPlae.Equals(SettingString.AutoCharge))
&& EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4D->4C
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4C_DOOR);
runInfo = "去产线" + EmptyShelfPlace + ",先过4C门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorDToC);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else//4D->4D
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
}
}
}
}
else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_OUT_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
{
//4C风淋门内->风淋门外,到达风淋门外
if (agvPlae.StartsWith(SettingString.C4_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4C->4C
{
if (Common.Check4CTarget(agv, EmptyShelfPlace))//被占用
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
runInfo = "到风淋门外,目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.MoveTo4CStandy(agv);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "到风淋门外,开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
}
}
else if (agvPlae.StartsWith(SettingString.C4_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.D4_Name_Prefix))//4C->4D
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "到风淋门外,去产线" + EmptyShelfPlace + ",先过4D门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.MoveTo4CStandy(agv);
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
}
//都在风淋门内,到达风淋门外
else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]";
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
runInfo = "到风淋门外,目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.MoveTo4CStandy(agv);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else
}
else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_IN_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorAirIn, CurTaskState))
{
//4C风淋门外->风淋门内
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo= "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]";
runInfo = "到达风淋门内,开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
}
......@@ -116,7 +247,7 @@ namespace AGVControl
if (Common.Check4CTarget(agv, EmptyShelfPlace))//被占用
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位";
runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.MoveTo4CStandy(agv);
......@@ -124,10 +255,22 @@ namespace AGVControl
}
else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
if(Common.CheckIsInAirDoor(EmptyShelfPlace))
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_IN_DOOR);
runInfo = "去产线" + EmptyShelfPlace + ",先过风淋门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirIn);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
}
}
}
}
......@@ -139,7 +282,7 @@ namespace AGVControl
if (!Common.Check4CTarget(agv, EmptyShelfPlace))//未占用
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]";
runInfo = "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.DeleteStandyInfo(agv);
......@@ -152,7 +295,7 @@ namespace AGVControl
if (Common.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState))
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]";
runInfo = "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
}
......@@ -163,7 +306,7 @@ namespace AGVControl
if (nodeIdx > -1)
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_START_TASK);
runInfo= "AGV 添加任务:移动到" + EmptyShelfPlace;
runInfo = "AGV 添加任务:移动到" + EmptyShelfPlace + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.MoveToNode(agv, EmptyShelfPlace);
......@@ -172,7 +315,7 @@ namespace AGVControl
else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo= EmptyShelfPlace + " 不存在或未开启调用";
runInfo = EmptyShelfPlace + " 不存在或未开启调用";
msg += runInfo;
TakeEmptyStep.Msg = msg;
}
......@@ -182,7 +325,7 @@ namespace AGVControl
if (agv.CurTaskState.Equals(SettingString.Executing))
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_PLACE);
runInfo= "AGV开始向目的地[" + EmptyShelfPlace + "]移动";
runInfo = "AGV开始向目的地[" + EmptyShelfPlace + "]移动" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
}
......@@ -202,7 +345,7 @@ namespace AGVControl
//else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_LINE_RESPONSE);
runInfo= "AGV到达 " + EmptyShelfPlace + " 向产线发送出料架请求[ReadyLeave]";
runInfo = "AGV到达 " + EmptyShelfPlace + " 向产线发送出料架请求[ReadyLeave]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
if (nodeIdx == -1)
......@@ -221,9 +364,9 @@ namespace AGVControl
}
else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_LINE_RESPONSE))
{
if(nodeIdx==-1)
if (nodeIdx == -1)
{
runInfo= EmptyShelfPlace + " 未开启调用";
runInfo = EmptyShelfPlace + " 未开启调用";
msg += runInfo;
TakeEmptyStep.Msg = msg;
return this;
......@@ -235,7 +378,7 @@ namespace AGVControl
if (!agv.CurTaskName.Equals("Enter"))
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_TAKE_EMPTY_SHELF);
runInfo = "收到产线出料请求[ReadyLeave]的响应 " + EmptyShelfPlace + "出料架,小车链条运行";
runInfo = "收到产线出料请求[ReadyLeave]的响应 " + EmptyShelfPlace + "出料架,小车链条运行" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
//agv.RFID = node.RFID;
......@@ -247,9 +390,6 @@ namespace AGVControl
else if (TakeEmptyStep.IsTimeOut(15000, out double timeOutValue))
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_PLACE);
//runInfo = "AGV到达 " + EmptyShelfPlace + ",15秒后重新向产线发送出料架请求[ReadyLeave]";
//msg += runInfo;
//TakeEmptyStep.Msg = msg;
}
}
else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_TAKE_EMPTY_SHELF))
......@@ -258,19 +398,19 @@ namespace AGVControl
if (Common.CheckEnterOrLeaveFinished(agv, "Enter", CurTaskState))
{
ClientNode node = Common.nodeInfo[nodeIdx];
node.AgvName = "";
//回收空料架数量减少1
Common.DelEmptyShelfTask(EmptyShelfPlace);
runInfo= "空料架在[" + EmptyShelfPlace + "]进入小车完成";
Common.missionManager.DelMission(EmptyShelfPlace, RFID);
if (!agvPlae.Equals(SettingString.D4FeederOut) && !agvPlae.Equals(SettingString.C4FeederOut))
AGVManager.ClearRFID(EmptyShelfPlace, RFID);
runInfo = "空料架在[" + EmptyShelfPlace + "]进入小车完成" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
//4DfeederOut默认大料架
if (agv.Place.Equals(SettingString.D4FeederOut))
return new EmptyShelfBackJob(EmptyShelfPlace, eShelfType.BigShelf);
if (agv.Place.Equals(SettingString.C4FeederOut))
return new EmptyShelfBackJob(EmptyShelfPlace, eShelfType.BigShelf);
else if (agv.RFID.StartsWith("D"))
return new EmptyShelfBackJob(EmptyShelfPlace, eShelfType.SmallShelf);
}
else if (agv.RFID.StartsWith("C"))
{
return new EmptyShelfBackJob(EmptyShelfPlace, eShelfType.BigShelf);
......@@ -281,8 +421,8 @@ namespace AGVControl
else if (TakeEmptyStep.IsTimeOut(60000, out double timeOutValue))
{
//链条停止
runInfo = "空料架在[" + EmptyShelfPlace + "]进入小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架进入小车的情况";
// msg += runInfo;
runInfo = "空料架在[" + EmptyShelfPlace + "]进入小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架进入小车的情况" + "[RFID=" + RFID + "]";
// msg += runInfo;
//TakeEmptyStep.Msg = msg;
}
......@@ -306,6 +446,14 @@ namespace AGVControl
/// </summary>
NONE,
/// <summary>
/// 等待到达4C风淋门内
/// </summary>
WAIT_AGV_REACH_AIR_IN_DOOR,
/// <summary>
/// 等待到达4C风淋门外
/// </summary>
WAIT_AGV_REACH_AIR_OUT_DOOR,
/// <summary>
/// 等待到达4C门
/// </summary>
WAIT_AGV_REACH_4C_DOOR,
......
......@@ -56,7 +56,8 @@ namespace AGVControl
{
string msg = agv.Name + " ";
bool rtn = false;
agv.Msg = runInfo;
agv.Msg = "去云仓接满料任务:"+runInfo;
//runInfo = "去云仓接满料任务:";
//if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st))
// CurTaskState = st;
if (GoFullShelfStationStep.IsStep(GO_FULL_SHELF_STATION_STEP.NONE))
......@@ -89,7 +90,7 @@ namespace AGVControl
}
else if (input != null && !input[3])
{
if (agvPlace.Equals(SettingString.Standby) || agvPlace.StartsWith(SettingString.AutoCharge))//待机位/充电位接到任务
if (agvPlace.Equals("") || agvPlace.Equals(SettingString.Standby) || agvPlace.StartsWith(SettingString.AutoCharge))//待机位/充电位接到任务
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6);
runInfo = "无负载,准备运动到入料口" + FullShelfStationPlace;
......@@ -98,6 +99,15 @@ namespace AGVControl
Common.MoveToNode(agv, FullShelfStationPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (Common.CheckIsInAirDoor(agvPlace))
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "在4C风淋门内,先过风淋门";
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))//4C车间
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR);
......@@ -132,6 +142,15 @@ namespace AGVControl
Common.MoveToNode(agv, FullShelfStationPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if(Common.CheckIsInAirDoor(agvPlace))
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "在4C风淋门内,先过风淋门";
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))//4C车间
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR);
......@@ -147,6 +166,20 @@ namespace AGVControl
}
}
else if (GoFullShelfStationStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_AIR_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR);
runInfo = "过风淋门,向4D门运行,再到双层线入料口" + FullShelfStationPlace;
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
Common.MoveToNode(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (GoFullShelfStationStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
......@@ -268,17 +301,12 @@ namespace AGVControl
runInfo = FullShelfStationPlace + "满料架进入小车完成";
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
//if (FullShelfDestInfo.location.StartsWith("G"))
//{
// return new SendFullShelfToLineJob(FullShelfDestInfo, true);
//}
//else
return new SendFullShelfToLineJob(FullShelfDestInfo);
}
else if (GoFullShelfStationStep.IsTimeOut(60000, out double timeOutValue))
{
//链条停止
runInfo= "满料架在[" + FullShelfStationPlace + "]进入小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架进入小车的情况";
runInfo = "满料架在[" + FullShelfStationPlace + "]进入小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架进入小车的情况";
//msg +=runInfo;
//GoFullShelfStationStep.Msg = msg;
}
......@@ -303,6 +331,10 @@ namespace AGVControl
/// </summary>
WAIT_CHECK_RESULT,
/// <summary>
/// 等待到达4C风淋门
/// </summary>
WAIT_AGV_REACH_AIR_DOOR,
/// <summary>
/// 等待AGV到达门
/// </summary>
WAIT_AGV_REACH_DOOR,
......
......@@ -60,16 +60,17 @@ namespace AGVControl
string msg = agv.Name + " ";
bool rtn = false;
agv.RFID = RFID;
agv.Msg = runInfo;
agv.Msg = "送满料任务:"+runInfo;
//runInfo = "送满料任务:";
//if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st))
// CurTaskState = st;
if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.NONE))
{
AGVManager.AgvRemoveRfid(RFID);
if (FullShelfPlace.StartsWith(SettingString.C4_Name_Prefix))
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_DOOR);
runInfo = "满料架前往4C门,从双层线A6送往[" + FullShelfPlace + "][RFID=" + RFID + "]";
runInfo = "前往4C门,从双层线A6送往[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorDToC);
......@@ -78,7 +79,7 @@ namespace AGVControl
else
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
runInfo = "满料架从双层线A6送往[" + FullShelfPlace + "][RFID=" + RFID + "]";
runInfo = "从双层线A6送往[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
Common.MoveToNode(agv, FullShelfPlace);
......@@ -86,7 +87,6 @@ namespace AGVControl
}
}
else if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
......@@ -103,14 +103,39 @@ namespace AGVControl
}
else
{
if(Common.CheckIsInAirDoor(FullShelfPlace))
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "到达4C门,过风淋门[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirIn);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
runInfo = "从双层线A6送往[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
Common.MoveToNode(agv, FullShelfPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
}
}
else if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_AIR_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorAirIn, CurTaskState))
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
runInfo = "满料架从双层线A6送往[" + FullShelfPlace + "][RFID=" + RFID + "]";
runInfo = "送往[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
Common.MoveToNode(agv, FullShelfPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_REACH_TEMP_PLACE))
......@@ -120,13 +145,25 @@ namespace AGVControl
{
if (!Common.Check4CTarget(agv, FullShelfPlace))//未占用
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
runInfo = "满料架从临时待机位送往[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
Common.DeleteStandyInfo(agv);
Common.MoveToNode(agv, FullShelfPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
if (Common.CheckIsInAirDoor(FullShelfPlace))
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "到临时待机位,去产线先过风淋门[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirIn);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
runInfo = "从临时待机位送往[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
Common.DeleteStandyInfo(agv);
Common.MoveToNode(agv, FullShelfPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
}
}
......@@ -226,7 +263,7 @@ namespace AGVControl
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckEnterOrLeaveFinished(agv, "Leave", CurTaskState))
{
runInfo = "满料进入" + FullShelfPlace + "完成 [RFID=" + RFID + "] [" + agv.BoxDestInfo + "]";
runInfo = "满料进入" + FullShelfPlace + "完成 [RFID=" + RFID + "] [" + agv.BoxDestInfo + "]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
agv.RFID = "";
......@@ -237,7 +274,7 @@ namespace AGVControl
else if (SendFullShelfStep.IsTimeOut(60000, out double timeOutValue))
{
//链条停止
runInfo = "满料在[" + FullShelfPlace + "]离开小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架离开小车的情况";
runInfo = "满料在[" + FullShelfPlace + "]离开小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架离开小车的情况";
//msg += runInfo;
//SendFullShelfStep.Msg = msg;
}
......@@ -270,6 +307,10 @@ namespace AGVControl
/// </summary>
WAIT_REACH_TEMP_PLACE,
/// <summary>
/// 等待到达4C风淋门
/// </summary>
WAIT_AGV_REACH_AIR_DOOR,
/// <summary>
/// 等待小车到达目的地
/// </summary>
WAIT_AGV_REACH_LINE,
......
......@@ -32,11 +32,6 @@ namespace AGVControl
}
/// <summary>
/// 小车名称
/// </summary>
public string AgvName { set; get; }
/// <summary>
/// 线体名(佳世达)
/// </summary>
public string LineName { set; get; }
......@@ -54,24 +49,20 @@ namespace AGVControl
/// 节点位置坐标
/// </summary>
public PositionStru position;
/// <summary>
/// 空料架数量
/// 料架数量信息
/// </summary>
public int EmptyShelfCnt
public int EmptyShelfCnt
{
get { return _EmptyShelfCnt; }
set
get
{
EmptyShelfCnt = _EmptyShelfCnt;
}
if(Common.missionManager !=null && Common.missionManager.GetUnlockInfo(Name) !=null)
{
return Common.missionManager.GetUnlockCnt(Name);
}
return 0;
}
}
/// <summary>
/// 空架子的RFID
/// </summary>
public List<string> EmptyShelfRFIDs;
private int _EmptyShelfCnt = 0;
public string AliceName { get; set; }
/// <summary>
/// 客户端节点
......@@ -79,21 +70,18 @@ namespace AGVControl
/// <param name="name"></param>
/// <param name="ip"></param>
/// <param name="isUse"></param>
public ClientNode(string name, string ip, string aliceName,string lineName, string pos_name, string pos_guid, bool isUse,int emptyCnt) : base(name, ip, isUse)
public ClientNode(string name, string ip, string aliceName, string lineName, string pos_name, string pos_guid, bool isUse, int emptyCnt) : base(name, ip, isUse)
{
AliceName = aliceName;
RFID = rfid;
AgvName = "";
Online = false;
IsUse = isUse;
_EmptyShelfCnt = emptyCnt;
this.Pos_name = pos_name;
this.Pos_guid = pos_guid;
LineName = lineName;
EmptyShelfRFIDs = new List<string>();
}
public string WarnMsg { get; set; } = "";
/// <summary>
/// 客户端节点
/// </summary>
......@@ -106,41 +94,8 @@ namespace AGVControl
RFID = rfid;
nodeStatus = status;
AgvName = "";
}
/// <summary>
///空料架数量增加,如果RFID相同,不增加数量
/// </summary>
public void IncreEmptyShelfCnt(string rfid="")
{
if(!rfid.Equals("") && !EmptyShelfRFIDs.Contains(rfid))
{
System.Threading.Interlocked.Increment(ref _EmptyShelfCnt);
EmptyShelfRFIDs.Add(rfid);
Common.WriteIni(Name, SettingString.EmptyShelfCnt,_EmptyShelfCnt.ToString());
}
else if(rfid.Equals(""))
{
System.Threading.Interlocked.Increment(ref _EmptyShelfCnt);
Common.WriteIni(Name, SettingString.EmptyShelfCnt, _EmptyShelfCnt.ToString());
}
}
/// <summary>
/// 空料架数量减少1
/// </summary>
public void DecreEmptyShelfCnt()
{
if (_EmptyShelfCnt > 0)
{
System.Threading.Interlocked.Decrement(ref _EmptyShelfCnt);
Common.WriteIni(Name, SettingString.EmptyShelfCnt, _EmptyShelfCnt.ToString());
}
if(_EmptyShelfCnt.Equals(0) && EmptyShelfRFIDs.Count>0)
{
EmptyShelfRFIDs.Clear();
}
}
/// <summary>
/// 节点状态的文本形式
/// </summary>
......@@ -163,11 +118,11 @@ namespace AGVControl
s[3] = nodeStatus.ToString();
s[4] = ClientLevel.ToString();
s[5] = RFID;
// s[5] = AgvName;
// s[5] = AgvName;
// }
s[6] = Online ? "在线" : "离线";
s[7] = IsUse ? "是" : "否";
// s[8] = "清除";
// s[8] = "清除";
return s;
}
......@@ -178,7 +133,6 @@ namespace AGVControl
{
RFID = "00";
nodeStatus = eNodeStatus.None;
AgvName = "";
Online = false;
}
......
......@@ -30,19 +30,17 @@ namespace AGVControl
return null;
//执行空料架任务的小车数量
int emptyJobCnt = 0;
string rfid = "";
foreach (Agv_Info agv in Common.agvInfo)
{
if (!SettingString.C4_AGV_IPs.Contains(agv.IP))
continue;
if (agv.CurJob is GoEmptyShelfLineJob || agv.CurJob is EmptyShelfBackJob)
if (agv.CurJob is GoEmptyShelfLineJob || (agv.CurJob is EmptyShelfBackJob))
{
emptyJobCnt++;
}
}
if ((SettingString.AGVCNT - emptyJobCnt).Equals(2))//保留2辆小车出满料架
{
return null;
}
//出工单料的目的地是否有空料架
if (Common.FindEmptyShelfBeforeSendFullShelf(out string nodeName))
{
......@@ -60,7 +58,8 @@ namespace AGVControl
}
if (cnt < clientNode.EmptyShelfCnt)
{
return new GoEmptyShelfLineJob(currentAgv.Place, nodeName);
if (Common.CheckStationState(clientNode, out rfid) && CanEmptyTask(emptyJobCnt))
return new GoEmptyShelfLineJob(currentAgv.Place, nodeName, rfid);
}
}
......@@ -73,7 +72,11 @@ namespace AGVControl
{
int i = Common.agvInfo.FindIndex(s => s.CurJob is GoEmptyShelfLineJob && ((GoEmptyShelfLineJob)s.CurJob).EmptyShelfPlace.Equals(emptyNodeName));
if (i == -1)
return new GoEmptyShelfLineJob(currentAgv.Place, emptyNodeName);
{
ClientNode clientNode = Common.nodeInfo.Find(s => s.Name.Equals(emptyNodeName));
if (Common.CheckStationState(clientNode, out rfid) && CanEmptyTask(emptyJobCnt))
return new GoEmptyShelfLineJob(currentAgv.Place, emptyNodeName, rfid);
}
}
}
......@@ -83,13 +86,43 @@ namespace AGVControl
if (SettingString.C4_AGV_IPs.Contains(currentAgv.IP))
{
ClientNode node = Common.nodeInfo.Find(s => s.Name.Equals(SettingString.A6)
&& (s.StateEquals(eNodeStatus.NeedLeave) || s.StateEquals(eNodeStatus.NeedEnterLeave)) && !s.RFID.Equals("00"));
if (node != null && node.Name.Equals(SettingString.A6))
{
if (AGVManager.FindFullShelfTarget(node.RFID, out AGVManager.BoxDestInfo boxDestInfo))
{
if (boxDestInfo != null)
{
ClientNode clientNode = Common.nodeInfo.Find(s => s.Name.Equals(boxDestInfo.location));
if (!Common.CheckStationState(clientNode))
{
return null;
}
}
}
}
int i = Common.agvInfo.FindIndex(s => s.CurJob is GoFullShelfStationJob && !s.IP.Equals(currentAgv.IP));
if (i == -1)
return new GoFullShelfStationJob(currentAgv.Place);
if (i == -1)
return new GoFullShelfStationJob(currentAgv.Place);
}
}
return null;
}
/// <summary>
/// 控制出空架小车数量
/// </summary>
/// <param name="emptytASKAGV"></param>
/// <returns></returns>
private bool CanEmptyTask(int emptytASKAGV)
{
if ((SettingString.AGVCNT / 2 - emptytASKAGV).Equals(2))//保留1辆小车出满料架
{
return false;
}
return true;
}
}
}
......@@ -33,19 +33,16 @@ namespace AGVControl
return null;
//执行空料架任务的小车数量
int emptyJobCnt = 0;
string rfid = "";
foreach (Agv_Info agv in Common.agvInfo)
{
if (SettingString.C4_AGV_IPs.Contains(agv.IP))
continue;
if (agv.CurJob is GoEmptyShelfLineJob || agv.CurJob is EmptyShelfBackJob)
if (agv.CurJob is GoEmptyShelfLineJob || agv.CurJob is EmptyShelfBackJob)//
{
emptyJobCnt++;
}
}
if ((SettingString.AGVCNT / 2 - emptyJobCnt).Equals(1))//保留1辆小车出满料架
{
return null;
}
//出工单料的目的地是否有空料架
if (Common.FindEmptyShelfBeforeSendFullShelf(out string nodeName))
{
......@@ -65,7 +62,9 @@ namespace AGVControl
}
if (cnt < clientNode.EmptyShelfCnt)
{
return new GoEmptyShelfLineJob(currentAgv.Place, nodeName);
if (Common.CheckStationState(clientNode, out rfid) && CanEmptyTask(emptyJobCnt))
return new GoEmptyShelfLineJob(currentAgv.Place, nodeName, rfid);
}
}
......@@ -77,7 +76,11 @@ namespace AGVControl
{
int i = Common.agvInfo.FindIndex(s => s.CurJob is GoEmptyShelfLineJob && ((GoEmptyShelfLineJob)s.CurJob).EmptyShelfPlace.Equals(emptyNodeName));
if (i == -1)
return new GoEmptyShelfLineJob(currentAgv.Place, emptyNodeName);
{
ClientNode clientNode = Common.nodeInfo.Find(s => s.Name.Equals(emptyNodeName));
if (Common.CheckStationState(clientNode, out rfid) && CanEmptyTask(emptyJobCnt))
return new GoEmptyShelfLineJob(currentAgv.Place, emptyNodeName, rfid);
}
}
}
......@@ -100,6 +103,11 @@ namespace AGVControl
{
if (boxDestInfo != null)
{
ClientNode clientNode = Common.nodeInfo.Find(s => s.Name.Equals(boxDestInfo.location));
if (!Common.CheckStationState(clientNode))
{
return null;
}
i = Common.agvInfo.FindIndex(s => s.CurJob is SendFullShelfToLineJob && !s.IP.Equals(currentAgv.IP)
&& ((SendFullShelfToLineJob)s.CurJob).FullShelfPlace.Equals(boxDestInfo.location));
if (i > -1)
......@@ -114,5 +122,18 @@ namespace AGVControl
return null;
}
/// <summary>
/// 控制出空架小车数量
/// </summary>
/// <param name="emptytASKAGV"></param>
/// <returns></returns>
private bool CanEmptyTask(int emptytASKAGV)
{
if ((SettingString.AGVCNT / 2 - emptytASKAGV).Equals(1))//保留1辆小车出满料架
{
return false;
}
return true;
}
}
}
......@@ -18,13 +18,17 @@
</layout>
</appender>
<appender name="LineWebService" type="log4net.Appender.RollingFileAppender">
<file value="logs/LineWebService.log"/>
<file value="logs/UnlockInfo.log"/>
<param name="Encoding" value="UTF-8"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<datePattern value="yyyy-MM-dd"/>
<param name="MaxSizeRollBackups" value="10" />
<!-- 切割最多文件数 -->
<param name="MaximumFileSize" value="100MB" />
<!-- 每个文件的大小 -->
<param name="RollingStyle" value="Size" />
<param name="StaticLogFileName" value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%date][%t][%c:%L]%-5p %m%n"/>
<conversionPattern value="[%date]%-5p %m%n"/>
</layout>
</appender>
<logger name ="LineWebService">
......@@ -43,7 +47,8 @@
<add key="FLEET" value="10.85.199.3" />
<add key="AutoCharge" value="True" />
<add key="ChargeWait" value="1" />
<add key="ChargeThreshold" value="20,70" />
<add key="ChargeThreshold" value="20,90" />
<add key="IP_4D_Light" value="10.85.196.40:8088" />
<add key="IP_4C_Light" value="10.85.197.40:8088" />
</appSettings>
</configuration>
\ No newline at end of file
......@@ -15,8 +15,8 @@ D12,D12,10.85.199.183,4D-12,DL12,d6e0b92a-b432-11ea-a1a5-00012999830e
D14,D14,10.85.199.184,4D-14线,DL14,efb04c55-b432-11ea-a1a5-00012999830e
D15,D15,10.85.199.185,4D-15线,DL15,fd6b1f95-b432-11ea-a1a5-00012999830e
D16,D16,10.85.199.96,4D-16线,line_16,ac6c413e-895e-11ea-9374-000129922ca6
FeederIn,FeederIn,10.85.199.1,4D-FeedeerIn,FI,1e546c3a-8abe-11ea-ab63-000129922ca6
FeederOut,FeederOut,10.85.199.1,4D-FeederOut,FO,431649a4-8abe-11ea-ab63-000129922ca6
FeederIn,D21,10.85.199.1,4D-FeedeerIn,FI,1e546c3a-8abe-11ea-ab63-000129922ca6
FeederOut,D22,10.85.199.1,4D-FeederOut,FO,431649a4-8abe-11ea-ab63-000129922ca6
C1,C1,10.85.199.50,4C-1线,G1,d402fbc2-cdac-11ea-a3e4-94c691a7387d
C2,C2,10.85.199.51,4C-2线,G2,ce0d60e9-cdac-11ea-a3e4-94c691a7387d
C3,C3,10.85.199.52,4C-3线,G3,c768170a-cdac-11ea-a3e4-94c691a7387d
......@@ -29,5 +29,5 @@ C9,C9,10.85.199.62,4C-9,G9,a64bdbbb-cdac-11ea-a3e4-94c691a7387d
C10,C10,10.85.199.59,4C-10线,G10,604b1c3c-ca4e-11ea-810b-00012999830e
C14,C14,10.85.199.60,4C-14线,G14,07841fc6-d0d4-11ea-a3e4-94c691a7387d
C15,C15,10.85.199.61,4C-15线,G15,0efca2c6-d0d4-11ea-a3e4-94c691a7387d
4CFeederIn,4CFeederIn,10.85.199.1,4C-FeederIn,G21,cb7f117b-ca88-11ea-9b28-0001299981d4
4CFeederOut,4CFeederOut,10.85.199.1,4C-FeederOut,G22,0fcf606c-d417-11ea-9b6b-0001299981d4
4CFeederIn,C21,10.85.199.1,4C-FeederIn,G21,cb7f117b-ca88-11ea-9b28-0001299981d4
4CFeederOut,C22,10.85.199.1,4C-FeederOut,G22,0fcf606c-d417-11ea-9b6b-0001299981d4
2020-11-03 14:08:42,D1
2020-11-03 14:10:26,D1
2020-11-03 14:12:43,D1
2020-11-03 14:20:20,D1
2020-11-03 14:22:26,D1
2020-11-03 14:22:31,D1
2020-11-03 14:22:37,D1
2020-11-03 14:22:48,D1
2020-11-03 14:22:59,D1
{"NodeUnlockMissions":{"D1":{"NodeName":"D1","EmptyCnt":0,"Rfids":{}},"D2":{"NodeName":"D2","EmptyCnt":1,"Rfids":{"D4":"2020/12/06/11:51:42,731"}},"D3":{"NodeName":"D3","EmptyCnt":1,"Rfids":{"D3":"2020/12/05/22:50:48,047"}},"D4":{"NodeName":"D4","EmptyCnt":0,"Rfids":{}},"D5":{"NodeName":"D5","EmptyCnt":0,"Rfids":{}},"D6":{"NodeName":"D6","EmptyCnt":0,"Rfids":{}},"D8":{"NodeName":"D8","EmptyCnt":0,"Rfids":{}},"D9":{"NodeName":"D9","EmptyCnt":0,"Rfids":{}},"D10":{"NodeName":"D10","EmptyCnt":0,"Rfids":{}},"D11":{"NodeName":"D11","EmptyCnt":0,"Rfids":{}},"D12":{"NodeName":"D12","EmptyCnt":0,"Rfids":{}},"D14":{"NodeName":"D14","EmptyCnt":0,"Rfids":{}},"D15":{"NodeName":"D15","EmptyCnt":0,"Rfids":{}},"D16":{"NodeName":"D16","EmptyCnt":0,"Rfids":{}},"D22":{"NodeName":"D22","EmptyCnt":0,"Rfids":{}},"C1":{"NodeName":"C1","EmptyCnt":0,"Rfids":{}},"C2":{"NodeName":"C2","EmptyCnt":0,"Rfids":{}},"C3":{"NodeName":"C3","EmptyCnt":0,"Rfids":{}},"C4":{"NodeName":"C4","EmptyCnt":0,"Rfids":{}},"C5":{"NodeName":"C5","EmptyCnt":0,"Rfids":{}},"C6":{"NodeName":"C6","EmptyCnt":0,"Rfids":{}},"C7":{"NodeName":"C7","EmptyCnt":0,"Rfids":{}},"C8":{"NodeName":"C8","EmptyCnt":0,"Rfids":{}},"C9":{"NodeName":"C9","EmptyCnt":0,"Rfids":{}},"C10":{"NodeName":"C10","EmptyCnt":0,"Rfids":{}},"C14":{"NodeName":"C14","EmptyCnt":0,"Rfids":{}},"C15":{"NodeName":"C15","EmptyCnt":0,"Rfids":{}},"C22":{"NodeName":"C22","EmptyCnt":0,"Rfids":{}}}}
[D3]
EmptyShelfCnt=1
[MiR_R1763]
RFID=
[MiR_R1764]
......@@ -10,5 +12,5 @@ RFID=
RFID=
[MiR_R1580]
RFID=
[D1]
EmptyShelfCnt=9
[D2]
EmptyShelfCnt=1
ce147cdc7d5f84ac5eea7abfb5866dce563042b6
c1dcc8c90bc02014bb2dcb74bc1a4ab9d348762e
......@@ -70,5 +70,5 @@ E:\Neotel\Projects\Gitee\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLi
E:\Neotel\Projects\Gitee\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.csproj.CopyComplete
E:\Neotel\Projects\Gitee\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.exe
E:\Neotel\Projects\Gitee\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.pdb
E:\Neotel\Projects\Gitee\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.csprojAssemblyReference.cache
C:\myproject\Gitee\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.csprojAssemblyReference.cache
E:\Neotel\Projects\Gitee\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.csprojAssemblyReference.cache
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!