20230201_145_upperpc/InSituLaboratory/ViewModels/Pages/SequentialDistributionViewModel.cs

752 lines
30 KiB
C#
Raw Normal View History

2024-03-27 13:49:16 +00:00
using InSituLaboratory.Entities;
2024-04-09 08:17:44 +00:00
using InSituLaboratory.IService;
2024-03-27 13:49:16 +00:00
using InSituLaboratory.Models;
2024-04-09 08:17:44 +00:00
using InSituLaboratory.Service;
using Microsoft.EntityFrameworkCore.Query.Internal;
2024-03-27 13:49:16 +00:00
using Prism.Regions;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
2024-03-30 00:17:37 +00:00
using System.Collections.ObjectModel;
2024-03-27 13:49:16 +00:00
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace InSituLaboratory.ViewModels.Pages
{
public class SequentialDistributionViewModel : ViewModelBase
{
2024-04-09 08:17:44 +00:00
#region
public ObservableCollection<SysSequentialDetails> sysSequentialDetailsListS1 { get; set; } = new ObservableCollection<SysSequentialDetails>();
public ObservableCollection<SysSequentialDetails> sysSequentialDetailsListS2 { get; set; } = new ObservableCollection<SysSequentialDetails>();
public ObservableCollection<SysSequentialDetails> sysSequentialDetailsListS3 { get; set; } = new ObservableCollection<SysSequentialDetails>();
public ObservableCollection<SysSequentialDetails> sysSequentialDetailsListS4 { get; set; } = new ObservableCollection<SysSequentialDetails>();
public ObservableCollection<SysSequentialDetails> sysSequentialDetailsListS5 { get; set; } = new ObservableCollection<SysSequentialDetails>();
/// <summary>
/// 时序1 开始时间
/// </summary>
private DateTime? sequentialStartTime1;
public DateTime? SequentialStartTime1
{
get { return sequentialStartTime1; }
set { SetProperty(ref sequentialStartTime1, value); }
}
/// <summary>
/// 时序1 结束时间
/// </summary>
private DateTime? sequentialEndTime1;
public DateTime? SequentialEndTime1
{
get { return sequentialEndTime1; }
set { SetProperty(ref sequentialEndTime1, value); }
}
/// <summary>
/// 时序2 开始时间
/// </summary>
private DateTime? sequentialStartTime2;
public DateTime? SequentialStartTime2
{
get { return sequentialStartTime2; }
set { SetProperty(ref sequentialStartTime2, value); }
}
/// <summary>
/// 时序2 结束时间
/// </summary>
private DateTime? sequentialEndTime2;
public DateTime? SequentialEndTime2
{
get { return sequentialEndTime2; }
set { SetProperty(ref sequentialEndTime2, value); }
}
/// <summary>
/// 时序3 开始时间
/// </summary>
private DateTime? sequentialStartTime3;
public DateTime? SequentialStartTime3
{
get { return sequentialStartTime3; }
set { SetProperty(ref sequentialStartTime3, value); }
}
/// <summary>
/// 时序3 结束时间
/// </summary>
private DateTime? sequentialEndTime3;
public DateTime? SequentialEndTime3
{
get { return sequentialEndTime3; }
set { SetProperty(ref sequentialEndTime3, value); }
}
/// <summary>
/// 时序4 开始时间
/// </summary>
private DateTime? sequentialStartTime4;
public DateTime? SequentialStartTime4
{
get { return sequentialStartTime4; }
set { SetProperty(ref sequentialStartTime4, value); }
}
/// <summary>
/// 时序4 结束时间
/// </summary>
private DateTime? sequentialEndTime4;
public DateTime? SequentialEndTime4
{
get { return sequentialEndTime4; }
set { SetProperty(ref sequentialEndTime4, value); }
}
/// <summary>
/// 时序5 开始时间
/// </summary>
private DateTime? sequentialStartTime5;
public DateTime? SequentialStartTime5
{
get { return sequentialStartTime5; }
set { SetProperty(ref sequentialStartTime5, value); }
}
/// <summary>
/// 时序5 结束时间
/// </summary>
private DateTime? sequentialEndTime5;
public DateTime? SequentialEndTime5
{
get { return sequentialEndTime5; }
set { SetProperty(ref sequentialEndTime5, value); }
}
#endregion
2024-03-27 13:49:16 +00:00
IDialogService _dialogService;
2024-04-09 08:17:44 +00:00
ISysSequentialService _sysSequentialService;
public SequentialDistributionViewModel(IRegionManager regionManager, IDialogService dialogService, ISysSequentialService sysSequentialService) : base(regionManager)
2024-03-27 13:49:16 +00:00
{
this.PageTitle = "时序下发";
_dialogService = dialogService;
2024-04-09 08:17:44 +00:00
_sysSequentialService = sysSequentialService;
RefreshS1();
RefreshS2();
RefreshS3();
RefreshS4();
RefreshS5();
}
#region 1
public override void RefreshS1()
{
int num = 1;
SearchKey = "时序1";
sysSequentialDetailsListS1.Clear();
var list = _sysSequentialService.GetSequentials(SearchKey).ToList();
if (list.Count != 0)
{
var data = _sysSequentialService.GetSequentials(SearchKey).First();
var dataDetails = _sysSequentialService.GetSequentialDetails(data.Number).ToList();
foreach (var item in dataDetails)
{
SysSequentialDetails sysSequentialDetail = new SysSequentialDetails();
sysSequentialDetail.Number = item.Number;
sysSequentialDetail.DurationTime = item.DurationTime;
sysSequentialDetail.SensorID = item.SensorID;
2024-04-10 09:50:54 +00:00
sysSequentialDetail.WorkTime = item.WorkTime;
sysSequentialDetail.SequenceGroup = item.SequenceGroup;
2024-04-09 08:17:44 +00:00
sysSequentialDetail.CreateTime = item.CreateTime;
sysSequentialDetail.Sequential = item.Sequential;
sysSequentialDetail.SysSquentialID = item.SysSquentialID;
sysSequentialDetail.IsDelete = item.IsDelete;
sysSequentialDetail.num = num;
sysSequentialDetailsListS1.Add(sysSequentialDetail);
num++;
}
SequentialStartTime1 = data.StartTime;
SequentialEndTime1 = data.EndTime;
}
}
/// <summary>
/// 编辑或者新增
/// </summary>
/// <param name="model"></param>
public override void DoModifyS1(object model)
{
if (SequentialStartTime1 == null || SequentialEndTime1 == null)
{
MessageBox.Show("时序1:开始时间和结束时间不能为空!", "提示");
}
else
{
DateTime expirationDate = (DateTime)SequentialStartTime1;
DateTime expirationDate1 = (DateTime)SequentialEndTime1;
DateTime dateTime = DateTime.Now;
if (expirationDate < dateTime)
{
MessageBox.Show("时序1:开始时间不得早于当前时间!", "提示");
}
else if (expirationDate1 < dateTime)
{
MessageBox.Show("时序1:结束时间不得早于当前时间!", "提示");
}
else if (expirationDate >= expirationDate1)
{
MessageBox.Show("时序1:结束时间不得早于开始时间!", "提示");
}
else
{
DialogParameters ps = new DialogParameters();
ps.Add("model", model);
ps.Add("sequentialStartTime", SequentialStartTime1);
ps.Add("sequentialEndTime", SequentialEndTime1);
ps.Add("kind", "时序1");
_dialogService.ShowDialog("ModifySequentialView", ps, result =>
{
// 判断子窗口的返回状态如果OK刷新当前页面否则不管
if (result.Result == ButtonResult.OK)
{
this.RefreshS1();
}
});
}
}
}
/// <summary>
/// 删除
/// </summary>
/// <param name="model"></param>
public override void DoDeleteS1(object model)
{
try
{
if (MessageBox.Show("是否确定删除此项?", "提示", MessageBoxButton.YesNo) ==
MessageBoxResult.Yes)
{
// 软删除
var data = _sysSequentialService.Find<SysSequentialDetails>((model as SysSequentialDetails).Number);
data.IsDelete = 1;
_sysSequentialService.Update(data);
//查询删除后子表是否还存在时序配置
var list = _sysSequentialService.GetSequentialDetails(data.SysSquentialID).ToList();
//若子表不存在当前时序下配置信息,则删除对应的母表时序
if (list.Count() == 0)
{
var SysSequential = _sysSequentialService.Find<SysSequential>(data.SysSquentialID);
SysSequential.IsDelete = 1;
_sysSequentialService.Update(SysSequential);
}
///更新时序总表
var data1 = _sysSequentialService.Find<SysSequentialTotal>((model as SysSequentialDetails).Number);
data1.IsDelete = 1;
_sysSequentialService.Update(data1);
2024-04-09 08:17:44 +00:00
MessageBox.Show("删除完成!", "提示");
this.RefreshS1();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "提示");
}
}
#endregion
2024-03-27 13:49:16 +00:00
2024-04-09 08:17:44 +00:00
#region 2
public override void RefreshS2()
{
int num = 1;
SearchKey = "时序2";
sysSequentialDetailsListS2.Clear();
var list = _sysSequentialService.GetSequentials(SearchKey).ToList();
if (list.Count != 0)
{
var data = _sysSequentialService.GetSequentials(SearchKey).First();
var dataDetails = _sysSequentialService.GetSequentialDetails(data.Number).ToList();
foreach (var item in dataDetails)
{
SysSequentialDetails sysSequentialDetail = new SysSequentialDetails();
sysSequentialDetail.Number = item.Number;
sysSequentialDetail.DurationTime = item.DurationTime;
sysSequentialDetail.SensorID = item.SensorID;
sysSequentialDetail.WorkTime = item.WorkTime;
sysSequentialDetail.SequenceGroup = item.SequenceGroup;
2024-04-09 08:17:44 +00:00
sysSequentialDetail.CreateTime = item.CreateTime;
sysSequentialDetail.Sequential = item.Sequential;
sysSequentialDetail.SysSquentialID = item.SysSquentialID;
sysSequentialDetail.IsDelete = item.IsDelete;
sysSequentialDetail.num = num;
2024-03-30 00:17:37 +00:00
2024-04-09 08:17:44 +00:00
sysSequentialDetailsListS2.Add(sysSequentialDetail);
num++;
}
SequentialStartTime2 = data.StartTime;
SequentialEndTime2 = data.EndTime;
}
2024-03-27 13:49:16 +00:00
}
/// <summary>
/// 编辑或者新增
/// </summary>
/// <param name="model"></param>
2024-04-09 08:17:44 +00:00
public override void DoModifyS2(object model)
2024-03-27 13:49:16 +00:00
{
2024-04-09 08:17:44 +00:00
if (SequentialStartTime2 == null || SequentialEndTime2 == null)
{
MessageBox.Show("时序2:开始时间和结束时间不能为空!", "提示");
}
else
2024-03-27 13:49:16 +00:00
{
2024-04-09 08:17:44 +00:00
DateTime expirationDate = (DateTime)SequentialStartTime2;
DateTime expirationDate1 = (DateTime)SequentialEndTime2;
DateTime dateTime = DateTime.Now;
if (expirationDate < dateTime)
{
MessageBox.Show("时序2:开始时间不得早于当前时间!", "提示");
}
else if (expirationDate1 < dateTime)
{
MessageBox.Show("时序2:结束时间不得早于当前时间!", "提示");
}
else if (expirationDate >= expirationDate1)
2024-03-27 13:49:16 +00:00
{
2024-04-09 08:17:44 +00:00
MessageBox.Show("时序2:结束时间不得早于开始时间!", "提示");
2024-03-27 13:49:16 +00:00
}
2024-04-09 08:17:44 +00:00
else
{
DialogParameters ps = new DialogParameters();
ps.Add("model", model);
ps.Add("sequentialStartTime", SequentialStartTime2);
ps.Add("sequentialEndTime", SequentialEndTime2);
ps.Add("kind", "时序2");
_dialogService.ShowDialog("ModifySequentialView", ps, result =>
{
// 判断子窗口的返回状态如果OK刷新当前页面否则不管
if (result.Result == ButtonResult.OK)
{
this.RefreshS2();
}
});
}
}
2024-03-27 13:49:16 +00:00
}
/// <summary>
/// 删除
/// </summary>
/// <param name="model"></param>
2024-04-09 08:17:44 +00:00
public override void DoDeleteS2(object model)
2024-03-27 13:49:16 +00:00
{
try
{
if (MessageBox.Show("是否确定删除此项?", "提示", MessageBoxButton.YesNo) ==
MessageBoxResult.Yes)
{
2024-04-09 08:17:44 +00:00
// 软删除
var data = _sysSequentialService.Find<SysSequentialDetails>((model as SysSequentialDetails).Number);
data.IsDelete = 1;
_sysSequentialService.Update(data);
//查询删除后子表是否还存在时序配置
var list = _sysSequentialService.GetSequentialDetails(data.SysSquentialID).ToList();
//若子表不存在当前时序下配置信息,则删除对应的母表时序
if (list.Count() == 0)
{
var SysSequential = _sysSequentialService.Find<SysSequential>(data.SysSquentialID);
SysSequential.IsDelete = 1;
_sysSequentialService.Update(SysSequential);
}
2024-03-27 13:49:16 +00:00
MessageBox.Show("删除完成!", "提示");
2024-04-09 08:17:44 +00:00
this.RefreshS2();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "提示");
}
}
#endregion
2024-03-27 13:49:16 +00:00
2024-04-09 08:17:44 +00:00
#region 3
public override void RefreshS3()
{
int num = 1;
SearchKey = "时序3";
sysSequentialDetailsListS3.Clear();
var list = _sysSequentialService.GetSequentials(SearchKey).ToList();
if (list.Count != 0)
{
var data = _sysSequentialService.GetSequentials(SearchKey).First();
var dataDetails = _sysSequentialService.GetSequentialDetails(data.Number).ToList();
foreach (var item in dataDetails)
{
SysSequentialDetails sysSequentialDetail = new SysSequentialDetails();
sysSequentialDetail.Number = item.Number;
sysSequentialDetail.DurationTime = item.DurationTime;
sysSequentialDetail.SensorID = item.SensorID;
sysSequentialDetail.WorkTime = item.WorkTime;
sysSequentialDetail.SequenceGroup = item.SequenceGroup;
2024-04-09 08:17:44 +00:00
sysSequentialDetail.CreateTime = item.CreateTime;
sysSequentialDetail.Sequential = item.Sequential;
sysSequentialDetail.SysSquentialID = item.SysSquentialID;
sysSequentialDetail.IsDelete = item.IsDelete;
sysSequentialDetail.num = num;
sysSequentialDetailsListS3.Add(sysSequentialDetail);
num++;
}
SequentialStartTime3 = data.StartTime;
SequentialEndTime3 = data.EndTime;
}
}
/// <summary>
/// 编辑或者新增
/// </summary>
/// <param name="model"></param>
public override void DoModifyS3(object model)
{
if (SequentialStartTime3 == null || SequentialEndTime3 == null)
{
MessageBox.Show("时序3:开始时间和结束时间不能为空!", "提示");
}
else
{
DateTime expirationDate = (DateTime)SequentialStartTime3;
DateTime expirationDate1 = (DateTime)SequentialEndTime3;
DateTime dateTime = DateTime.Now;
if (expirationDate < dateTime)
{
MessageBox.Show("时序3:开始时间不得早于当前时间!", "提示");
}
else if (expirationDate1 < dateTime)
{
MessageBox.Show("时序3:结束时间不得早于当前时间!", "提示");
}
else if (expirationDate >= expirationDate1)
{
MessageBox.Show("时序3:结束时间不得早于开始时间!", "提示");
}
else
{
DialogParameters ps = new DialogParameters();
ps.Add("model", model);
ps.Add("sequentialStartTime", SequentialStartTime3);
ps.Add("sequentialEndTime", SequentialEndTime3);
ps.Add("kind", "时序3");
_dialogService.ShowDialog("ModifySequentialView", ps, result =>
{
// 判断子窗口的返回状态如果OK刷新当前页面否则不管
if (result.Result == ButtonResult.OK)
{
this.RefreshS3();
}
});
}
}
}
/// <summary>
/// 删除
/// </summary>
/// <param name="model"></param>
public override void DoDeleteS3(object model)
{
try
{
if (MessageBox.Show("是否确定删除此项?", "提示", MessageBoxButton.YesNo) ==
MessageBoxResult.Yes)
{
// 软删除
var data = _sysSequentialService.Find<SysSequentialDetails>((model as SysSequentialDetails).Number);
data.IsDelete = 1;
_sysSequentialService.Update(data);
//查询删除后子表是否还存在时序配置
var list = _sysSequentialService.GetSequentialDetails(data.SysSquentialID).ToList();
//若子表不存在当前时序下配置信息,则删除对应的母表时序
if (list.Count() == 0)
{
var SysSequential = _sysSequentialService.Find<SysSequential>(data.SysSquentialID);
SysSequential.IsDelete = 1;
_sysSequentialService.Update(SysSequential);
}
MessageBox.Show("删除完成!", "提示");
this.RefreshS3();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "提示");
}
}
#endregion
#region 4
public override void RefreshS4()
{
int num = 1;
SearchKey = "时序4";
sysSequentialDetailsListS4.Clear();
var list = _sysSequentialService.GetSequentials(SearchKey).ToList();
if (list.Count != 0)
{
var data = _sysSequentialService.GetSequentials(SearchKey).First();
var dataDetails = _sysSequentialService.GetSequentialDetails(data.Number).ToList();
foreach (var item in dataDetails)
{
SysSequentialDetails sysSequentialDetail = new SysSequentialDetails();
sysSequentialDetail.Number = item.Number;
sysSequentialDetail.DurationTime = item.DurationTime;
sysSequentialDetail.SensorID = item.SensorID;
sysSequentialDetail.WorkTime = item.WorkTime;
sysSequentialDetail.SequenceGroup = item.SequenceGroup;
2024-04-09 08:17:44 +00:00
sysSequentialDetail.CreateTime = item.CreateTime;
sysSequentialDetail.Sequential = item.Sequential;
sysSequentialDetail.SysSquentialID = item.SysSquentialID;
sysSequentialDetail.IsDelete = item.IsDelete;
sysSequentialDetail.num = num;
sysSequentialDetailsListS4.Add(sysSequentialDetail);
num++;
}
SequentialStartTime4 = data.StartTime;
SequentialEndTime4 = data.EndTime;
}
}
/// <summary>
/// 编辑或者新增
/// </summary>
/// <param name="model"></param>
public override void DoModifyS4(object model)
{
if (SequentialStartTime4 == null || SequentialEndTime4 == null)
{
MessageBox.Show("时序4:开始时间和结束时间不能为空!", "提示");
}
else
{
DateTime expirationDate = (DateTime)SequentialStartTime4;
DateTime expirationDate1 = (DateTime)SequentialEndTime4;
DateTime dateTime = DateTime.Now;
if (expirationDate < dateTime)
{
MessageBox.Show("时序4:开始时间不得早于当前时间!", "提示");
}
else if (expirationDate1 < dateTime)
{
MessageBox.Show("时序4:结束时间不得早于当前时间!", "提示");
}
else if (expirationDate >= expirationDate1)
{
MessageBox.Show("时序4:结束时间不得早于开始时间!", "提示");
}
else
{
DialogParameters ps = new DialogParameters();
ps.Add("model", model);
ps.Add("sequentialStartTime", SequentialStartTime4);
ps.Add("sequentialEndTime", SequentialEndTime4);
ps.Add("kind", "时序4");
_dialogService.ShowDialog("ModifySequentialView", ps, result =>
{
// 判断子窗口的返回状态如果OK刷新当前页面否则不管
if (result.Result == ButtonResult.OK)
{
this.RefreshS4();
}
});
}
}
}
/// <summary>
/// 删除
/// </summary>
/// <param name="model"></param>
public override void DoDeleteS4(object model)
{
try
{
if (MessageBox.Show("是否确定删除此项?", "提示", MessageBoxButton.YesNo) ==
MessageBoxResult.Yes)
{
// 软删除
var data = _sysSequentialService.Find<SysSequentialDetails>((model as SysSequentialDetails).Number);
data.IsDelete = 1;
_sysSequentialService.Update(data);
//查询删除后子表是否还存在时序配置
var list = _sysSequentialService.GetSequentialDetails(data.SysSquentialID).ToList();
//若子表不存在当前时序下配置信息,则删除对应的母表时序
if (list.Count() == 0)
{
var SysSequential = _sysSequentialService.Find<SysSequential>(data.SysSquentialID);
SysSequential.IsDelete = 1;
_sysSequentialService.Update(SysSequential);
}
MessageBox.Show("删除完成!", "提示");
this.RefreshS4();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "提示");
}
}
#endregion
#region 5
public override void RefreshS5()
{
int num = 1;
SearchKey = "时序5";
sysSequentialDetailsListS5.Clear();
var list = _sysSequentialService.GetSequentials(SearchKey).ToList();
if (list.Count != 0)
{
var data = _sysSequentialService.GetSequentials(SearchKey).First();
var dataDetails = _sysSequentialService.GetSequentialDetails(data.Number).ToList();
foreach (var item in dataDetails)
{
SysSequentialDetails sysSequentialDetail = new SysSequentialDetails();
sysSequentialDetail.Number = item.Number;
sysSequentialDetail.DurationTime = item.DurationTime;
sysSequentialDetail.SensorID = item.SensorID;
sysSequentialDetail.WorkTime = item.WorkTime;
sysSequentialDetail.SequenceGroup = item.SequenceGroup;
2024-04-09 08:17:44 +00:00
sysSequentialDetail.CreateTime = item.CreateTime;
sysSequentialDetail.Sequential = item.Sequential;
sysSequentialDetail.SysSquentialID = item.SysSquentialID;
sysSequentialDetail.IsDelete = item.IsDelete;
sysSequentialDetail.num = num;
sysSequentialDetailsListS5.Add(sysSequentialDetail);
num++;
}
SequentialStartTime5 = data.StartTime;
SequentialEndTime5 = data.EndTime;
}
}
/// <summary>
/// 编辑或者新增
/// </summary>
/// <param name="model"></param>
public override void DoModifyS5(object model)
{
if (SequentialStartTime5 == null || SequentialEndTime5 == null)
{
MessageBox.Show("时序5:开始时间和结束时间不能为空!", "提示");
}
else
{
DateTime expirationDate = (DateTime)SequentialStartTime5;
DateTime expirationDate1 = (DateTime)SequentialEndTime5;
DateTime dateTime = DateTime.Now;
if (expirationDate < dateTime)
{
MessageBox.Show("时序5:开始时间不得早于当前时间!", "提示");
}
else if (expirationDate1 < dateTime)
{
MessageBox.Show("时序5:结束时间不得早于当前时间!", "提示");
}
else if (expirationDate >= expirationDate1)
{
MessageBox.Show("时序5:结束时间不得早于开始时间!", "提示");
}
else
{
DialogParameters ps = new DialogParameters();
ps.Add("model", model);
ps.Add("sequentialStartTime", SequentialStartTime5);
ps.Add("sequentialEndTime", SequentialEndTime5);
ps.Add("kind", "时序5");
_dialogService.ShowDialog("ModifySequentialView", ps, result =>
{
// 判断子窗口的返回状态如果OK刷新当前页面否则不管
if (result.Result == ButtonResult.OK)
{
this.RefreshS5();
}
});
}
}
}
/// <summary>
/// 删除
/// </summary>
/// <param name="model"></param>
public override void DoDeleteS5(object model)
{
try
{
if (MessageBox.Show("是否确定删除此项?", "提示", MessageBoxButton.YesNo) ==
MessageBoxResult.Yes)
{
// 软删除
var data = _sysSequentialService.Find<SysSequentialDetails>((model as SysSequentialDetails).Number);
data.IsDelete = 1;
_sysSequentialService.Update(data);
//查询删除后子表是否还存在时序配置
var list = _sysSequentialService.GetSequentialDetails(data.SysSquentialID).ToList();
//若子表不存在当前时序下配置信息,则删除对应的母表时序
if (list.Count() == 0)
{
var SysSequential = _sysSequentialService.Find<SysSequential>(data.SysSquentialID);
SysSequential.IsDelete = 1;
_sysSequentialService.Update(SysSequential);
}
MessageBox.Show("删除完成!", "提示");
this.RefreshS5();
2024-03-27 13:49:16 +00:00
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "提示");
}
}
2024-04-09 08:17:44 +00:00
#endregion
2024-03-27 13:49:16 +00:00
}
}