예제 #1
0
        public HMETurnTable()
        {
            #region 设置 COMM Tag 组
            comm = new TS7GroupCOMM();
            comm.Equipment_Running_Mode.SetPosition(0, 0);
            comm.Domination_Status.SetPosition(0, 1);
            comm.PLC_Heart_Beat.SetPosition(0, 2);
            comm.Equipment_Power_On.SetPosition(0, 3);
            comm.Equipment_Fail.SetPosition(0, 4);
            comm.Tool_Fail.SetPosition(0, 5);
            comm.Cycle_Started.SetPosition(0, 6);
            comm.Equipment_Starvation.SetPosition(0, 7);
            comm.MES_Heart_Beat.SetPosition(1, 0);
            #endregion

            #region 设置 WIPStation Tag 组
            wipStation = new WIPStation()
            {
                Prefix = "01",
            };
            wipStation.WIP_Station_LeafID.DB_Offset = 2;
            wipStation.WIP_Code.DB_Offset           = 6;
            wipStation.WIP_ID_Type_Code.DB_Offset   = 26;
            wipStation.WIP_ID_Code.DB_Offset        = 28;

            wipStation.WIP_Move_In.SetPosition(108, 0);
            wipStation.Request_For_Poka_Yoke.SetPosition(108, 1);
            wipStation.Is_NG_WIP_Onto_Line_Station.SetPosition(108, 2);
            wipStation.Error_proofing_detection.SetPosition(108, 3);

            wipStation.Poka_Yoke_Result.DB_Offset     = 109;
            wipStation.Operation_Conclusion.DB_Offset = 110;
            #endregion
        }
        public static WIPStationInfo Mapper(WIPStation s)
        {
            WIPStationInfo d = Activator.CreateInstance <WIPStationInfo>();

            try
            {
                var Types = s.GetType();                           //获得类型
                var Typed = typeof(WIPStationInfo);
                foreach (PropertyInfo sp in Types.GetProperties()) //获得类型的属性字段
                {
                    foreach (PropertyInfo dp in Typed.GetProperties())
                    {
                        if (dp.Name == sp.Name && dp.CanWrite)          //判断属性名是否相同
                        {
                            dp.SetValue(d, sp.GetValue(s, null), null); //获得s对象属性的值复制给d对象的属性
                            break;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return(d);
        }
예제 #3
0
        private void btnSearch_Click(object sender, EventArgs e)
        {
            ilstBatchNo.Items.Clear();

            if (icboEquipment.SelectedItem == null)
            {
                return;
            }

            ImageComboBoxItem item = (ImageComboBoxItem)icboEquipment.SelectedItem;

            if (!(item.Value is WIPStation))
            {
                return;
            }

            WIPStation station = (WIPStation)item.Value;

            List <BatchByWorkday> batchNumbers =
                GetBatchNumbers(
                    station.T133LeafID,
                    edtPrdtDate.DateTime.ToString("yyyy-MM-dd"));

            foreach (BatchByWorkday batchNumber in batchNumbers)
            {
                ilstBatchNo.Items.Add(
                    new ImageListBoxItem()
                {
                    Description = batchNumber.BatchNumber,
                    Value       = batchNumber.Clone(),
                    ImageIndex  = -1,
                });
            }
        }
예제 #4
0
 private void lstEquipmentsSelectedIndexChanged(object sender, EventArgs e)
 {
     if (lstEquipments.SelectedItem != null &&
         lstEquipments.SelectedItem is WIPStation)
     {
         WIPStation station = lstEquipments.SelectedItem as WIPStation;
         GetProductingInfo(
             station.T107LeafID,
             station.T216LeafID,
             station.T133LeafID);
         if (infoSmeltProduct != null &&
             infoSmeltProduct.InProduction == 1)
         {
             GetOrders(infoSmeltProduct.BatchNumber);
         }
         else
         {
             EmptyPWONos();
         }
     }
     else
     {
         EmptyPWONos();
     }
 }
예제 #5
0
 public int IndexOf(WIPStation station)
 {
     for (int i = 0; i < _stations.Count; i++)
     {
         if (_stations[i].T107LeafID == station.T107LeafID)
         {
             return(i);
         }
     }
     return(-1);
 }
        private void CreateNewFurnacePage(WIPStation furnaceData)
        {
            XtraTabPage tabPage = new XtraTabPage();

            tabPage.Text = furnaceData.T107Name;
            tabPage.Name = furnaceData.T107Name;
            ucFurnace furnaceControl = new ucFurnace(furnaceData, _communityID, _sysLogID);

            furnaceControl.Dock = DockStyle.Fill;
            tabPage.Controls.Add(furnaceControl);
            this.tabPageControl.TabPages.Add(tabPage);
        }
예제 #7
0
        /// <summary>
        /// 根据 T107LeafID 从当面的工位列表中获取工位
        /// </summary>
        /// <param name="leafID"></param>
        /// <returns></returns>
        public WIPStation GetStationWithT107LeafID(int leafID)
        {
            WIPStation rlt = null;

            foreach (WIPStation station in _stations)
            {
                if (station.T107LeafID == leafID)
                {
                    rlt = station;
                    break;
                }
            }
            return(rlt);
        }
        private void cboWorkUnit_SelectedIndexChanged(object sender, EventArgs e)
        {
            ClearAll();

            if (cboWorkUnit.SelectedItem != null)
            {
                WIPStation station = cboWorkUnit.SelectedItem as WIPStation;
                GetBatchsFromEquipment(station);

                grdBatchNos.DataSource = batchs;
                grdvBatchNos.UpdateCurrentRow();
                grdvBatchNos.BestFitColumns();
            }

            RefreshCtrlInForm();
        }
예제 #9
0
        private int IndexOfOptionOne(WIPStation station, List <WIPStation> stations)
        {
            if (station == null || stations == null)
            {
                return(-1);
            }

            int rlt = -1;

            for (int i = 0; i < stations.Count; i++)
            {
                if (stations[i].T107LeafID == station.T107LeafID)
                {
                    rlt = i;
                    break;
                }
            }
            return(rlt);
        }
예제 #10
0
        private void frmSelectOptions_Load(object sender, EventArgs e)
        {
            string strProcedureName =
                string.Format(
                    "{0}.{1}",
                    className,
                    MethodBase.GetCurrentMethod().Name);

            WriteLog.Instance.WriteBeginSplitter(strProcedureName);
            try
            {
                if (AvailableWIPStations.Instance.Stations.Count <= 0)
                {
                    AvailableWIPStations.Instance.GetWIPStations(
                        IRAPUser.Instance.CommunityID,
                        IRAPUser.Instance.SysLogID);
                }

                WIPStation station = CurrentOptions.Instance.OptionOne;

                lstOptionOnes.DataSource    = AvailableWIPStations.Instance.Stations;
                lstOptionOnes.DisplayMember = "WIPStationName";
                lstOptionOnes.SelectedIndex =
                    IndexOfOptionOne(
                        station,
                        AvailableWIPStations.Instance.Stations);

                ShowCaption(CurrentOptions.Instance.OptionOne);
            }
            catch (Exception error)
            {
                XtraMessageBox.Show(
                    error.Message,
                    Text,
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
            }
            finally
            {
                WriteLog.Instance.WriteEndSplitter(strProcedureName);
            }
        }
예제 #11
0
        private void ShowCaption(WIPStation station)
        {
            if (station.IsWorkFlowNode)
            {
                switch (cultureName)
                {
                case "EN":
                    Text = "Please select A WORKFLOW NODE and A WORKFLOW";
                    splitContainerControl1.Panel1.Text = "Please select a WORKFLOW NODE:";
                    splitContainerControl1.Panel2.Text = "Please select a WORKFLOW:";
                    splitContainerControl2.Panel2.Text = "Search for the current workflow list based on the entered name or code";
                    break;

                default:
                    Text = "选择【工作流结点】和【工作流】";
                    splitContainerControl1.Panel1.Text = "请选择工作流结点:";
                    splitContainerControl1.Panel2.Text = "请选择工作流:";
                    splitContainerControl2.Panel2.Text = "根据输入的名称和代码在当前工作流列表中查找";
                    break;
                }
            }
            else
            {
                switch (cultureName)
                {
                case "EN":
                    Text = "Please select a WIP STATION and a PRODUCT";
                    splitContainerControl1.Panel1.Text = "Please select a WIP STATION:";
                    splitContainerControl1.Panel2.Text = "Please select a PRODUCT:";
                    splitContainerControl2.Panel2.Text = "Search for the current product list based on the entered name or code";
                    break;

                default:
                    Text = "选择【工位】和【产品】";
                    splitContainerControl1.Panel1.Text = "请选择工位:";
                    splitContainerControl1.Panel2.Text = "请选择产品:";
                    splitContainerControl2.Panel2.Text = "根据输入的名称和代码在当前产品列表中查找";
                    break;
                }
            }
        }
예제 #12
0
        private void GetBatchsFromEquipment(WIPStation station)
        {
            string strProcedureName =
                string.Format(
                    "{0}.{1}",
                    className,
                    MethodBase.GetCurrentMethod().Name);

            WriteLog.Instance.WriteBeginSplitter(strProcedureName);
            try
            {
                int    errCode = 0;
                string errText = "";

                batchs.Clear();
                IRAPMESClient.Instance.ufn_GetList_BatchByEquipment(
                    IRAPUser.Instance.CommunityID,
                    station.T133LeafID,
                    "IQ",
                    IRAPUser.Instance.SysLogID,
                    ref batchs,
                    out errCode,
                    out errText);
                WriteLog.Instance.Write(
                    string.Format("({0}){1}", errCode, errText),
                    strProcedureName);
                if (errCode != 0)
                {
                    XtraMessageBox.Show(
                        errText,
                        "",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error);
                }
            }
            finally
            {
                WriteLog.Instance.WriteEndSplitter(strProcedureName);
            }
        }
예제 #13
0
        private void lstOptionOnes_SelectedIndexChanged(object sender, EventArgs e)
        {
            lstOptionTwos.Items.Clear();
            if (lstOptionOnes.SelectedItem != null)
            {
                WIPStation station = lstOptionOnes.SelectedItem as WIPStation;

                try
                {
                    ShowCaption(station);

                    CurrentOptions.Instance.OptionOne = station.Clone();
                    //AvailableProducts.Instance.GetProducts(
                    //    IRAPUser.Instance.CommunityID,
                    //    IRAPUser.Instance.SysLogID,
                    //    station.T107LeafID,
                    //    station.IsWorkFlowNode);

                    lstOptionTwos.DataSource    = AvailableProducts.Instance.Products;
                    lstOptionTwos.DisplayMember = "ProductViaStationName";
                    lstOptionTwos.SelectedIndex =
                        AvailableProducts.Instance.IndexOf(
                            CurrentOptions.Instance.OptionTwo);
                }
                catch (Exception error)
                {
                    XtraMessageBox.Show(
                        error.Message,
                        Text,
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error);
                }
                finally
                {
                    Refresh();
                }
            }
        }
예제 #14
0
        public M0100()
        {
            #region COMM Tag 组
            comm = new TS7GroupCOMM();
            comm.Equipment_Running_Mode.SetPosition(0, 0);
            comm.Domination_Status.SetPosition(0, 1);
            comm.PLC_Heart_Beat.SetPosition(0, 2);
            comm.Equipment_Power_On.SetPosition(0, 3);
            comm.Equipment_Fail.SetPosition(0, 4);
            comm.Tool_Fail.SetPosition(0, 5);
            comm.Cycle_Started.SetPosition(0, 6);
            comm.Equipment_Starvation.SetPosition(0, 7);
            comm.MES_Heart_Beat.SetPosition(1, 0);
            #endregion

            #region WIPStation 组
            wipStation = new WIPStation()
            {
                Prefix = "01",
            };
            wipStation.WIP_Station_LeafID.DB_Offset = 100;
            wipStation.Product_Number.DB_Offset     = 104;
            wipStation.WIP_Code.DB_Offset           = 144;
            wipStation.WIP_ID_Type_Code.DB_Offset   = 164;
            wipStation.WIP_ID_Code.DB_Offset        = 166;

            wipStation.WIP_Move_In.SetPosition(246, 0);
            wipStation.Production_Start.SetPosition(246, 1);
            wipStation.Production_End.SetPosition(246, 2);
            wipStation.WIP_Move_Out.SetPosition(246, 3);
            wipStation.Change_Over_Start.SetPosition(246, 4);
            wipStation.Change_Over_End.SetPosition(246, 5);
            wipStation.Production_Pause.SetPosition(246, 6);
            wipStation.Production_Restart.SetPosition(246, 7);
            wipStation.Request_For_Poka_Yoke.SetPosition(247, 0);
            wipStation.Move_To_MRB_Operation.SetPosition(247, 1);
            wipStation.Request_For_Routing.SetPosition(247, 2);
            wipStation.Request_For_ID_Binding.SetPosition(247, 3);
            wipStation.Trigger_Equipment_Fail_Andon.SetPosition(247, 4);
            wipStation.Trigger_Quality_Problem_Andon.SetPosition(247, 5);
            wipStation.Stagnation_Warnning.SetPosition(247, 6);
            wipStation.Serial_Number_Request.SetPosition(247, 7);
            wipStation.Label_ELements_Request.SetPosition(248, 0);
            wipStation.Label_Print_Request.SetPosition(248, 1);
            wipStation.Label_Reprint_Request.SetPosition(248, 2);
            wipStation.Packing_Succeeded.SetPosition(248, 3);
            wipStation.Is_OK_WIP_Onto_Line_Station.SetPosition(248, 4);
            wipStation.Is_NG_WIP_Onto_Line_Station.SetPosition(248, 5);
            wipStation.Scheduled_Production_Down.SetPosition(248, 6);
            wipStation.Error_proofing_detection.SetPosition(248, 7);

            wipStation.Poka_Yoke_Result.DB_Offset     = 250;
            wipStation.Operation_Conclusion.DB_Offset = 251;
            #endregion

            #region WIPOntoLine
            wipOntoLine.WIP_Src_Code.DB_Offset = 300;
            wipOntoLine.WIP_ID_Code.DB_Offset  = 320;
            wipOntoLine.Container_Number_pallet_code.DB_Offset = 400;
            wipOntoLine.Number_of_Sub_WIPs.DB_Offset           = 408;
            wipOntoLine.WIP_Code_01.DB_Offset             = 410;
            wipOntoLine.WIP_ID_Type_Code_01.DB_Offset     = 430;
            wipOntoLine.WIP_ID_Code_01.DB_Offset          = 432;
            wipOntoLine.PWO_Number_01.DB_Offset           = 512;
            wipOntoLine.Product_number_01.DB_Offset       = 530;
            wipOntoLine.Sub_Container_Number_01.DB_Offset = 570;
            wipOntoLine.WIP_Quantity_01.DB_Offset         = 578;
            #endregion

            #region FEEDING
            feeding.Material_Track_ID.DB_Offset     = 600;
            feeding.Slot_Number.DB_Offset           = 680;
            feeding.Request_For_Poka_Yoke.DB_Offset = 686;
            feeding.Poka_Yoke_Result.DB_Offset      = 688;
            #endregion

            #region UNFEEDING
            unfeeding.Material_Track_ID.DB_Offset  = 700;
            unfeeding.Slot_Number.DB_Offset        = 780;
            unfeeding.Unfeeding_Quantity.DB_Offset = 786;
            unfeeding.Unfeeding_End.DB_Offset      = 790;
            #endregion

            #region IDBinding
            idbinding.Primary_WIP_Code.DB_Offset           = 800;
            idbinding.Product_Number.DB_Offset             = 820;
            idbinding.ID_Part_SN_Scanner_Code_01.DB_Offset = 860;
            idbinding.Part_Number_Feedback_01.DB_Offset    = 940;
            idbinding.Sequence_Number_01.DB_Offset         = 942;
            #endregion

            #region PROPERTY
            property.Tighten1_Result.DB_Offset            = 1000;
            property.Tighten1_PGNO.DB_Offset              = 1002;
            property.Tighten1_MinTorque.DB_Offset         = 1004;
            property.Tighten1_Torque.DB_Offset            = 1008;
            property.Tighten1_MaxTorque.DB_Offset         = 1012;
            property.Tighten1_MinAngle.DB_Offset          = 1016;
            property.Tighten1_Angle.DB_Offset             = 1020;
            property.Tighten1_MaxAngle.DB_Offset          = 1024;
            property.Tighten2_Result.DB_Offset            = 1028;
            property.Tighten2_PGNO.DB_Offset              = 1030;
            property.Tighten2_MinTorque.DB_Offset         = 1032;
            property.Tighten2_Torque.DB_Offset            = 1036;
            property.Tighten2_MaxTorque.DB_Offset         = 1040;
            property.Tighten2_MinAngle.DB_Offset          = 1044;
            property.Tighten2_Angle.DB_Offset             = 1048;
            property.Tighten2_MaxAngle.DB_Offset          = 1052;
            property.Tighten3_Result.DB_Offset            = 1056;
            property.Tighten3_PGNO.DB_Offset              = 1058;
            property.Tighten3_MinTorque.DB_Offset         = 1060;
            property.Tighten3_Torque.DB_Offset            = 1064;
            property.Tighten3_MaxTorque.DB_Offset         = 1068;
            property.Tighten3_MinAngle.DB_Offset          = 1072;
            property.Tighten3_Angle.DB_Offset             = 1076;
            property.Tighten3_MaxAngle.DB_Offset          = 1080;
            property.StationRecord_MachineCycle.DB_Offset = 1084;
            property.StationRecord_WorkerID.DB_Offset     = 1098;
            property.StationRecord_TrayNum.DB_Offset      = 1108;
            property.StationRecord_Time1.DB_Offset        = 1118;
            property.StationRecord_Time2.DB_Offset        = 1130;
            property.StationRecord_Time3.DB_Offset        = 1142;
            property.StationRecord_Time4.DB_Offset        = 1154;
            property.StationRecord_Time5.DB_Offset        = 1166;
            property.StationRecord_Time6.DB_Offset        = 1178;
            property.StationRecord_Time7.DB_Offset        = 1190;
            property.StationRecord_Time8.DB_Offset        = 1202;
            property.StationRecord_Time9.DB_Offset        = 1214;
            property.StationRecord_Time10.DB_Offset       = 1226;
            property.StationRecord_Time11.DB_Offset       = 1238;
            property.StationRecord_Time12.DB_Offset       = 1250;
            property.StationRecord_Time13.DB_Offset       = 1262;
            property.StationRecord_Time14.DB_Offset       = 1274;
            property.StationRecord_Time15.DB_Offset       = 1286;
            property.StationRecord_Check1.DB_Offset       = 1298;
            property.StationRecord_Check2.DB_Offset       = 1300;
            property.StationRecord_Check3.DB_Offset       = 1302;
            property.StationRecord_Check4.DB_Offset       = 1304;
            property.StationRecord_Check5.DB_Offset       = 1306;
            property.StationRecord_Check6.DB_Offset       = 1308;
            property.StationRecord_Check7.DB_Offset       = 1310;
            property.StationRecord_Check8.DB_Offset       = 1312;
            property.StationRecord_Check9.DB_Offset       = 1314;
            property.StationRecord_Check10.DB_Offset      = 1316;
            #endregion
        }
예제 #15
0
 public ucPrdtParams_Ionitriding(WIPStation station) : this()
 {
     stationInfo = station;
 }
예제 #16
0
        public HMEFlash()
        {
            #region COMM Tag 组
            comm = new TS7GroupCOMM();
            comm.Equipment_Running_Mode.SetPosition(0, 0);
            comm.Domination_Status.SetPosition(0, 1);
            comm.PLC_Heart_Beat.SetPosition(0, 2);
            comm.Equipment_Power_On.SetPosition(0, 3);
            comm.Equipment_Fail.SetPosition(0, 4);
            comm.Tool_Fail.SetPosition(0, 5);
            comm.Cycle_Started.SetPosition(0, 6);
            comm.Equipment_Starvation.SetPosition(0, 7);
            comm.MES_Heart_Beat.SetPosition(1, 0);
            #endregion

            #region WIPStation 组
            wipStation = new WIPStation()
            {
                Prefix = "01",
            };
            wipStation.WIP_Station_LeafID.DB_Offset = 2;
            wipStation.Product_Number.DB_Offset     = 6;
            wipStation.WIP_Code.DB_Offset           = 46;
            wipStation.WIP_ID_Type_Code.DB_Offset   = 66;
            wipStation.WIP_ID_Code.DB_Offset        = 68;

            wipStation.WIP_Move_In.SetPosition(148, 0);
            wipStation.Production_Start.SetPosition(148, 1);
            wipStation.Production_End.SetPosition(148, 2);
            wipStation.WIP_Move_Out.SetPosition(148, 3);
            wipStation.Change_Over_Start.SetPosition(148, 4);
            wipStation.Change_Over_End.SetPosition(148, 5);
            wipStation.Production_Pause.SetPosition(148, 6);
            wipStation.Production_Restart.SetPosition(148, 7);
            wipStation.Request_For_Poka_Yoke.SetPosition(149, 0);
            wipStation.Move_To_MRB_Operation.SetPosition(149, 1);
            wipStation.Request_For_Routing.SetPosition(149, 2);
            wipStation.Request_For_ID_Binding.SetPosition(149, 3);
            wipStation.Trigger_Equipment_Fail_Andon.SetPosition(149, 4);
            wipStation.Trigger_Quality_Problem_Andon.SetPosition(149, 5);
            wipStation.Stagnation_Warnning.SetPosition(149, 6);
            wipStation.Serial_Number_Request.SetPosition(149, 7);
            wipStation.Label_ELements_Request.SetPosition(150, 0);
            wipStation.Label_Print_Request.SetPosition(150, 1);
            wipStation.Label_Reprint_Request.SetPosition(150, 2);
            wipStation.Packing_Succeeded.SetPosition(150, 3);
            wipStation.Is_OK_WIP_Onto_Line_Station.SetPosition(150, 4);
            wipStation.Is_NG_WIP_Onto_Line_Station.SetPosition(150, 5);
            wipStation.Scheduled_Production_Down.SetPosition(150, 6);
            wipStation.Error_proofing_detection.SetPosition(150, 7);

            wipStation.Poka_Yoke_Result.DB_Offset     = 152;
            wipStation.Operation_Conclusion.DB_Offset = 153;
            #endregion

            #region Property Tag 组
            property = new TS7GroupProperty();
            property.Equipment_End_Definition.SetPosition(154, 0);
            #endregion

            #region Stagnation Tag 组
            stagnation = new TS7GroupStagnation();
            stagnation.Time_In_Seconds.DB_Offset = 156;
            stagnation.Threshold.DB_Offset       = 160;
            #endregion

            #region EquipmentFail Tag 组
            equipmentFail = new TS7GroupEquipmentFail();
            equipmentFail.Equipment_Failures_Group_1.DB_Offset = 162;
            equipmentFail.Equipment_Failures_Group_2.DB_Offset = 166;
            equipmentFail.Equipment_Failures_Group_3.DB_Offset = 170;
            equipmentFail.Equipment_Failures_Group_4.DB_Offset = 174;
            equipmentFail.Equipment_Failures_Group_5.DB_Offset = 178;
            equipmentFail.Equipment_Failures_Group_6.DB_Offset = 182;
            equipmentFail.Equipment_Failures_Group_7.DB_Offset = 186;
            equipmentFail.Equipment_Failures_Group_8.DB_Offset = 190;
            equipmentFail.Failure_Code.DB_Offset = 194;
            #endregion

            #region SafetyProblem Tag 组
            safetyProblem = new TS7GroupSafetyProblem();
            safetyProblem.Safety_Issue_Type.DB_Offset = 204;
            #endregion
        }
예제 #17
0
 public ucPrdtParams_Temper(WIPStation station) : this()
 {
     stationInfo = station;
 }
예제 #18
0
 public ucQualityInspecting_Furnace(WIPStation station) : this()
 {
     this.station = station;
 }
예제 #19
0
 public ucPrdtParams_Clean(WIPStation station, int t3LeafID) : this()
 {
     stationInfo   = station;
     this.t3LeafID = t3LeafID;
 }
예제 #20
0
 public ucPrdtParams_Furnace(WIPStation station) : this()
 {
     stationInfo = station;
 }
예제 #21
0
 public ucCasting(WIPStation station) : this()
 {
     this.station = station;
 }
예제 #22
0
 public frmMaterialPreparation(WIPStation stationInfo) : this()
 {
     this.stationInfo = stationInfo;
 }
 private void cboFurnaces_SelectedIndexChanged(object sender, EventArgs e)
 {
     _productionParam = cboFurnaces.SelectedItem as WIPStation;
     RefreshBatchNo();
 }