|
@@ -47,7 +47,7 @@ func GetSingleLicenseInfoController(c *gin.Context) {
|
|
|
LicUniqueID := c.DefaultQuery("LicUniqueID", "10")
|
|
|
|
|
|
//获取指定的license信息
|
|
|
- applications, total, err := models.GetOALicenseInfo(page, pageSize, "", LicUniqueID, "", "")
|
|
|
+ applications, total, err := models.GetOALicenseInfo(page, pageSize, "", LicUniqueID, "", 0)
|
|
|
if err != nil {
|
|
|
global.Logger.Errorln("指定UniqueID查询错误:", err.Error())
|
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("指定UniqueID查询错误: ", err.Error())})
|
|
@@ -63,78 +63,6 @@ func GetSingleLicenseInfoController(c *gin.Context) {
|
|
|
|
|
|
}
|
|
|
|
|
|
-// func GetAllLicenseInfoControllerToDb(c *gin.Context) {
|
|
|
-
|
|
|
-// // userInfo, err := getLoginInfo(c)
|
|
|
-// // if err != nil {
|
|
|
-// // c.JSON(http.StatusUnauthorized, gin.H{"error": "用户信息不存在"})
|
|
|
-// // c.Abort()
|
|
|
-// // }
|
|
|
-
|
|
|
-// //获取请求参数
|
|
|
-// page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
|
|
-// pageSize, _ := strconv.Atoi(c.DefaultQuery("pageSize", "10"))
|
|
|
-// //获取指定的license信息
|
|
|
-// applications, total, err := models.GetOALicenseInfo(page, pageSize, "read_all_license", "", "", "")
|
|
|
-// if err != nil {
|
|
|
-// global.Logger.Errorln("read_all_license查询错误:", err.Error())
|
|
|
-// c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("read_all_license查询错误: ", err.Error())})
|
|
|
-// return
|
|
|
-// }
|
|
|
-
|
|
|
-// var datas []api.AllLicenseInfoResponse
|
|
|
-// for _, v := range *applications {
|
|
|
-
|
|
|
-// data := api.AllLicenseInfoResponse{
|
|
|
-
|
|
|
-// UniqueID: utils.ToString(v.LicInfo.UniqueID),
|
|
|
-// OARequestID: utils.ToInt64(v.LicInfo.OARequestID),
|
|
|
-// OARequestName: utils.ToString(v.LicInfo.OARequestName),
|
|
|
-// OARequestNameNew: utils.ToString(v.LicInfo.OARequestNameNew),
|
|
|
-// OARequestNameHTMLNew: utils.ToString(v.LicInfo.OARequestNameHTMLNew),
|
|
|
-// OAGLXMId: utils.ToInt64(v.LicInfo.OAGLXMID),
|
|
|
-// OAGLXMName: utils.ToString(v.LicInfo.OAGLXMName),
|
|
|
-// OASQSJ: utils.ToTimeString(v.LicInfo.OASQSJ),
|
|
|
-// OASalespersonName: utils.ToString(v.LicInfo.OASalespersonName),
|
|
|
-// OAXSJSYX: utils.ToString(v.LicInfo.OAXSJSYX),
|
|
|
-// OAOperationsPersonName: utils.ToString(v.LicInfo.OAOperationsPersonName),
|
|
|
-// OAJFJSYX: utils.ToString(v.LicInfo.OAJFJSYX),
|
|
|
-// OASYDW: utils.ToString(v.LicInfo.OASYDW),
|
|
|
-// OAXMXXMS: utils.ToString(v.LicInfo.OAXMXXMS),
|
|
|
-// OAJDS: utils.ToInt64(v.LicInfo.OAJDS),
|
|
|
-// OANodeCount: utils.ToInt64(v.LicInfo.OANodeCount),
|
|
|
-// OAProductCode: utils.ToString(v.LicInfo.OAProductCode),
|
|
|
-// OAProductName: utils.ToString(v.LicInfo.OAProductName),
|
|
|
-// OAProductVersion: utils.ToString(v.LicInfo.OAProductVersion),
|
|
|
-// OACPU: utils.ToString(v.LicInfo.OACPU),
|
|
|
-// OAOperatingSystem: utils.ToString(v.LicInfo.OAOperatingSystem),
|
|
|
-// OAMainMAC: utils.ToString(v.LicInfo.OAMainMAC),
|
|
|
-// OASecondMAC: utils.ToString(v.LicInfo.OASecondMAC),
|
|
|
-// OACreationDate: utils.ToString(v.LicInfo.OACreationDate),
|
|
|
-// OACreationTime: utils.ToString(v.LicInfo.OACreationTime),
|
|
|
-// OALastOperateDate: utils.ToString(v.LicInfo.OALastOperateDate),
|
|
|
-// OALastOperateTime: utils.ToString(v.LicInfo.OALastOperateTime),
|
|
|
-// CaptureTime: utils.ToTimeString(v.LicInfo.CaptureTime),
|
|
|
-// DelTime: utils.ToTimeString(v.LicInfo.DelTime),
|
|
|
-// LastOperateTime: utils.ToTimeString(v.LicInfo.LastOperateTime),
|
|
|
-
|
|
|
-// LicenseUniqueID: utils.ToString(v.GenrateInfo.LicenseUniqueID),
|
|
|
-// LicenseFlage: utils.ToString(v.GenrateInfo.LicenseFlage),
|
|
|
-// Lic1: utils.ToString(v.GenrateInfo.Lic1),
|
|
|
-// Lic2: utils.ToString(v.GenrateInfo.Lic2),
|
|
|
-// CreatorGenerate: utils.ToTimeString(v.GenrateInfo.CreatorGenerate),
|
|
|
-// }
|
|
|
-// datas = append(datas, data)
|
|
|
-// }
|
|
|
-
|
|
|
-// c.JSON(http.StatusOK, gin.H{
|
|
|
-// "data": datas,
|
|
|
-// "page": page,
|
|
|
-// "pageSize": pageSize,
|
|
|
-// "total": total,
|
|
|
-// })
|
|
|
-// }
|
|
|
-
|
|
|
func GetAllLicenseInfoController(c *gin.Context) {
|
|
|
//获取请求参数
|
|
|
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
|
@@ -153,7 +81,7 @@ func GetAllLicenseInfoController(c *gin.Context) {
|
|
|
// 初始化存储 `OARequestID` 相同的 `ApiLicenseInfoTemp` 列表的 map
|
|
|
oaRequestIDMap := make(map[int64][]api.AllLicenseInfoResponse)
|
|
|
if userInfo.Permission[middlewares.ReadAllLicense] == middlewares.ReadAllLicense {
|
|
|
- datas1, total, err := models.GetOALicenseInfo(pageSize, page, "read_all_license", "", "", "")
|
|
|
+ datas1, total, err := models.GetOALicenseInfo(pageSize, page, "read_all_license", "", "", 0)
|
|
|
if err != nil {
|
|
|
global.Logger.Errorln("error", err.Error())
|
|
|
c.JSON(http.StatusNotFound, gin.H{"error": err.Error()})
|
|
@@ -208,7 +136,7 @@ func GetAllLicenseInfoController(c *gin.Context) {
|
|
|
}
|
|
|
|
|
|
} else if userInfo.Permission[middlewares.ReadLicense] == middlewares.ReadLicense {
|
|
|
- datas1, total, err := models.GetOALicenseInfo(pageSize, page, "", "", userInfo.UniqueID, "")
|
|
|
+ datas1, total, err := models.GetOALicenseInfo(pageSize, page, "", "", userInfo.UniqueID, 0)
|
|
|
if err != nil {
|
|
|
global.Logger.Errorln("error", err.Error())
|
|
|
c.JSON(http.StatusNotFound, gin.H{"error": err.Error()})
|
|
@@ -261,56 +189,6 @@ func GetAllLicenseInfoController(c *gin.Context) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- //获取指定的license缓存信息
|
|
|
- //data, err := global.LicCache.GetPaginatedData(page, pageSize)
|
|
|
-
|
|
|
- //返回[][]data 的方式
|
|
|
- // var datas [][]api.AllLicenseInfoResponse
|
|
|
- // for _, lic := range data {
|
|
|
- // var dataTemp []api.AllLicenseInfoResponse
|
|
|
- // for _, v := range lic {
|
|
|
- // data := api.AllLicenseInfoResponse{
|
|
|
- // UniqueID: v.UniqueID.String,
|
|
|
- // OARequestID: v.OARequestID.Int64,
|
|
|
- // OARequestName: utils.ToString(v.OARequestName),
|
|
|
- // OARequestNameNew: utils.ToString(v.OARequestNameNew),
|
|
|
- // OARequestNameHTMLNew: utils.ToString(v.OARequestNameHTMLNew),
|
|
|
- // OAGLXMId: utils.ToInt64(v.OAGLXMId),
|
|
|
- // OAGLXMName: utils.ToString(v.OAGLXMName),
|
|
|
- // OASQSJ: utils.ToTimeString(v.OASQSJ),
|
|
|
- // OASalespersonName: utils.ToString(v.OASalespersonName),
|
|
|
- // OAXSJSYX: utils.ToString(v.OAXSJSYX),
|
|
|
- // OAOperationsPersonName: utils.ToString(v.OAOperationsPersonName),
|
|
|
- // OAJFJSYX: utils.ToString(v.OAJFJSYX),
|
|
|
- // OASYDW: utils.ToString(v.OASYDW),
|
|
|
- // OAXMXXMS: utils.ToString(v.OAXMXXMS),
|
|
|
- // OAJDS: utils.ToInt64(v.OAJDS),
|
|
|
- // OANodeCount: utils.ToInt64(v.OANodeCount),
|
|
|
- // OAProductCode: utils.ToString(v.OAProductCode),
|
|
|
- // OAProductName: utils.ToString(v.OAProductName),
|
|
|
- // OAProductVersion: utils.ToString(v.OAProductVersion),
|
|
|
- // OACPU: utils.ToString(v.OACPU),
|
|
|
- // OAOperatingSystem: utils.ToString(v.OAOperatingSystem),
|
|
|
- // OAMainMAC: utils.ToString(v.OAMainMAC),
|
|
|
- // OASecondMAC: utils.ToString(v.OASecondMAC),
|
|
|
- // OACreationDate: utils.ToString(v.OACreationDate),
|
|
|
- // OACreationTime: utils.ToString(v.OACreationTime),
|
|
|
- // OALastOperateDate: utils.ToString(v.OALastOperateDate),
|
|
|
- // OALastOperateTime: utils.ToString(v.OALastOperateTime),
|
|
|
- // CaptureTime: utils.ToTimeString(v.CaptureTime),
|
|
|
- // DelTime: utils.ToTimeString(v.DelTime),
|
|
|
- // LastOperateTime: utils.ToTimeString(v.LastOperateTime),
|
|
|
- // LicenseUniqueID: utils.ToString(v.LicenseUniqueID),
|
|
|
- // LicenseFlage: utils.ToString(v.LicenseFlage),
|
|
|
- // Lic1: utils.ToString(v.Lic1),
|
|
|
- // Lic2: utils.ToString(v.Lic2),
|
|
|
- // CreatorGenerate: utils.ToString(v.CreatorGenerate),
|
|
|
- // }
|
|
|
- // dataTemp = append(dataTemp, data)
|
|
|
- // }
|
|
|
- // datas = append(datas, dataTemp)
|
|
|
- // }
|
|
|
-
|
|
|
// 将 `oaRequestIDMap` 中的所有 `ApiLicenseInfoTemp` 列表添加到 `datas` 中
|
|
|
for _, apiLicenseInfoTemp := range oaRequestIDMap {
|
|
|
datas = append(datas, apiLicenseInfoTemp)
|
|
@@ -484,6 +362,73 @@ func GenerateOALicenseStrController(c *gin.Context) {
|
|
|
*/
|
|
|
func DistributeOALicenseController(c *gin.Context) {
|
|
|
|
|
|
+ // //判断是否发邮件
|
|
|
+ // //数据库查询license信息
|
|
|
+ // var request api.DistributeLicenseRequest
|
|
|
+ // if err := c.ShouldBindJSON(&request); err != nil {
|
|
|
+ // global.Logger.Errorln("license分发请求解析失败 %s", err.Error())
|
|
|
+ // c.JSON(400, gin.H{
|
|
|
+ // "error": fmt.Sprintf("license分发请求解析失败 %s", err.Error()),
|
|
|
+ // })
|
|
|
+ // return
|
|
|
+ // }
|
|
|
+
|
|
|
+ // EmailArray := strings.Split(request.Emails, ",")
|
|
|
+ // err, existUsers := services.DistributeOALicenseServices(request.OperatorUniqueID, request.OaRequestId, request.UserUniqueIDs, request.UserAccounts, request.UserNames, EmailArray)
|
|
|
+ // if err != nil {
|
|
|
+ // global.Logger.Errorln("license分发失败 %s", err.Error())
|
|
|
+ // c.JSON(400, gin.H{
|
|
|
+ // "error": fmt.Sprintf("license分发失败 %s", err.Error()),
|
|
|
+ // })
|
|
|
+ // return
|
|
|
+ // }
|
|
|
+ // if existUsers != nil {
|
|
|
+ // global.Logger.Errorf("license分发失败,以下用户已经分发过 %s")
|
|
|
+ // c.JSON(400, gin.H{
|
|
|
+ // "error": fmt.Sprintf("以下用户已经分发过 %s", existUsers),
|
|
|
+ // })
|
|
|
+ // return
|
|
|
+ // }
|
|
|
+
|
|
|
+ // c.JSON(http.StatusOK, gin.H{
|
|
|
+ // "success": true,
|
|
|
+ // "data": "分发成功!",
|
|
|
+ // })
|
|
|
+}
|
|
|
+
|
|
|
+func DistributeLicenseToUsersController(c *gin.Context) {
|
|
|
+ var request api.DistributeLicenseRequest
|
|
|
+ if err := c.ShouldBindJSON(&request); err != nil {
|
|
|
+ global.Logger.Errorln("license分发请求解析失败 %s", err.Error())
|
|
|
+ c.JSON(400, gin.H{
|
|
|
+ "error": fmt.Sprintf("license分发请求解析失败 %s", err.Error()),
|
|
|
+ })
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ err, existUsers := services.DistributeLicenseToUserServices(request.OperatorUniqueID, request.OaRequestId, request.UserUniqueIDs, request.UserAccounts, request.UserNames)
|
|
|
+ if err != nil {
|
|
|
+ global.Logger.Errorln("license分发失败 %s", err.Error())
|
|
|
+ c.JSON(400, gin.H{
|
|
|
+ "error": fmt.Sprintf("license分发失败 %s", err.Error()),
|
|
|
+ })
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if existUsers != nil {
|
|
|
+ global.Logger.Errorf("license分发失败,以下用户已经分发过 %s")
|
|
|
+ c.JSON(400, gin.H{
|
|
|
+ "error": fmt.Sprintf("以下用户已经分发过 %s", existUsers),
|
|
|
+ })
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ c.JSON(http.StatusOK, gin.H{
|
|
|
+ "success": true,
|
|
|
+ "data": "分发成功!",
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+func DistributeLicenseToEmailController(c *gin.Context) {
|
|
|
//判断是否发邮件
|
|
|
//数据库查询license信息
|
|
|
var request api.DistributeLicenseRequest
|
|
@@ -496,7 +441,7 @@ func DistributeOALicenseController(c *gin.Context) {
|
|
|
}
|
|
|
|
|
|
EmailArray := strings.Split(request.Emails, ",")
|
|
|
- err, existUsers := services.DistributeOALicenseServices(request.OperatorUniqueID, request.OaRequestId, request.UserUniqueIDs, request.UserAccounts, request.UserNames, EmailArray)
|
|
|
+ err, existUsers := services.DistributeLicenseToEmailServices(request.OperatorUniqueID, request.OaRequestId, request.UserUniqueIDs, request.UserAccounts, request.UserNames, EmailArray)
|
|
|
if err != nil {
|
|
|
global.Logger.Errorln("license分发失败 %s", err.Error())
|
|
|
c.JSON(400, gin.H{
|
|
@@ -665,9 +610,9 @@ func CaptureLicenseOnceToDb(c *gin.Context) {
|
|
|
func GetDistributeButtenCheckController(c *gin.Context) {
|
|
|
//获取oa申请单号
|
|
|
name := c.Query("oa_request_id")
|
|
|
-
|
|
|
+ oaRequestID, err := strconv.ParseInt(name, 10, 64)
|
|
|
//查询oa单号的每一行license信息
|
|
|
- err, isCheck := services.GetDistributeButtenCheckService(name)
|
|
|
+ err, isCheck := services.GetDistributeButtenCheckService(oaRequestID)
|
|
|
if err != nil {
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
|
"error": fmt.Sprintf("生成错误: ", err.Error()),
|
|
@@ -726,7 +671,7 @@ func ConditionalSearchController(c *gin.Context) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- licInfos, err := services.GetConditionalSearchService(request)
|
|
|
+ licInfos, _, err := services.GetConditionalSearchService(request)
|
|
|
if err != nil {
|
|
|
c.JSON(400, gin.H{
|
|
|
"error": errors.Errorf("查询失败: %s", err.Error()),
|
|
@@ -734,8 +679,90 @@ func ConditionalSearchController(c *gin.Context) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- c.JSON(http.StatusOK, gin.H{
|
|
|
- "success": true,
|
|
|
- "data": licInfos,
|
|
|
+ if ret, err := returnLicenseInfo(licInfos); err != nil {
|
|
|
+ c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintln("数据转换失败: ", err.Error())})
|
|
|
+ } else {
|
|
|
+ c.JSON(http.StatusOK, gin.H{
|
|
|
+ "success": true,
|
|
|
+ "data": ret,
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+func returnLicenseInfo(datas1 *[]models.OALicenseInfo) ([][]api.AllLicenseInfoResponse, error) {
|
|
|
+ // 初始化存储 `OARequestID` 相同的 `ApiLicenseInfoTemp` 列表的 map
|
|
|
+ oaRequestIDMap := make(map[int64][]api.AllLicenseInfoResponse)
|
|
|
+
|
|
|
+ for _, data := range *datas1 {
|
|
|
+ ApiLicenseInfo := api.AllLicenseInfoResponse{
|
|
|
+ UniqueID: utils.ToString(data.LicInfo.UniqueID),
|
|
|
+ OAId: utils.ToInt64(data.LicInfo.OAId),
|
|
|
+ OARequestID: utils.ToInt64(data.LicInfo.OARequestID),
|
|
|
+ OARequestName: utils.ToString(data.LicInfo.OARequestName),
|
|
|
+ OARequestNameNew: utils.ToString(data.LicInfo.OARequestNameNew),
|
|
|
+ OARequestNameHTMLNew: utils.ToString(data.LicInfo.OARequestNameHTMLNew),
|
|
|
+ OAGLXMId: utils.ToInt64(data.LicInfo.OAGLXMID),
|
|
|
+ OAGLXMName: utils.ToString(data.LicInfo.OAGLXMName),
|
|
|
+ OASQSJ: utils.ToString(data.LicInfo.OASQSJ),
|
|
|
+ OASalespersonName: utils.ToString(data.LicInfo.OASalespersonName),
|
|
|
+ OAXSJSYX: utils.ToString(data.LicInfo.OAXSJSYX),
|
|
|
+ OAOperationsPersonName: utils.ToString(data.LicInfo.OAOperationsPersonName),
|
|
|
+ OAJFJSYX: utils.ToString(data.LicInfo.OAJFJSYX),
|
|
|
+ OASYDW: utils.ToString(data.LicInfo.OASYDW),
|
|
|
+ OAXMXXMS: utils.ToString(data.LicInfo.OAXMXXMS),
|
|
|
+ OAJDS: utils.ToInt64(data.LicInfo.OAJDS),
|
|
|
+ OANodeCount: utils.ToInt64(data.LicInfo.OANodeCount),
|
|
|
+ OAProductCode: utils.ToString(data.LicInfo.OAProductCode),
|
|
|
+ OAProductName: utils.ToString(data.LicInfo.OAProductName),
|
|
|
+ OAProductVersion: utils.ToString(data.LicInfo.OAProductVersion),
|
|
|
+ OACPU: utils.ToString(data.LicInfo.OACPU),
|
|
|
+ OAOperatingSystem: utils.ToString(data.LicInfo.OAOperatingSystem),
|
|
|
+ OAMainMAC: utils.ToString(data.LicInfo.OAMainMAC),
|
|
|
+ OASecondMAC: utils.ToString(data.LicInfo.OASecondMAC),
|
|
|
+ OACreationDate: utils.ToString(data.LicInfo.OACreationDate),
|
|
|
+ OACreationTime: utils.ToString(data.LicInfo.OACreationTime),
|
|
|
+ OALastOperateDate: utils.ToString(data.LicInfo.OALastOperateDate),
|
|
|
+ OALastOperateTime: utils.ToString(data.LicInfo.OALastOperateTime),
|
|
|
+ CaptureTime: utils.ToTimeString(data.LicInfo.CaptureTime),
|
|
|
+ DelTime: utils.ToTimeString(data.LicInfo.DelTime),
|
|
|
+ LastOperateTime: utils.ToTimeString(data.LicInfo.LastOperateTime),
|
|
|
+ LicenseFlage: utils.ToString(data.GenrateInfo.LicenseFlage),
|
|
|
+ Lic1: utils.ToString(data.GenrateInfo.Lic1),
|
|
|
+ Lic2: utils.ToString(data.GenrateInfo.Lic2),
|
|
|
+ CreatorGenerate: utils.ToTimeString(data.GenrateInfo.CreatorGenerate),
|
|
|
+ }
|
|
|
+ // 将 `ApiLicenseInfo` 添加到 `OARequestID` 对应的数组中
|
|
|
+ oaRequestID := utils.ToInt64(data.LicInfo.OARequestID)
|
|
|
+ oaRequestIDMap[oaRequestID] = append(oaRequestIDMap[oaRequestID], ApiLicenseInfo)
|
|
|
+ }
|
|
|
+
|
|
|
+ var datas [][]api.AllLicenseInfoResponse
|
|
|
+ // 将 `oaRequestIDMap` 中的所有 `ApiLicenseInfoTemp` 列表添加到 `datas` 中
|
|
|
+ for _, apiLicenseInfoTemp := range oaRequestIDMap {
|
|
|
+ datas = append(datas, apiLicenseInfoTemp)
|
|
|
+ }
|
|
|
+ // 对 datas 的第一维进行排序
|
|
|
+ // sort.Slice(datas, func(i, j int) bool {
|
|
|
+ // // 假设你需要根据每个数组第一个元素的 OACreationDate 和 OACreationTime 来排序
|
|
|
+ // if datas[i][0].OACreationDate == datas[j][0].OACreationDate {
|
|
|
+
|
|
|
+ // return datas[i][0].OACreationTime > datas[j][0].OACreationTime
|
|
|
+ // }
|
|
|
+ // return datas[i][0].OACreationDate > datas[j][0].OACreationDate
|
|
|
+ // })
|
|
|
+ // 对 datas 的第一维进行排序
|
|
|
+ sort.Slice(datas, func(i, j int) bool {
|
|
|
+ // 先按 OACreationDate 和 OACreationTime 排序
|
|
|
+ if datas[i][0].OACreationDate == datas[j][0].OACreationDate {
|
|
|
+ if datas[i][0].OACreationTime == datas[j][0].OACreationTime {
|
|
|
+ // 如果 OACreationDate 和 OACreationTime 相同,则按 OARequestID 从大到小排序
|
|
|
+ return datas[i][0].OARequestID > datas[j][0].OARequestID
|
|
|
+ }
|
|
|
+ return datas[i][0].OACreationTime > datas[j][0].OACreationTime
|
|
|
+ }
|
|
|
+ return datas[i][0].OACreationDate > datas[j][0].OACreationDate
|
|
|
})
|
|
|
+
|
|
|
+ return datas, nil
|
|
|
}
|