diff --git a/.swagger/dict_data.json b/.swagger/dict_data.json index 304a935..d979433 100644 --- a/.swagger/dict_data.json +++ b/.swagger/dict_data.json @@ -822,6 +822,12 @@ "sort": 2, "status": "ACTIVE" }, + { + "value": "PENDING_SIGN", + "label": "\u5f85\u7b7e\u7f72", + "sort": 3, + "status": "ACTIVE" + }, { "value": "SIGNING", "label": "\u7b7e\u7f72\u4e2d", @@ -4171,6 +4177,18 @@ "category": "BUSINESS", "remark": "Room-level facilities", "items": [ + { + "value": "baby_bed", + "label": "\u5a74\u513f\u5e8a", + "sort": 1, + "status": "ACTIVE" + }, + { + "value": "wifi", + "label": "WiFi", + "sort": 1, + "status": "ACTIVE" + }, { "value": "wired_net", "label": "\u6709\u7ebf\u5bbd\u5e26", @@ -4196,15 +4214,9 @@ "status": "ACTIVE" }, { - "value": "baby_bed", - "label": "\u5a74\u513f\u5e8a", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "wifi", - "label": "WiFi", - "sort": 1, + "value": "mosquito_net", + "label": "\u7eb1\u7a97/\u868a\u5e10", + "sort": 2, "status": "ACTIVE" }, { @@ -4238,9 +4250,9 @@ "status": "ACTIVE" }, { - "value": "mosquito_net", - "label": "\u7eb1\u7a97/\u868a\u5e10", - "sort": 2, + "value": "heating", + "label": "\u6696\u6c14", + "sort": 3, "status": "ACTIVE" }, { @@ -4274,9 +4286,9 @@ "status": "ACTIVE" }, { - "value": "heating", - "label": "\u6696\u6c14", - "sort": 3, + "value": "charger", + "label": "\u624b\u673a\u5145\u7535\u5668", + "sort": 4, "status": "ACTIVE" }, { @@ -4309,12 +4321,6 @@ "sort": 4, "status": "ACTIVE" }, - { - "value": "charger", - "label": "\u624b\u673a\u5145\u7535\u5668", - "sort": 4, - "status": "ACTIVE" - }, { "value": "coffee", "label": "\u5496\u5561\u673a", @@ -4345,6 +4351,12 @@ "sort": 5, "status": "ACTIVE" }, + { + "value": "smart_toilet", + "label": "\u667a\u80fd\u9a6c\u6876", + "sort": 6, + "status": "ACTIVE" + }, { "value": "bathtub", "label": "\u6d74\u7f38", @@ -4369,12 +4381,6 @@ "sort": 6, "status": "ACTIVE" }, - { - "value": "smart_toilet", - "label": "\u667a\u80fd\u9a6c\u6876", - "sort": 6, - "status": "ACTIVE" - }, { "value": "balcony", "label": "\u9633\u53f0", diff --git a/changelogs/2026-03/2026-03-23_1607_9b7b524_fix_12.md b/changelogs/2026-03/2026-03-23_1607_9b7b524_fix_12.md new file mode 100644 index 0000000..ff300ce --- /dev/null +++ b/changelogs/2026-03/2026-03-23_1607_9b7b524_fix_12.md @@ -0,0 +1,407 @@ +# 接口变更记录 — 2026-03-23 16:07 + +> **提交** `9b7b524` · **作者** wx · **时间** 2026-03-23 16:07:31 +0800 +> +> fix: 订单全流程测试修复(12项) + +## 变更总览 + +- **合同服务** + - AdminContract (+1) + - 🆕 AdminContractScheme (+7 接口) +- **小程序聚合服务** + - MpOrder (+1) +- **订单服务** + - InternalMpOrder (+1) + +--- + +## 合同服务 + +### AdminContract + +> 📖 **接口文档**: [http://192.168.100.236:8095/doc.html](http://192.168.100.236:8095/doc.html) → 标签 **「合同管理」** + +### 🆕 `POST` /admin/contract/create-by-scheme — 按方案创建合同(简化) + +> 只需传orderId和schemeId,后端自动从订单获取出行人、日期、联系人等数据,结合合同方案配置创建合同。 + +**响应** `Result` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `supplementaryClause` | `String` | 补充约定内容 | +| `travelers` | `List` | 出行人列表 | +| `statusLogs` | `List` | 状态变更日志 | +| `travelerId` | `Long` | 出行人ID | +| `name` | `String` | 姓名 | +| `idCardType` | `String` | 证件类型 | +| `idCardNo` | `String` | 证件号码 | +| `phone` | `String` | 手机号 | +| `isSigner` | `Boolean` | 是否签署人 | +| `logId` | `Long` | 日志ID | +| `oldStatus` | `String` | 旧状态 | +| `newStatus` | `String` | 新状态 | +| `source` | `String` | 变更来源 | +| `createTime` | `LocalDateTime` | 创建时间 | + +### 🆕 新增: AdminContractScheme + +> 📖 **接口文档**: [http://192.168.100.236:8095/doc.html](http://192.168.100.236:8095/doc.html) → 标签 **「合同方案管理」** + +### 📌 `GET` /admin/contract/scheme/list — 查询启用的合同方案列表 + +> 供产品配置时下拉选择使用,只返回启用状态的方案 + +**响应** `Result>` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `schemeId` | `String` | 方案ID | +| `name` | `String` | 方案名称 | +| `description` | `String` | 方案描述 | +| `contractPlatform` | `String` | 合同平台: 12301/FADADA | +| `contractTemplateCode` | `String` | 合同模板编码(与模板列表的templateCode一致) | +| `templateCode` | `String` | 合同模板编码(别名,与contractTemplateCode相同值,方便前端统一使用templateCode) | +| `contractTemplateName` | `String` | 合同模板名称(回显用) | +| `contractMode` | `String` | 签约模式: STANDARD(电子签约)/SYNC(线下报备) | +| `signatoryMode` | `Integer` | 签署模式: 1=短信签署 2=现场签署 3=线下签署 | +| `agencyCode` | `String` | 旅行社编码 | +| `agencyName` | `String` | 旅行社名称(回显用) | +| `disputeResolution` | `Integer` | 争议解决方式: 1=仲裁 2=诉讼 | +| `supplementaryClause` | `String` | 补充条款 | +| `transactorName` | `String` | 经办人姓名 | +| `transactorPhone` | `String` | 经办人电话 | +| `sortOrder` | `Integer` | 排序 | +| `status` | `String` | 状态: ACTIVE/INACTIVE | +| `createTime` | `LocalDateTime` | 创建时间 | + +### 📌 `GET` /admin/contract/scheme/list-all — 查询全部合同方案列表 + +> 管理页面使用,包含停用的方案 + +**响应** `Result>` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `schemeId` | `String` | 方案ID | +| `name` | `String` | 方案名称 | +| `description` | `String` | 方案描述 | +| `contractPlatform` | `String` | 合同平台: 12301/FADADA | +| `contractTemplateCode` | `String` | 合同模板编码(与模板列表的templateCode一致) | +| `templateCode` | `String` | 合同模板编码(别名,与contractTemplateCode相同值,方便前端统一使用templateCode) | +| `contractTemplateName` | `String` | 合同模板名称(回显用) | +| `contractMode` | `String` | 签约模式: STANDARD(电子签约)/SYNC(线下报备) | +| `signatoryMode` | `Integer` | 签署模式: 1=短信签署 2=现场签署 3=线下签署 | +| `agencyCode` | `String` | 旅行社编码 | +| `agencyName` | `String` | 旅行社名称(回显用) | +| `disputeResolution` | `Integer` | 争议解决方式: 1=仲裁 2=诉讼 | +| `supplementaryClause` | `String` | 补充条款 | +| `transactorName` | `String` | 经办人姓名 | +| `transactorPhone` | `String` | 经办人电话 | +| `sortOrder` | `Integer` | 排序 | +| `status` | `String` | 状态: ACTIVE/INACTIVE | +| `createTime` | `LocalDateTime` | 创建时间 | + +### 📌 `GET` /admin/contract/scheme/{schemeId} — 获取合同方案详情 + +**参数** + + - `{schemeId}` (`Long`) — 路径参数 + +**响应** `Result` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `schemeId` | `String` | 方案ID | +| `name` | `String` | 方案名称 | +| `description` | `String` | 方案描述 | +| `contractPlatform` | `String` | 合同平台: 12301/FADADA | +| `contractTemplateCode` | `String` | 合同模板编码(与模板列表的templateCode一致) | +| `templateCode` | `String` | 合同模板编码(别名,与contractTemplateCode相同值,方便前端统一使用templateCode) | +| `contractTemplateName` | `String` | 合同模板名称(回显用) | +| `contractMode` | `String` | 签约模式: STANDARD(电子签约)/SYNC(线下报备) | +| `signatoryMode` | `Integer` | 签署模式: 1=短信签署 2=现场签署 3=线下签署 | +| `agencyCode` | `String` | 旅行社编码 | +| `agencyName` | `String` | 旅行社名称(回显用) | +| `disputeResolution` | `Integer` | 争议解决方式: 1=仲裁 2=诉讼 | +| `supplementaryClause` | `String` | 补充条款 | +| `transactorName` | `String` | 经办人姓名 | +| `transactorPhone` | `String` | 经办人电话 | +| `sortOrder` | `Integer` | 排序 | +| `status` | `String` | 状态: ACTIVE/INACTIVE | +| `createTime` | `LocalDateTime` | 创建时间 | + +### 📌 `POST` /admin/contract/scheme — 创建合同方案 + +**请求体** `ContractSchemeRequest` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `name` | `String` | 方案名称 | +| `description` | `String` | 方案描述 | +| `contractPlatform` | `String` | 合同平台: 12301/FADADA | +| `contractTemplateCode` | `String` | 合同模板编码 | +| `contractMode` | `String` | 签约模式: STANDARD(电子签约)/SYNC(线下报备) | +| `signatoryMode` | `Integer` | 签署模式: 1=短信签署 2=现场签署 3=线下签署 | +| `agencyCode` | `String` | 旅行社编码(可选,不填则根据订单支付商户号自动匹配旅行社) | +| `disputeResolution` | `Integer` | 争议解决方式: 1=仲裁 2=诉讼 | +| `supplementaryClause` | `String` | 补充条款(可选) | +| `transactorName` | `String` | 经办人姓名 | +| `transactorPhone` | `String` | 经办人电话 | +| `sortOrder` | `Integer` | 排序(越小越靠前) | + +**响应** `Result` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `schemeId` | `String` | 方案ID | +| `name` | `String` | 方案名称 | +| `description` | `String` | 方案描述 | +| `contractPlatform` | `String` | 合同平台: 12301/FADADA | +| `contractTemplateCode` | `String` | 合同模板编码(与模板列表的templateCode一致) | +| `templateCode` | `String` | 合同模板编码(别名,与contractTemplateCode相同值,方便前端统一使用templateCode) | +| `contractTemplateName` | `String` | 合同模板名称(回显用) | +| `contractMode` | `String` | 签约模式: STANDARD(电子签约)/SYNC(线下报备) | +| `signatoryMode` | `Integer` | 签署模式: 1=短信签署 2=现场签署 3=线下签署 | +| `agencyCode` | `String` | 旅行社编码 | +| `agencyName` | `String` | 旅行社名称(回显用) | +| `disputeResolution` | `Integer` | 争议解决方式: 1=仲裁 2=诉讼 | +| `supplementaryClause` | `String` | 补充条款 | +| `transactorName` | `String` | 经办人姓名 | +| `transactorPhone` | `String` | 经办人电话 | +| `sortOrder` | `Integer` | 排序 | +| `status` | `String` | 状态: ACTIVE/INACTIVE | +| `createTime` | `LocalDateTime` | 创建时间 | + +### 📌 `PUT` /admin/contract/scheme/{schemeId} — 更新合同方案 + +**参数** + + - `{schemeId}` (`Long`) — 路径参数 + +**请求体** `ContractSchemeRequest` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `name` | `String` | 方案名称 | +| `description` | `String` | 方案描述 | +| `contractPlatform` | `String` | 合同平台: 12301/FADADA | +| `contractTemplateCode` | `String` | 合同模板编码 | +| `contractMode` | `String` | 签约模式: STANDARD(电子签约)/SYNC(线下报备) | +| `signatoryMode` | `Integer` | 签署模式: 1=短信签署 2=现场签署 3=线下签署 | +| `agencyCode` | `String` | 旅行社编码(可选,不填则根据订单支付商户号自动匹配旅行社) | +| `disputeResolution` | `Integer` | 争议解决方式: 1=仲裁 2=诉讼 | +| `supplementaryClause` | `String` | 补充条款(可选) | +| `transactorName` | `String` | 经办人姓名 | +| `transactorPhone` | `String` | 经办人电话 | +| `sortOrder` | `Integer` | 排序(越小越靠前) | + +**响应** `Result` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `schemeId` | `String` | 方案ID | +| `name` | `String` | 方案名称 | +| `description` | `String` | 方案描述 | +| `contractPlatform` | `String` | 合同平台: 12301/FADADA | +| `contractTemplateCode` | `String` | 合同模板编码(与模板列表的templateCode一致) | +| `templateCode` | `String` | 合同模板编码(别名,与contractTemplateCode相同值,方便前端统一使用templateCode) | +| `contractTemplateName` | `String` | 合同模板名称(回显用) | +| `contractMode` | `String` | 签约模式: STANDARD(电子签约)/SYNC(线下报备) | +| `signatoryMode` | `Integer` | 签署模式: 1=短信签署 2=现场签署 3=线下签署 | +| `agencyCode` | `String` | 旅行社编码 | +| `agencyName` | `String` | 旅行社名称(回显用) | +| `disputeResolution` | `Integer` | 争议解决方式: 1=仲裁 2=诉讼 | +| `supplementaryClause` | `String` | 补充条款 | +| `transactorName` | `String` | 经办人姓名 | +| `transactorPhone` | `String` | 经办人电话 | +| `sortOrder` | `Integer` | 排序 | +| `status` | `String` | 状态: ACTIVE/INACTIVE | +| `createTime` | `LocalDateTime` | 创建时间 | + +### 📌 `PUT` /admin/contract/scheme/{schemeId}/toggle-status — 切换方案启用/停用状态 + +**参数** + + - `{schemeId}` (`Long`) — 路径参数 + +**响应** `Result` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `schemeId` | `String` | 方案ID | +| `name` | `String` | 方案名称 | +| `description` | `String` | 方案描述 | +| `contractPlatform` | `String` | 合同平台: 12301/FADADA | +| `contractTemplateCode` | `String` | 合同模板编码(与模板列表的templateCode一致) | +| `templateCode` | `String` | 合同模板编码(别名,与contractTemplateCode相同值,方便前端统一使用templateCode) | +| `contractTemplateName` | `String` | 合同模板名称(回显用) | +| `contractMode` | `String` | 签约模式: STANDARD(电子签约)/SYNC(线下报备) | +| `signatoryMode` | `Integer` | 签署模式: 1=短信签署 2=现场签署 3=线下签署 | +| `agencyCode` | `String` | 旅行社编码 | +| `agencyName` | `String` | 旅行社名称(回显用) | +| `disputeResolution` | `Integer` | 争议解决方式: 1=仲裁 2=诉讼 | +| `supplementaryClause` | `String` | 补充条款 | +| `transactorName` | `String` | 经办人姓名 | +| `transactorPhone` | `String` | 经办人电话 | +| `sortOrder` | `Integer` | 排序 | +| `status` | `String` | 状态: ACTIVE/INACTIVE | +| `createTime` | `LocalDateTime` | 创建时间 | + +### 📌 `DELETE` /admin/contract/scheme/{schemeId} — 删除合同方案 + +**参数** + + - `{schemeId}` (`Long`) — 路径参数 + +**响应** `Result` + +--- + +## 小程序聚合服务 + +### MpOrder + +> 📖 **接口文档**: [http://192.168.100.236:8086/doc.html](http://192.168.100.236:8086/doc.html) → 标签 **「C端 - 订单接口」** + +### 🆕 `PUT` /mp/order/{orderId}/remark — 添加/修改订单备注 + +> 用户在订单详情页添加或修改备注。备注对管理端可见。 +请求体:{"remark": "备注内容"} + +**参数** + + - `{orderId}` (`Long`) — 路径参数 + +**响应** `Result` + +--- + +## 订单服务 + +### InternalMpOrder + +> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 标签 **「【内部接口】小程序订单(Feign调用)」** + +### 🆕 `PUT` /internal/mp/order/{orderId}/remark — 添加/修改订单备注 + +> 用户在订单详情页添加或修改备注内容 + +**参数** + + - `{orderId}` (`Long`) — 路径参数 + - `userId` (`Long`) — 查询参数 + +**响应** `Result` + +--- + +## 📦 其他数据对象变更 + +> 以下变更未直接关联到本次接口变更,但可能影响现有接口的请求/响应 + +### 小程序聚合服务 + +#### ✏️ MpOrderDetailVO + + - 🆕 `hotelAssignmentDetails` (`List>`) — 酒店分配详情(按家庭分组,含封面图) + - ✏️ `hotelAssignments`: 说明 "酒店分配信息JSON" → "酒店分配信息JSON(原始数据)" + +### 订单服务 + +#### ✏️ AdminUpdateOrderRequest + + - 🆕 `customizerId` (`Long`) — 定制师ID(切换定制师) + +#### 🆕 HotelAssignmentVO + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `familyIndex` | `Integer` | 家庭序号(从1开始) | +| `familyLabel` | `String` | 家庭标签(如:家庭1、家庭2) | +| `days` | `List` | 每天的住宿分配列表 | +| `date` | `String` | 日期(yyyy-MM-dd) | +| `hotelId` | `Long` | 酒店ID | +| `hotelName` | `String` | 酒店名称 | +| `hotelCoverUrl` | `String` | 酒店封面图URL(从产品快照提取,可能为空) | +| `roomTypeId` | `Long` | 房型ID | +| `roomType` | `String` | 房型名称 | +| `roomTypeCoverUrl` | `String` | 房型封面图URL(从产品快照提取,可能为空) | +| `roomCount` | `Integer` | 房间数量 | +| `remark` | `String` | 备注 | + +#### ✏️ OrderDetailVO + + - 🆕 `productTypeLabel` (`String`) — 产品类型中文标签(CORE=核心产品, CUSTOM=私人定制, GROUP=小蒙马, ROUTE=路书产品) + - 🆕 `pendingUpgradeAmount` (`BigDecimal`) — 待确认差价总额(配房/配车升级未确认的差价) + - 🆕 `paymentModeLabel` (`String`) — 支付模式中文标签(DEPOSIT=定金+尾款, FULL=全款) + - 🆕 `hotelAssignmentDetails` (`List`) — 酒店分配详情(按家庭分组,含封面图) + - ✏️ `hotelAssignments`: 说明 "酒店分配信息JSON" → "酒店分配信息JSON(原始数据)" + +#### 🆕 SurchargeRequest + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `surchargeName` | `String` | 费用增加项名称 | +| `surchargeAmount` | `BigDecimal` | 费用增加金额 | + +#### ✏️ VehicleAssignmentRequest + + - ✏️ `vehicleBrand`: 说明 "品牌" → "品牌(选填,不传则从车型名称中提取)" + +
+📁 全部变更文件 (点击展开) + +``` +M hl-contract-service/src/main/java/com/hulalv/contract/config/ContractPlatformProperties.java +M hl-contract-service/src/main/java/com/hulalv/contract/constant/ContractConstants.java +M hl-contract-service/src/main/java/com/hulalv/contract/controller/AdminContractController.java +A hl-contract-service/src/main/java/com/hulalv/contract/controller/AdminContractSchemeController.java +A hl-contract-service/src/main/java/com/hulalv/contract/dto/ContractSchemeRequest.java +A hl-contract-service/src/main/java/com/hulalv/contract/entity/ContractScheme.java +M hl-contract-service/src/main/java/com/hulalv/contract/feign/OrderContractFeignClient.java +A hl-contract-service/src/main/java/com/hulalv/contract/job/ContractStatusRefreshJob.java +A hl-contract-service/src/main/java/com/hulalv/contract/mapper/ContractSchemeMapper.java +M hl-contract-service/src/main/java/com/hulalv/contract/platform/ContractApplyParam.java +M hl-contract-service/src/main/java/com/hulalv/contract/platform/ContractPlatform.java +M hl-contract-service/src/main/java/com/hulalv/contract/platform/fadada/FadadaContractPlatform.java +M hl-contract-service/src/main/java/com/hulalv/contract/platform/tourage/TourageApiClient.java +M hl-contract-service/src/main/java/com/hulalv/contract/platform/tourage/TourageContractPlatform.java +A hl-contract-service/src/main/java/com/hulalv/contract/service/ContractSchemeService.java +M hl-contract-service/src/main/java/com/hulalv/contract/service/ContractService.java +A hl-contract-service/src/main/java/com/hulalv/contract/vo/ContractSchemeVO.java +M hl-contract-service/src/test/java/com/hulalv/contract/platform/ContractPlatformFactoryTest.java +M hl-contract-service/src/test/java/com/hulalv/contract/platform/fadada/FadadaContractPlatformTest.java +M hl-contract-service/src/test/java/com/hulalv/contract/platform/tourage/TourageContractPlatformTest.java +M hl-contract-service/src/test/java/com/hulalv/contract/service/ContractServiceTest.java +M hl-insurance-service/src/main/java/com/hulalv/insurance/service/InsuranceOrderService.java +M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpOrderController.java +M hl-mp-service/src/main/java/com/hulalv/mp/feign/MpOrderFeignClient.java +M hl-mp-service/src/main/java/com/hulalv/mp/feign/MpOrderFeignFallbackFactory.java +M hl-mp-service/src/main/java/com/hulalv/mp/vo/MpOrderDetailVO.java +M hl-order-service/src/main/java/com/hulalv/order/constant/OrderConstants.java +M hl-order-service/src/main/java/com/hulalv/order/controller/AdminOrderController.java +M hl-order-service/src/main/java/com/hulalv/order/controller/InternalMpOrderController.java +M hl-order-service/src/main/java/com/hulalv/order/controller/InternalPaymentOrderController.java +M hl-order-service/src/main/java/com/hulalv/order/dto/AdminUpdateOrderRequest.java +A hl-order-service/src/main/java/com/hulalv/order/dto/SurchargeRequest.java +M hl-order-service/src/main/java/com/hulalv/order/dto/VehicleAssignmentRequest.java +A hl-order-service/src/main/java/com/hulalv/order/entity/OrderSurcharge.java +M hl-order-service/src/main/java/com/hulalv/order/entity/OrderTimeline.java +M hl-order-service/src/main/java/com/hulalv/order/entity/OrderTodo.java +M hl-order-service/src/main/java/com/hulalv/order/entity/OrderTraveler.java +M hl-order-service/src/main/java/com/hulalv/order/job/DepartureReminderJob.java +A hl-order-service/src/main/java/com/hulalv/order/mapper/OrderSurchargeMapper.java +M hl-order-service/src/main/java/com/hulalv/order/service/OrderCascadeService.java +M hl-order-service/src/main/java/com/hulalv/order/service/OrderItineraryEditService.java +M hl-order-service/src/main/java/com/hulalv/order/service/OrderPriceDiffService.java +M hl-order-service/src/main/java/com/hulalv/order/service/OrderService.java +A hl-order-service/src/main/java/com/hulalv/order/service/OrderSurchargeService.java +M hl-order-service/src/main/java/com/hulalv/order/service/OrderTodoService.java +A hl-order-service/src/main/java/com/hulalv/order/vo/HotelAssignmentVO.java +M hl-order-service/src/main/java/com/hulalv/order/vo/OrderDetailVO.java +A hl-product-service/src/main/java/com/hulalv/product/feign/InsuranceSchemeFallbackFactory.java +A hl-product-service/src/main/java/com/hulalv/product/feign/InsuranceSchemeFeignClient.java +``` +
\ No newline at end of file